【Account Manager】Google Play App Signingで署名を統一後、Account Manager経由のアプリ間データ連携ができない
Google Play App Signingで署名を統一後、AccountManager経由のアプリ間データ連携ができない
はじめに
Kotlin製の既存Androidアプリと、Flutterで新規開発中のAndroidアプリ間で AccountManager を用いたデータ共有を実装しています。
ローカル環境でビルドしたAPKではデータ共有に成功するものの、Google Play Console経由で内部テストとして配信したアプリ(aabから生成)では、署名を統一したにもかかわらず共有に失敗してしまいます。
この問題について、考えられる原因や解決のヒントをご教示いただきたく、質問させていただきます。
環境
-
アプリA
- 言語: Kotlin
- 状態: リリース済み
- Android SDK API: 35
-
アプリB
- フレームワーク: Flutter 3.32.2 / Dart 3.8.1
- 状態: 開発中
- Android SDK API: 36
- プラットフォーム: Android
実現したいこと
アプリAでサーバーから取得した認証情報などのデータを、AccountManager を用いてアプリBと安全に共有したい。
試したことと発生している問題
1. ローカル環境での動作確認【成功】
-
AccountManagerを利用したアプリ間連携には署名の統一が必須であるため、アプリAとアプリBで同じアップロードキー署名を使用しました。 - ローカルでビルドしたAPKファイルを直接端末にインストールして動作確認を行ったところ、意図通りデータ共有に成功しました。
2. Google Play Consoleへのアップロードと署名設定
- アプリAとアプリBを、同一のデベロッパーアカウントに
aab(Android App Bundle) 形式で内部テストとしてアップロードしました。 - Google Play App Signingによる再署名を考慮し、アプリBのアップロード時に 「アプリ署名鍵の変更」から「このデベロッパー アカウントの別のアプリと同じ鍵を使用する」を選択し、アプリAの署名鍵を指定しました。
- これにより、Play Storeから配信される両アプリの署名は統一されているという認識です。
3. 内部テスト版での動作確認【問題発生】
- Play Storeの内部テストトラックから、アプリAとアプリBを同一端末にインストールしました。
- 再度データ共有を試みたところ、共有に失敗しました。
4. 配信されたアプリの署名確認
- 問題の切り分けのため、内部テストで配信された両アプリの署名フィンガープリントをツールで抽出し、比較しました。
- その結果、以下の項目がアプリAとアプリBで完全に一致していることを確認済みです。
Signer #1 certificate SHA-256Signer #1 certificate SHA-1Signer #1 certificate MD5Source Stamp Signer certificate SHA-256Source Stamp Signer certificate SHA-1Source Stamp Signer certificate MD5
参考:アプリB(Flutter側)のMainActivity.kt
アプリB(Flutter)でMethodChannelを介してAccountManagerからデータを取得しているネイティブコードは以下の通りです。
package com.test.app
import android.util.Log
import android.accounts.Account
import android.accounts.AccountManager
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
class MainActivity: FlutterActivity(){
companion object {
private const val TAG = "MainActivity"
}
private val CHANNEL = "com.test.app/account"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine){
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler{
call, result ->
if (call.method == "getTestData"){
val testData = getTestData()
if (testData != null){
result.success(testData)
} else {
result.success(null)
}
} else {
result.notImplemented()
}
}
}
private fun getTestData(): String? {
val accountManager = AccountManager.get(context)
val accounts = accountManager.getAccountsByType("com.test.app")
if (accounts.isNotEmpty()){
val account = accounts[0]
val userData = accountManager.peekAuthToken(account, "testData")
return userData
}
return null
}
}
質問
ローカルのAPKでは成功し、Play Store経由(aab)の配信版では失敗するという状況です。
アプリの署名は配信段階で一致していることを確認しましたが、他にどのような原因が考えられるでしょうか?
Google Play App Signingの仕様や AccountManager の挙動、あるいは aab 形式特有の問題など、何か見落としている可能性がありましたらご指摘いただけますと幸いです。
もし原因の切り分けにあたり、他に確認すべき点や、提示すべき追加情報(AndroidManifest.xml の設定やコードの一部など)がありましたら、お申し付けください。
よろしくお願いいたします。
0 likes