Instant 対応 App Bundle を作成する

Google Play Instant 版アプリを作成する際は、Android App Bundle の一部として組み込みます。このようなバンドルのことを「Instant 対応 App Bundle」と呼びます。このドキュメントでは、Instant 対応 App Bundle 用の開発環境をセットアップする方法と、Instant 対応 App Bundle を設定、ビルド、テスト、公開する方法について説明します。

既存の Instant App プロジェクトが、サポートの終了した機能のプラグイン(com.android.feature)を使用している場合は、Android App Bundle に対応できるように Instant App に移行する方法を確認してください。

開発環境をセットアップする

App Bundle 内で Instant 版アプリを提供するには、Google Play Instant Development SDK にアクセスする必要があります。SDK をインストールするには、次のいずれかの方法を使用します。

  • Android Studio 3.6 以降をインストールします。Android Studio を開いた後、SDK Manager の [SDK Tools] タブから Google Play Instant Development SDK をダウンロードします。
  • コマンドラインからインストールします。

    cd path/to/android/sdk/tools/bin && \
      ./sdkmanager 'extras;google;instantapps'
    

また、ローカルで Instant 版アプリをテストする場合は、物理デバイスまたは仮想デバイスを用意します。

必須の実行条件について

Google Play Instant は、特別なタイプの SELinux サンドボックス内で Instant 対応 App Bundle を実行することで、セキュリティを強化しています。このサンドボックスでは、権限のサブセットを使用できるほか、他のアプリとの限られた種類のやり取りも行えます。以降のセクションでは、このサンドボックスの特性について詳しく説明します。

サポートされる権限とオペレーション

Instant 対応 App Bundle で使用できる権限は、以下のリストのものに限られます。

サポートされない一般的な権限の処理

アプリから削除する必要があるサポートされない一般的な権限のリストと、それぞれについて推奨される移行パスを次に示します。

  • ACCESS_WIFI_STATE: ACCESS_NETWORK_STATE を使用します。ACCESS_WIFI_STATE と同様の情報が提供されます。
  • BILLING: この権限のサポートは終了しました。Google Play Billing Library を使用してください。これにより、com.android.vending.BILLING 権限は不要になります。
  • READ/WRITE_EXTERNAL_STORAGE: Instant Apps は外部ストレージにアクセスできません。代わりに内部ストレージを使用してください。
  • com.google.android.c2dm.permission.RECEIVEpermission.C2D_MESSAGE: C2DM のサポートは終了しました。Firebase Cloud Messaging(FCM)に移行してください。FCM では、追加の権限は必要ありません。

なお、Instant 対応 App Bundle では次の操作が行えません。

インストール済みのアプリにアクセスする

以下のいずれかを満たさない限り、Instant 版アプリはデバイスにインストール済みのアプリとやり取りできません。開発する際は、この点に注意してください。

  • インストール済みアプリ内の 1 つまたは複数のアクティビティで android:visibleToInstantApps 要素が true に設定されている(この要素は Android 8.0(API レベル 26)以降で実行されているアプリで利用可能です)。
  • インストール済みアプリに CATEGORY_BROWSABLE を含むインテント フィルタが含まれている。
  • Instant 版が ACTION_SENDACTION_SENDTOACTION_SEND_MULTIPLE のいずれかのアクションを使用してインテントを送信している。

Instant 版アプリ向けにプロジェクトを設定する

Google Play Instant に対応するには、Instant 対応 App Bundle を慎重に設定する必要があります。以下のセクションでは、その注意事項について説明します。

プロジェクトの依存関係を宣言する

アプリで Google Play Instant API を使用するには、アプリ モジュールの build.gradle 構成ファイルに次の宣言を含めます。

implementation "com.google.android.gms:play-services-instantapps:17.0.0"

正しいバージョン コードを定義する

Instant 版アプリのバージョン コードは、インストール版アプリのバージョン コードより小さくする必要があります。これは、Google Play Instant 版を使用した後、アプリをデバイスにダウンロードしてインストールすることを、ユーザーに期待しているためです。Android フレームワークは、この移行をアプリのアップデートと見なします。

バージョニング スキームを確実にユーザーの想定と合致させるには、次のいずれかの方法を使用します。

  • Google Play Instant 版のバージョン コードを 1 から再開します。
  • インストール版 APK のバージョン コードを大きな数値の単位(たとえば 1,000 単位)で増加するように設定して、Instant 版のバージョン番号を増やすための余地を確保します。

Instant App とインストール版アプリを 2 つの別々の Android Studio プロジェクトで開発してもかまいません。ただしその場合、アプリを Google Play で公開するには、次のようにする必要があります。

  1. 両方の Android Studio プロジェクトで同じパッケージ名を使用します。
  2. Google Play Console で、両方のバリエーションを同じアプリにアップロードします。

アプリのバージョン設定については、アプリのバージョニングをご覧ください。

ターゲット サンドボックス バージョンを更新する

Instant App の AndroidManifest.xml ファイルは、Google Play Instant がサポートするサンドボックス環境をターゲットとするように更新する必要があります。この更新を行うには、次のコード スニペットに示すように、android:targetSandboxVersion 属性をアプリの <manifest> 要素に追加します。

<manifest
   xmlns:android="http://schemas.android.com/apk/res/android"
  ...
   android:targetSandboxVersion="2" ...>

詳細については、targetSandboxVersion 属性に関するドキュメントをご覧ください。

Instant 対応アプリ モジュールを宣言する

App Bundle が Instant 版に対応していることを宣言するには、次のいずれかの方法を使用します。

  • 既存の App Bundle に含まれるモジュールがベース モジュールのみの場合は、次のようにして App Bundle を Instant 対応にします。

    1. メニューバーから [View] > [Tool Windows] > [Project] を選択して、[Project] パネルを開きます。
    2. 通常は「app」という名のベース モジュールを右クリックし、[Refactor] > [Enable Instant Apps Support] を選択します。
    3. 表示されたダイアログで、プルダウン メニューからベース モジュールを選択します。
    4. [OK] をクリックします。

    Android Studio がモジュールのマニフェストに次の宣言を追加します。

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
        <dist:module dist:instant="true" />
        ...
    </manifest>
    
  • 既存の App Bundle に含まれるモジュールが複数ある場合は、Instant 対応の機能モジュールを作成します。このプロセスにより、アプリのベース モジュールも Instant 対応になるため、アプリ内で複数の Instant エントリ ポイントをサポートできるようになります。

ログインのサポートを追加する

Instant 版でユーザーにログインを許可する場合は、Instant 対応 App Bundle が Smart Lock for Passwords on Android をサポートしている必要があります。もしくは、「クイックプレイ」ゲームを作成する場合には、Google Play ゲームサービスのログインを使用します。

実行環境をサポートする

Instant 版が実行される SELinux サンドボックスと互換性を持たせるため、Instant 対応 App Bundle を作成する際は次の点に注意してください。

  • myUid() の値は共有しないでください。この値は、アプリプロセスのカーネル割り当て UID です。
  • アプリが Android 8.1(API レベル 27)以前をターゲットとしている場合は、ネットワーク セキュリティ構成ファイルを作成し、cleartextTrafficPermittedfalse に設定します。Instant 版は HTTP トラフィックをサポートしていません。Android 9 以降をターゲットとするアプリの場合、平文のトラフィックはデフォルトで無効になっています。
  • Instant 版は、Instant 版のキャッシュがクリアされるまで、ユーザーのデバイスにダウンロードされたまま残ります。キャッシュのクリアは次のいずれかの状況で発生します。

    • デバイスの空きメモリが不足しているために、Instant 版のキャッシュがガベージ コレクションの対象になる。
    • ユーザーがデバイスを再起動する。

    いずれかのプロセスが発生した場合、ユーザーが Instant 版を操作するには、再度ダウンロードする必要が生じます。

  • システムの保存容量が非常に少なくなっている場合、Instant 版のユーザーデータが内部ストレージから削除される場合があります。したがって、ユーザーの進行状況が保持されるように、ユーザーのデータについて、アプリのサーバーと定期的に同期することをおすすめします。

Instant 版ワークフローのロジックを追加する

Instant 版をサポートするように App Bundle を構成したら、下記のセクションで示すロジックを追加します。

アプリが Instant 版を実行しているかどうかを確認する

アプリのロジックの一部が、ユーザーが Instant 版を使用中かどうかに依存している場合は、isInstantApp() メソッドを呼び出します。現在実行中のプロセスが Instant 版である場合、このメソッドは true を返します。

インストール メッセージを表示する

アプリまたはゲームの試用版を作成する場合、Google Play Instant では、Instant 版にメッセージを表示して、デバイスに完全版をインストールするようユーザーに促すことができます。このメッセージを表示するには、次のコード スニペットに示すように、InstantApps.showInstallPrompt() メソッドを使用します。

Kotlin

class MyInstantExperienceActivity : AppCompatActivity {
    // ...
    private fun showInstallPrompt() {
        val postInstall = Intent(Intent.ACTION_MAIN)
                .addCategory(Intent.CATEGORY_DEFAULT)
                .setPackage(your-installed-experience-package-name)

        // The request code is passed to startActivityForResult().
        InstantApps.showInstallPrompt(this@MyInstantExperienceActivity,
                postInstall, request-code, /* referrer= */ null)
    }
}

Java

public class MyInstantExperienceActivity extends AppCompatActivity {
    // ...
    private void showInstallPrompt() {
        Intent postInstall = new Intent(Intent.ACTION_MAIN)
                .addCategory(Intent.CATEGORY_DEFAULT)
                .setPackage(your-installed-experience-package-name);

        // The request code is passed to startActivityForResult().
        InstantApps.showInstallPrompt(MyInstantExperienceActivity.this,
                postInstall, request-code, /* referrer= */ null);
    }
}

インストール版にデータを移行する

ユーザーは Instant 版で楽しめたと感じたら、アプリをインストールしようとします。適切なユーザー エクスペリエンスを提供するには、Instant 版アプリから完全版アプリにユーザーのデータを移行できるようにすることが重要です。

ユーザーが Android 8.0(API レベル 26)以降を搭載したデバイスを使用している、またはアプリで targetSandboxVersion2 に指定している場合、ユーザーのデータは完全版のアプリに自動的に移行されます。それ以外の場合は、データを手動で移行する必要があります。そのためには、次のいずれかの API を使用します。

  • ユーザーが Android 8.0(API レベル 26)以降を搭載したデバイスを使用している場合は、Cookie API を使用します(サンプルアプリ)。
  • ユーザーが Android 7.1(API レベル 25)以前を搭載したデバイスで Instant 版を操作できる場合は、Storage API のサポートを追加します(サンプルアプリ)。

App Bundle をビルドする

Android Studio またはコマンドライン インターフェースを使用して、Instant 対応 App Bundle をビルドできます。

Android Studio

Android Studio で、[Build] > [Build Bundle(s) / APK(s)] > [Build Bundle(s)] を選択すると、App Bundle をビルドできます。プロジェクトのビルド方法については、プロジェクトのビルドをご覧ください。

コマンドライン インターフェース

Gradle を使用してコマンドラインから App Bundle をビルドすることもできます。このビルドを行った後は、次のコマンドを実行して、Instant 版アプリの最終チェックを行ってください。

ia check app-artifact

アプリのアーティファクトとしては、App Bundle、または少なくとも 1 つの Instant 版を含む APK のリストを使用できます。

Instant 版アプリをテストする

Instant 対応 App Bundle を公開する前に、次のいずれかの場所から Instant 版アプリをテストして、機能を検証できます。

Android Studio

Android Studio を使用してローカルマシンでアプリの Instant 版をテストする手順は次のとおりです。

  1. テストデバイスにアプリのインストール版がインストールされている場合は、アンインストールします。
  2. Android Studio で、[Run/Debug Configurations] ダイアログの [General] タブに表示されるインストール オプションの中から、[Deploy as instant app] チェックボックスをオンにします。
  3. メニューバーで [Run] > [Run] を選択するか、ツールバーの Run)をクリックして、アプリの Instant 版をテストするデバイスを選択します。選択したテストデバイス上にアプリの Instant 版が読み込まれます。

コマンドライン インターフェース

コマンドラインを使用してローカルマシンでアプリの Instant 版をテストする手順は次のとおりです。

  1. テストデバイスにアプリのインストール版がインストールされている場合は、アンインストールします。
  2. 次のコマンドを入力することで、テストデバイス上で Instant App をサイドローディングして実行します。
ia run output-from-build-command

内部テストトラック

Play ストアやウェブサイトのバナーからアプリの Instant 版をテストするには、Play Console の内部テストトラックにアプリを公開します。

アプリを内部テストトラックに公開する手順は次のとおりです。

  1. Play Console に App Bundle をアップロードする手順のガイドに沿って、App Bundle をアップロードします。
  2. アップロードしたバンドルを内部テストトラックにリリースする準備を行います。詳細については、リリースの準備と公開の方法に関するサポート記事をご覧ください。
  3. デバイス上で内部テスター アカウントにログインして、次のいずれかのサーフェスから Instant 版アプリを起動します。

    • アプリの Play ストア掲載情報から [今すぐ試す] ボタンを押します。
    • アプリのウェブサイトのバナーにあるリンクをタップします。

App Bundle を製品版トラックに公開する

Instant 対応 App Bundle を公開する手順は次のとおりです。

  1. まだ行っていない場合は、リリース鍵を使用して App Bundle に署名し、App Bundle を Play Console にアップロードします。
  2. Play Console で、[リリース管理] > [Android Instant Apps] を開いて、[Instant App の製品版] トラックに移動します。
  3. [Update from Library] を選択して、アップロード済みの Instant 対応 App Bundle を選択します。

Instant 版を公開する場所を選択する

ユーザーがアプリをインストールできる国や地域のサブセットで、アプリの Instant 版をリリースできます。この機能は、特定の国や地域に居住するユーザーにアプリの Instant 版の利用を促す場合に便利です。

参考情報

Instant 版アプリや Android App Bundle の作成方法については、以下のリソースをご覧ください。

動画: アプリを Instant にバンドルする
この Android Dev Summit 2018 セッションは、Android App Bundle に Instant 版アプリを追加する方法について説明しています。
動画: Android App Bundle を使用して小さなアプリを公開する
App Bundle を活用してアプリを迅速に開発し、ユーザー向けに小さな APK を作成する方法について説明しています。
Codelab: 初めての Android App Bundle
Android App Bundle を作成して機能を追加するための手順を詳細に説明しています。
Android App Bundle 形式
bundletool コマンドライン プログラムを使用して、アプリのコードやリソースから App Bundle を用意する方法について説明しています。