実現したいこと
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
エラーメッセージ
error
1エラーメッセージはありません。
該当のソースコード
### 参考:アプリ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 } }
### 試したこと・調べたこと - [ ] teratailやGoogle等で検索した - [x] ソースコードを自分なりに変更した - [ ] 知人に聞いた - [ ] その他 ##### 上記の詳細・結果 ※「どんな問題が発生していますか?」に記載しております。 ### 補足 特になし
あなたの回答
tips
プレビュー