Android のコンセプト(ウェブ デベロッパー向け)

Peter Conn
Peter Conn
Joyce Toh
Joyce Toh

Android と Google Play を初めて使用するウェブ デベロッパーは、いくつかの詳細に注意する必要があります。この件については、すでに多くのリソースとドキュメントが存在します(Android チームのおかげです)。ここでは、重要なコンセプトと、それらが Bubblewrap とどのように関連しているかについて説明します。

アップロード鍵と署名鍵

Bubblewrap を使用して Android App Bundle(AAB)(注: 2021 年 8 月より、Google Play ではすべての新規アプリで Android App Bundle 形式を使用することが義務付けられます)または APK を生成して Google Play にアップロードして公開する場合は、署名鍵を使用してアプリに署名する必要があります。Google Play では、この問題に対処する方法として次の 2 つがあります。

  • Play アプリ署名(強く推奨): Google がアプリの署名鍵を管理、保護します。署名鍵は、配布用 APK に署名するために使用されます。Play アプリ署名では、2 つの鍵を使用します。Google が管理する「アプリ署名鍵」と、デベロッパーが保管し、非公開に保つ「アップロード鍵」です。アップロード鍵は、Google Play Console にアップロードするアプリに署名するために使用します。このシステムでは、アップロード鍵を紛失または不正使用した場合は、Google Play サポートチームに連絡してリセットできます。現在、Google Play ではアプリを AAB または APK としてアップロードできます。
    • Android App Bundle(AAB): AAB を Google Play Console にアップロードすると、APK のビルドと生成が Google Play ストアに延期されます。ユーザーがアプリをダウンロードしてインストールすると、Google Play から署名済み APK として配信されます。したがって、APK の署名も Google Play によって行う必要があります。そのため、デフォルトでは、アプリを AAB として Google Play Console にアップロードする場合は、Play アプリ署名を使用する必要があります。
    • APK: APK では、Play アプリ署名を有効にできます。Play アプリ署名にオプトインすると、署名鍵のセキュリティが強化されるため、オプトインすることを強くおすすめします。前述のとおり、Google Play ではまもなく、すべての新規アプリを AAB 形式でアップロードすることが必須になるため、APK をアップロードするのではなく、AAB をアップロードすることをおすすめします。
  • 独自の署名鍵を管理する: 独自の鍵を管理し、Play アプリ署名にオプトインしない場合は、アプリの署名鍵について完全に責任を負うことになります。Play App Signing とは異なり、鍵を紛失した場合にリセットすることはできません。そのため、アプリの署名鍵を紛失すると、アプリを更新できなくなります。

bubblewrap init の設定中に [Signing key information (5/5)] に進むと、[Key store location] と [Key name] の入力を求められます。デフォルトを使用することもできます。デフォルトのキーストアの場所は、プロジェクト ディレクトリのファイル android.keystore で、デフォルトのキー名は android です。Bubblewrap がその場所にそのキー名の既存のキーストアを見つけられない場合は、キーストアが作成され、パスワードの入力を求められます。入力したパスワードをメモしておいてください。ビルドプロセス(bubblewrap build)で鍵を使用してアプリに署名する際に必要になります。Google Play アプリ署名にオプトインすると、Bubblewrap が生成してアプリの署名に使用した署名鍵が「アップロード鍵」になります。Bubblewrap で生成された鍵を署名鍵またはアップロード鍵として使用するかどうかにかかわらず、鍵を保護して非公開にする必要があります。バージョン管理に commit することはおすすめしません。代わりに、アクセスできるユーザーの数を制限します。

Digital Asset Links は、ウェブサイトと Android アプリの関係を宣言するために必要です。Bubblewrap によって生成された Android アプリが適切に検証され、(Chrome カスタムタブではなく)信頼できるウェブ アクティビティとして起動されるようにするには、適切なキーを assetlinks.json ファイルに追加する必要があります。次に、ウェブサイトの .well-known/assetlinks.json(ルート相対)にアップロードします。assetlinks.json ファイルは次の形式にする必要があります。

[{
 "relation": ["delegate_permission/common.handle_all_urls"],
 "target": {
   "namespace": "android_app",
   "package_name": "com.your.package_name",
   "sha256_cert_fingerprints": [
     "XX:XX:XX:..."
   ]
 }
}]

SHA256 証明書のフィンガープリントを取得する

assetlinks.json ファイルを作成するには、アプリの署名鍵に関連付けられた SHA 256 証明書フィンガープリントが必要です。重要な点は、署名鍵とアップロード鍵に関連付けられている指紋が異なることです。特に、アプリが Chrome カスタムタブとして起動され(ブラウザバーが表示されている)、この違いが問題になる場合は、この違いを念頭に置くことが重要です。その場合は、assetlinks.json ファイルに適切な鍵に対応するフィンガープリントがない可能性があります。

ローカルでアプリを簡単にデバッグできるように、assetlinks.json に署名証明書とアップロード証明書の両方のフィンガープリントを指定することをおすすめします。assetlinks.json ファイルに両方のキーを含める方法について詳しくは、以下のキーを追加するをご覧ください。

フィンガープリントを取得する方法はいくつかあります。これについては、次のセクションで詳しく説明します。いずれの方法でも同じ指紋が取得されるため、ご都合のよい方法を選択してください。

Google Play Console 経由

Google Play アプリ署名にオプトインするかどうかに応じて、1 つまたは 2 つの鍵を使用できます。各鍵に適した SHA256 フィンガープリントを取得するには:

  1. Google Play Console に移動
  2. 興味のあるアプリを選択する
  3. 左側のナビゲーション メニューの [リリース] で、[設定] > [アプリの完全性] に移動します。
  4. 適切な鍵の SHA256 をコピーします。

署名鍵またはアップロード鍵に適した SHA256 証明書のフィンガープリントを取得する

  • 署名鍵: [アプリ署名鍵の証明書] の SHA256 フィンガープリントをコピーします。Google Play は署名鍵で署名されたアプリを配信するため、このフィンガープリントは、Google Play ストアからアプリをダウンロードした場合にアプリに対応します。

  • アップロード鍵: [アップロード鍵証明書] の SHA256 フィンガープリントをコピーします。このフィンガープリントは、ローカルにインストールした場合(USB 経由の ADB など)にアプリに対応します。この APK(ローカルマシン上)は Bubblewrap によってビルドされたため、(init のセットアップ中に)作成された鍵によって署名されています。これはローカルにインストールされたアプリの署名鍵ですが、Google Play でアプリを公開すると、実際には「アップロード鍵」になります。

keytool 経由

keytool は、鍵と証明書の管理ツールです。keytool を使用して、生成された APK または AAB Bubblewrap に関連付けられた SHA 256 フィンガープリントを抽出できます。このフィンガープリントはローカル署名鍵用です。アプリを Play にアップロードして Play アプリ署名にオプトインすると、この鍵が「アップロード鍵」になります。

keytool -printcert -jarfile [path to APK or AAB] | grep SHA256

アプリに適したデジタル アセット リンク ファイルを取得するもう 1 つの方法は、アセットリンク ツールを使用する方法です。

  1. Google Play ストアから アセットリンク ツールをインストールします。
  2. 同じデバイスで、Google Play ストアからアプリをダウンロードするか、ローカルにインストールします。
  3. Asset Link Tool アプリを開くと、デバイスにインストールされているすべてのアプリのリストがパッケージ名で表示されます。bubblewrap init で選択したアプリケーション ID でリストをフィルタし、そのエントリをクリックします。
  4. アプリの署名と生成されたデジタル アセット リンクが一覧表示されたページが表示されます。下部にある [コピー] ボタンまたは [共有] ボタンをクリックして、任意の方法でエクスポートします(Google Keep に保存する、自分宛てにメールを送信するなど)。

署名鍵やアップロード鍵の場合も、同じ考え方が適用されます。Google Play ストアからアプリをインストールした場合、アセットリンク ツールはアプリの署名鍵のフィンガープリントを取得します。ローカルマシンからアプリを直接インストールした場合、指紋は Bubblewrap が生成した鍵のものです。

アップロードしたら、ブラウザでアセットリンク ファイルにアクセスできることを確認します。https://example.com/.well-known/assetlinks.json がアップロードしたファイルに解決されていることを確認します。

Jekyll ベースのウェブサイト

ウェブサイトが Jekyll によって生成されている場合(GitHub Pages など)、.well-known ディレクトリが出力に含まれるように、構成行を追加する必要があります。GitHub ヘルプには、このトピックの詳細が記載されています。サイトのルートに _config.yml という名前のファイルを作成します(すでに存在する場合は追加します)。次のように入力します。

# Folders with dotfiles are ignored by default.
include: [.well-known]

キーを追加する

Digital Asset Link ファイルには複数のアプリを含めることができ、アプリごとに複数のキーを含めることができます。たとえば、2 つ目のキーを追加するには、アセットリンク ツールを使用してキーを特定し、2 つ目のエントリとして追加します。この JSON を解析する Chrome のコードは非常に厳格であるため、リストの末尾に誤ってカンマを追加しないようにしてください。

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.your.package_name",
    "sha256_cert_fingerprints": [
      "XX:XX:XX:..."
    ]
  }
},{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.your.package_name",
    "sha256_cert_fingerprints": [
      "XX:XX:XX:..."
    ]
  }
}]

トラブルシューティング

Chrome は、デジタル アセットリンクの検証が失敗した理由をログに記録します。Android デバイスで adb logcat を使用してログを表示できます。Linux または Mac で開発している場合は、次のコマンドを使用して、接続されたデバイスの関連ログを確認できます。

> adb logcat -v brief | grep -e OriginVerifier -e digital_asset_links

たとえば、Statement failure matching fingerprint. というメッセージが表示された場合は、アセットリンク ツールを使用してアプリのシグネチャを確認し、assetlinks.json ファイルのシグネチャと一致していることを確認する必要があります。