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 にアップロードするアプリに署名するには、アップロード鍵を使用します。このシステムでは、アップロード鍵の紛失や不正使用が発生した場合に、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 アプリ署名とは異なり、鍵を紛失した場合、鍵をリセットできません。したがって、アプリの署名鍵を紛失すると、アプリを更新することもできなくなります。

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

デジタル アセット リンクは、ウェブサイトと 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 経由

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

署名鍵やアップロード鍵についても同じ考え方が当てはまります。Google Play ストアからアプリをインストールした場合は、Asset Link Tool によってアプリの署名鍵のフィンガープリントを取得できます。アプリをローカルマシンから直接インストールした場合、生成された鍵の 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]

キーの追加

デジタル アセット リンク ファイルには複数のアプリを含めることができ、アプリごとに複数のキーを含めることができます。たとえば、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 ファイル内の署名と一致していることを確認する必要があります。