ローソンデジタルイノベーション テックブログ

ローソンデジタルイノベーション(LDI)の技術ブログです

AndroidアプリをAAB対応した際に発生したトラブルとその解決方法

こんにちは、LDIのモバイルアプリエンジニアの庄司です。

今回の記事では、AndroidアプリをAAB対応した際に発生したトラブルとその解決に行った方法について書きます。

はじめに

Androidアプリ開発において、Google Playへの配信形式が従来のAPKからAAB(Android App Bundle)へと移行されたことで、いくつかの新たな課題に直面することがあります。本記事では、AAB対応に伴い発生した2つの具体的な問題と、それらに対する解決方法を紹介します。

対象読者は、既にAndroidアプリ開発の基本的な知識を持ち、AAB対応を検討している、もしくは実施中の中級者を想定しています。

今回の記事で関連するライブラリは以下となります。

Gradle 8.8
AGP 8.4.2

問題1:AABビルドとAPKビルドで署名を切り替える必要がある

背景

Google PlayにアプリをAAB形式で配信する場合、Google Playで設定したアップロード用鍵で署名する必要があります。しかし、内部テストや他の配布手段(例: Firebase App Distribution)でAPKファイルを利用する場合、アップロード用とは別の鍵で署名する必要がありました。そのため、AABビルド時とAPKビルド時で署名を切り替える仕組みが必要となりました。

解決方法

Gradleのビルド設定では、ビルドタイプやプロダクトフレーバーによって署名などを切り替えることが多いと思いますが、 AABビルドとAPKビルドの差は実行時に指定するタスク名に違いがあるので今回はビルド時のGradleのタスク名をチェックして切り替えることにしました。

Gradleでビルドを行う際に指定するタスク名はそれぞれ下記のようになります。

APKビルド

./gradlew assembleRelease

AABビルド

./gradlew bundleRelease

AABビルドの場合はbundleから始まるタスク名となるのでそれを利用しました。

以下、実装例です。実際に行った実装を元に簡略したものを載せています。

1. signingConfigsで署名設定を定義します。

以下のようにbuild.gradleファイルに署名設定を定義します。

android {
    signingConfigs {
        release {
            keyAlias 'your-release-key-alias'
            keyPassword 'your-release-key-password'
            storeFile file('path/to/your/release-keystore.jks')
            storePassword 'your-release-store-password'
        }
        // プロダクトフレーバー等には含まれないが署名の切り替えのために定義
        aabUpload { 
            keyAlias 'your-upload-key-alias'
            keyPassword 'your-upload-key-password'
            storeFile file('path/to/your/upload-keystore.jks')
            storePassword 'your-upload-store-password'
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }

        debug {
            // 省略
        }
    }
}

2. gradle.startParameter.taskNamesを使用して、AABビルドであることを判定し署名を切り替えます

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }

        debug {
            // 省略
        }
    }

    gradle.startParameter.taskNames.collect { taskName ->
        if (taskName.startsWith("bundle") && taskName.endsWith("Release"))) {
            android.buildTypes.release.signingConfig = android.signingConfigs.aabUpload
            break
        }
    }
}

StartParameterの詳細はこちら docs.gradle.org


問題2:Firebase App DistributionでAABファイルを配信した際に発生したトラブル

背景

AABファイルをFirebase App Distributionで配信した際に、次のような問題が発生しました。

  • 店舗検索という機能でマップが表示されなくなる

  • 他社ライブラリが動作しなくなる

原因はAABファイルをFirebase App Distributionで配信した場合にFirebaseが自動的に生成した証明書で署名をしたアプリを配信するという仕様のためでした。 店舗検索ではGoogle Maps APIを利用していますがGoogle Maps APIではアプリの署名証明書のSHA-1ハッシュ値を使用してAPIキーのアクセス制限を設定していたため、想定されていない署名がされたことで署名の不一致が発生しAPIが利用できなくなったためマップが表示されていませんでした。 他社ライブラリでもアプリの署名を検証しているものがあったため、利用ができなくなっていました。

解決方法

Google Maps APIの問題

Firebaseが生成した署名証明書のSHA-1ハッシュ値をGoogle Cloud PlatformのAPIキー設定に追加することで、この問題を解決しました。

解決手順

1.Firebaseコンソールで署名証明書のSHA-1を確認

  • Firebaseコンソールで対象のプロジェクトを開きます。

  • App Distributionの証明書に関する表示項目から、Firebaseが生成したSHA-1ハッシュ値を確認します。

App Distributionで生成された証明書についての表示。証明書を表示からハッシュ値を確認できる。

2.Google Cloud PlatformでAPIキーの制限を更新

  • Google Cloud Platformコンソールにログインします。

  • 「APIとサービス > 認証情報」から対象のAPIキーを選択します。

  • 「アプリケーションの制限」セクションで、FirebaseのSHA-1ハッシュ値を追加します。

ADDを押すとパッケージ名とSHA-1フィンガープリントを追加することができます
設定の編集が終わったら保存を押すこと。環境によってはスクロールしないと見えないことがあります

  1. 問題が出ていたアプリをインストールしたテストデバイスで地図が正しく表示されることを確認します。
他社ライブラリの問題

ライブラリ提供元のサポートを受けました。

まとめ

本記事では、AAB対応時に発生した2つの問題とその解決方法を紹介しました。

AABビルドとAPKビルドで署名を切り替える必要がある問題

Gradleでビルドタイプに応じて署名を切り替える方法を紹介しました。

Firebase App DistributionでAABファイルを配信した際の署名問題

Firebaseの署名証明書をGoogle Maps APIキーに追加することで解決しました。

最後に

今回の問題、特にFirebase App Distributionでの署名問題はアプリの署名による影響であることに気づくまでに意外と時間がかかりました。
これからAAB対応を行う方は署名による問題が起きうるんだ、ということを心に留めておくと問題の解決に役立つかもしれません。

今後も記事を投稿していきますので、是非「読者になる」で応援していただけると嬉しいです!よろしくお願いします。