NIKKEI TECHNOLOGY AND CAREER

Firebase App DistributionによるAndroid App Bundleの配布と署名について

この記事はNikkei Advent Calendar 2021の16日目の記事です。アプリチームの夏坂(@ntsk)が担当します。

今年8月から Google Play への新規公開には Android App Bundle (以降aab)での公開が必須となりました[1]。既存アプリについては未だ必須ではないものの、日経電子版・紙面ビューアーアプリでもaabでの公開ならびにリリース前のQAテストにてaabを利用した検証を行うよう変更を進めています。

さらに今年は Firebase App Distribution が正式にaab対応しました[2]。これまでの Google Play の内部アプリ共有や bundletool を利用したローカルでの検証[3]に加えて、更にQAチームとの連携が取りやすくなったと感じています。

この記事では、既存アプリを App Distribution でaabを利用して配布できるようにする流れと、開発・QAプロセスにおいて意識が必要な署名の違いについて紹介します。

配布する上で必要なこと

App Distribution でaabを配布するには、事前に Google Play との連携が必要です。コンソール上の、プロジェクトの設定 > 統合 から Google Play を選択することで連携することができます。

FirebaseとGoogle Playの統合

また、Firebaseのプロジェクトへ登録しているアプリのパッケージ名と同一のパッケージ名を持ったアプリが Google Play の公開済みのトラックに存在している必要があります。 公開済みのトラックとは製品版である必要はなく、内部テスト(未公開の内部テスト以外)、クローズドテスト、オープンテストでも問題ありません[4]。

fastlaneやGradle pluginによる配布

fastlane や Gradle Plugin を利用して App Distribution へ配布している場合でも、apkかaabを選択してアップロードすることが可能です。それぞれpathを指定するパラメータに変更があり、新たにtypeを指定するパラメータが追加されてます。

Before After
fastlane[5] apk_path android_artifact_path
android_artifact_type(APK/AAB)
Gradle plugin[6] apkPath artifactPath
artifactType(APK/AAB)

Firebase App Tester経由でのインストール

これまでのapkと同様にApp Testerアプリを利用してaabをインストールすることができます。初回のみ Google Play との連携のため、Playストアアプリから以下の操作で内部アプリ共有を有効にする必要があります。

  • 設定 > 概要 > Playストアのバージョン を7回タップして、内部アプリ共有のロックを解除
  • 内部アプリ共有を有効にする

以降はApp Testerアプリから該当のバージョンのアプリでダウンロードをタップするとPlayストアアプリで内部アプリ共有が起動し、インストールや更新が可能となります。

App Testerでのaabのインストール

署名の違いによる注意点

Androidアプリは秘密鍵で署名され、アプリのアップデートが信頼できるものであることを保証するため、そのデバイスにインストールされているアプリとアップデートで署名が一致する場合のみアップデートすることができるようになっています。

Playアプリ署名[7]と同様に、App Distribution 経由でアプリをインストールした場合にも、Google Play によって自動的に再署名が行われます。最終的な署名は、App Distribution へ最初にaabをアップロードした際に自動的に作られるテスト証明書が利用されます。

つまり、App Distribution 経由でインストールする際、aab→aabのアップデートは可能ですが、apk→aabのアップデートを行うことはできないということになります。

以下でPlayアプリ署名の図を利用して具体的に説明します。

apk配布における署名フロー

Playアプリ署名を利用していないGoogle Playからインストールしたapkや、App Distribution からapkをインストールする場合には、以下のような署名フローとなります。

自分専用のアプリ署名鍵を管理する場合のアプリへの署名

出典: アプリへの署名-図12. 自分専用のアプリ署名鍵を管理する場合のアプリへの署名[7]

最終的な署名はアップロード時の署名に利用した鍵がそのまま利用されるため、Google Play、App Distributionやローカルビルド のそれぞれどこからインストールしたアプリであっても鍵が一致しアップデートすることが可能でした。

aab配布における署名フロー

次にPlayアプリ署名を利用しているGoogle Playからインストールしたapkや、App Distribution へaabでアップロードしたapkをインストールする場合には以下のフローとなります。

Playアプリ署名を使用したアプリへの署名

出典: アプリへの署名-図1. Play アプリ署名を使用したアプリへの署名[7]

Playアプリ署名の場合には Google Play に署名鍵として登録されている鍵が利用され、App Distribution では、自動的に作られたテスト用の署名鍵が利用されます。

このため、Playアプリ署名への対応で、アップロード鍵を新たに作成し既存の署名鍵をGoogle Playに登録したという場合を例にすると、以下の3種類の鍵で署名されたアプリを意識することになります。

  • 署名鍵
    • Playアプリ署名対応前から署名に利用していた鍵。署名鍵として Google Play へ登録。
  • アップロード鍵
    • Playアプリ署名対応に伴い新規で作成した鍵。Playアプリ署名対応以降の Google Play へのアップロードにはこの鍵で署名。
  • App Distribution が生成したテスト用の署名鍵(以降、テスト署名鍵)
    • App Distribution へ初めてaabをアップロードした際に生成される。App Distribution経由でaabを利用したインストールを行う場合、この鍵で署名されたapkがインストールされる。

この時、インストール元に応じたアップデート可否は以下のようになります。括弧内には最終的な署名に使われる鍵を記載しています。

↓から→への
アップデート
App
Distribution
apk
(署名鍵)
App
Distribution
aab
(テスト署名鍵)
Google Play
(署名鍵)
ローカルビルド
(署名鍵)
ローカルビルド
(アップロード鍵)
App
Distribution
apk
(署名鍵)
× ×
App
Distribution
aab
(テスト署名鍵)
× × × ×
Google Play
(署名鍵)
× ×
ローカルビルド
(署名鍵)
× ×
ローカルビルド
(アップロード鍵)
× × × ×

上記の通り、App Distributionでaabを配布する場合は最終的には自動生成されたテスト署名鍵が利用されるため、apkで配布していたバージョンからaabで配布するようになったバージョンへのアップデートはできなくなります。

とはいえ開発・QAプロセスにおいては、DBマイグレーションなどのアップデートに起因する挙動の確認は不可欠です。私たちのチームでは、古いバージョンからのアップデートも確認できるよう新しいバージョンでも最終的にユーザーに届く鍵を利用したapkを作成し、fastlane で Google Drive へ本番・開発版のそれぞれをリリース時にアーカイブすることで、QAチームが必要な際に特定の古いバージョンからのアップデートを確認できるようにしています。 このような挙動の違いについて開発チーム・QAチームで認識しておく必要があるでしょう。

Amazon Appstoreの署名

Amazon Appstore では、申請した時点のアプリの署名は一度削除され、アカウントごとにユニークなAmazon署名を利用して再署名されます[8]。このため、Amazon Appstore 経由のアプリに対して開発者が署名したapkを利用してアップデートすることは元々できませんでした。

Amazon Appstore でもaabをサポートするよう対応を進めている[9]とのことなので、近いうちにまた状況が変わるかもしれません。

終わりに

Firebase App Distribution での Android App Bundle の配布と署名における注意点について紹介しました。

このようなアプリのリリースサイクルにおける取り組みは、チームで議論しながら日々アップデートを行っています。開発者間やQAチームへのアプリの配布について、よりスマートな運用方法をお持ちの方や自社ではこのようにしているなどの事例がありましたら、是非教えていただけると嬉しいです。

参考

[1]: Android Developers - Android App Bundleについて, https://developer.android.com/guide/app-bundle (accessed 10 December 2021)

[2]: The Firebase Blog - App Distribution Adds Support to Android App Bundles, https://firebase.googleblog.com/2021/05/app-distribution-adds-support-to-android-app-bundles.html (accessed 10 December 2021)

[3]: Android Developers - Android App Bundle のテスト, https://developer.android.com/guide/app-bundle/test (accessed 10 December 2021)

[4]: Firebase Documentation - Firebase コンソールを使用して Android アプリをテスターに配布する - 始める前に, https://firebase.google.com/docs/app-distribution/android/distribute-console?apptype=aab#before_you_begin (accessed 10 December 2021)

[5]: Firebase Documentation - fastlane を使用して Android アプリをテスターに配布する, https://firebase.google.com/docs/app-distribution/android/distribute-fastlane?apptype=aab (accessed 10 December 2021)

[6]: Firebase Documentation - Gradle で Android アプリをテスターに配布するhttps://firebase.google.com/docs/app-distribution/android/distribute-gradle?apptype=aab (accessed 10 December 2021)

[7]: Android Developers - アプリへの署名, https://developer.android.com/studio/publish/app-signing (accessed 10 December 2021)

[8]: Amazon Appstore Developer Documentation - Amazonアプリの署名, https://developer.amazon.com/docs/app-submission/understanding-submission.html#app_signatures (accessed 10 December 2021)

[9]: Appstore Blogs - Amazon Appstore to support Android App Bundle, https://developer.amazon.com/blogs/appstore/post/50b1ca0f-bbec-48ec-9eea-3c395efb8f9f/amazon-appstore-to-support-android-app-bundle (accessed 10 December 2021)

夏坂友輔
ENGINEER夏坂友輔

Entry

各種エントリーはこちらから

キャリア採用
Entry
新卒採用
Entry
短期インターン
Entry