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: 代わりに内部ストレージを使用します。アプリで外部ストレージに書き込む必要がある場合は、外部ストレージ内のアプリ固有のディレクトリを使用します。アプリは、これらのディレクトリへの書き込み権限をリクエストする必要はありません。
  • 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

アプリのアーティファクトとしては、ZIP ファイルや 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 を用意する方法について説明しています。