Android アプリバンドルに instant experience を追加する (インスタントアプリを簡単に作れるようになった)

nobuoka
32
この記事は RECRUIT MARKETING PARTNERS Advent Calendar 2018 の投稿記事です。

Android アプリには、インストールせずに起動できる 「インスタントアプリ (以下 instant apps)」 と呼ばれる種類のものがあります。 本記事では、下記の内容を説明します。

  • Android アプリバンドルに instant experience を追加することで、instant apps を作ることができる。 (以前よりも簡単に instant apps を作ることができるようになった。)
  • Instant apps の動作確認方法。

Instant apps の歴史

Android アプリバンドル以前の instant apps

Instant apps は 2016 年に公表され 1)参考 : Google I/O 2016 に参加してきました (全体まとめ編) - Tech Blog - Recruit Lifestyle Engineer、2017 年に一般の開発者にも公開されました 2)参考 : Google I/O 2017 から学んだこと - Tech Blog - Recruit Lifestyle Engineer

2017 年の段階では、instant apps の作成方法は下記ページに書かれているようなものでした。

すなわち、feature module や instant app module などの複数のモジュールをプロジェクトに追加する必要があったのです。 通常のアプリ開発とは異なるモジュールの切り方になるので、instant app の開発を試すことにやや面倒くささを覚える人も多かったのではないでしょうか。

Android アプリバンドルと instant apps

2018 年に、Android アプリバンドルの一部として instant apps を作ることができるようになりました。 上述の方法と比べ、簡単に instant apps を開発できます。

Android アプリバンドルについては、下記ページに記載したので参照してください。

Android アプリバンドルに instant experience を追加する

Android アプリバンドルのプロジェクト 3)普通に Android Studio 3.2 で Android アプリのプロジェクトを作ればよい。 に instant experience を追加する方法を説明します。 公式のドキュメントは下記ページです。

事前準備

事前準備として Android SDK Manager で Google Play Instant Development SDK をインストールしておきましょう。

Instant apps 用の product flavor の追加

まず、instant apps 用の product flavor を追加します。 app モジュールの build.gradle に下記のようなコードを追加して、product flavor で instantinstalled を分けます。 (下記の名前は公式ドキュメントに従っているが、flavor 名は何でも大丈夫です。 flavorDimensions として experience というものが追加されていますが、これも必ずしも必要ではありません。)

android {
  // ...
  flavorDimensions "experience"
  productFlavors {
    instant {
      versionCode 1
    }
    installed {
      versionCode 2
    }
  }
}

注意点として、instant app のバージョンコードをインストール版のバージョンコードよりも若くする必要があります。 これは、インスタントバージョンからインストールバージョンへのアップデートを可能にするためです。

Instant apps 用の AndroidManifest.xml の追加

次に、instant apps 用の product flavor のアプリマニフェストで下記の指定を行います。 上の例では product flavor の名前が instant なので、プロジェクトの app/src 下に新たに instant ディレクトリを作り、その中に AndroidManifest.xml を配置しましょう (最終的なパスとしては app/src/instant/AndroidManifest.xml となる)。 その中身を下記のようにします。

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dist="http://schemas.android.com/apk/distribution"
    android:targetSandboxVersion="2">
    <dist:module dist:instant="true" />
</manifest>

android:targetSandboxVersion 属性は、アプリのサンドボックスのセキュリティレベルを指定するものです。 1 よりも 2 の方がセキュリティレベルが高く、API level 26 (Android 8.0) 以降で instant apps として動かすには 2 を指定する必要があります。 ちなみに、インストール版のアプリで 1 を指定した場合、instant apps からインストール版のアプリにアップデートする際にデータが引き継がれない模様です。 『<manifest> | Android Developers』 に下記のように書かれていました。

For Android Instant Apps targeting Android 8.0 (API level 26) or higher, this attribute must be set to 2. You can set the sandbox level in the installed version of your app to the less restrictive level 1, but if you do so, your app does not persist app data from the instant app to the installed version of your app. You must set the installed app's sandbox value to 2 in order for the data to persist from the instant app to the installed version.

ということは、instant product flavor でバージョン 2 を指定するのではなく、main の AndroidManifest.xml で android:targetSandboxVersion="2" を指定しても良いのかもしれません4)未検証です。

<dist:module dist:instant="true" /> は、モジュールをどのようにパッケージしてどのように配布するかを指定するための要素で、この指定により instant apps として配布できるようになるようです。 dist:module 要素については Dynamic Delivery のところで説明が書かれていましたが、dist:instant の詳細な説明はまだドキュメント上にはなさそうでした。

ちなみに、Android Studio 3.3 ではアプリバンドルの instant apps サポートが追加される見込みです。

これで instant app が完成

上記の流れで instant app が完成です。 簡単ですよね。

(Instant apps にはパーミッションや APK サイズなどに制限があるので、それらの制限は公式ドキュメントを参照してください。)

Instant apps の動作確認

動作確認の方法として、公式ドキュメントでは下記の 2 通りが紹介されています。 (参考 : Add an instant experience to your existing Android App Bundle | Android Developers)

  • Play Console の内部テスト版 (internal test track) を使う方法 (アプリを一般公開するのではなく、テスト配信して一部のユーザーだけ試せるようにする方法)
  • ローカルマシンで jarsigner や bundletool といったコマンドラインツールを使って実機や Android エミュレータで確認する方法

私はここで詰まったので共有しておきます。 結論から言うと、Android 8.0.0 端末でも instant apps が使えないものがあるようでした。

Play Console の内部テスト版

Play Console の内部テスト版の使い方や instant apps の配信方法は下記ページを参照すると良いでしょう。

内部テスト版の instant app を配信した後、Android 端末で内部テスト用の URL から Play Store 画面を表示すると 「Try Now」 ボタンが表示されるはずです。

ローカルマシン上で APK を生成して試す

Play Console を使わず、ローカルマシンと Android 端末で instant apps を試すこともできます。

まず、Android Studio を用いて、署名済みのアプリバンドルをビルドします。 次に、bundletool コマンドを利用して APK を生成します 5)コンソールは PowerShell である。。 下記コマンドにより、接続されている Android 端末に必要な APK をすべて含む app.apks という名前のファイルが生成されます。

> java -jar C:\opt\android\bundletool-all-0.6.2.jar build-apks --bundle=app.aab `
    --output=app.apks --connected-device `
    --ks="C:\Users\nobuoka\xxxx\xxxx.jks" --ks-pass="pass:xxxx" `
    --ks-key-alias=xxxx --key-pass="pass:xxxx"

生成された app.apks を ZIP ファイルとして展開したあと、下記のように ia コマンドを用いることで Android 端末で instant app を起動できます。

> C:\Users\xxx\Android\Sdk\extras\google\instantapps\ia.bat run .\app\splits\*.apk
INFO - Analyzing files...
INFO - Checking device...
INFO - Pushing instant app to device...
INFO - Launching app...
INFO - Instant app started

事例共有 : Android 8.0.0 端末が instant apps に対応していなかった

私が試した際は、まず Play Console の内部テスト版でアプリを配信して、実機の Moto X4 (Android 8.0.0) や DIGNO W (Android 7.0) で 「Try Now」 を試そうとしました。 しかし、何故か 「Try Now」 ボタンが表示されませんでした。

原因がわからなかったため、ローカルマシン上で APK を生成して実機で動かすことを試みました。 しかし、下記のようなエラーメッセージが表示され、この試みも失敗に終わりました。

> C:\Users\xxx\Android\Sdk\extras\google\instantapps\ia.bat run .\app\splits\*.apk
INFO - Analyzing files...
INFO - Checking device...
FATAL - This older Android build is not compatible with instant apps
You must install system updates, flash a newer system image, or use a device
with a a more up-to-date set of system patches.

上記メッセージによると、どうやら自分が使っていた実機だと instant apps を使用できないようです。 Android 8.0.0 端末は instant apps に対応しているものだと思っていたのですが、必ずしもそうではないようですね。

具体的に instant apps に対応している Android 端末の条件について調べたところ、下記ページの 『Google 設定に Instant Apps が表示されない場合、お使いの端末ではまだご利用になれません』 という記述を発見しました。

私が使用していた端末には Instant Apps の設定があり、有効にもなっていたので、なぜ利用できなかったのかは未だにわかっていません。 が、そういう場合もあるということを事例として共有しておきます。

最終的には、Android emulator を使用することで instant apps の動作確認を行うことができました。 (Android 8.0 および Android 9.0 で確認しました。)

脚注   [ + ]

1. 参考 : Google I/O 2016 に参加してきました (全体まとめ編) - Tech Blog - Recruit Lifestyle Engineer
2. 参考 : Google I/O 2017 から学んだこと - Tech Blog - Recruit Lifestyle Engineer
3. 普通に Android Studio 3.2 で Android アプリのプロジェクトを作ればよい。
4. 未検証です。
5. コンソールは PowerShell である。