経緯
AndroidでKarteの接客サービスの表示テストをしている時、内部テストで配布した場合のみ表示ができない問題がありました。
直接エミュレーター・実機にビルドする場合は問題なく表示できます。
原因
原因は配布しているapkファイルのBuild TypesがReleaseになっていて、KarteのAPIキーが検証環境用になっていなかったのが原因でした。
つまりStagingと思って配布していたのがReleaseに向いていて本番環境用のAPIキーがセットされていることで、Karteの検証環境では接客サービスが表示されないということでした。
なぜ間違えたのか…
fastlaneでapkファイルを作成しているのですが、BuildTypesにDebug・Releaseなどがあると、作成時にそれぞれDebug・Releaseのapkファイルが作成されているようです。
apkファイル作成時に、メッセージを出しているのですが、
desc "APKを作成します"
desc "bundle exec fastlane apk"
lane :apk do
gradle(task: "clean")
gradle(
task: "assemble",
flavor: ENV["PRODUCT_FLAVOR"],
build_type: ENV["BUILD_TYPE"],
properties: {
...
}
)
UI.success("✨Generated apk: #{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]}")
end
UI.successで指定している“SharedValues::GRADLE_APK_OUTPUT_PATH”がどうやら最後に生成したapkファイルしか出力してくれないようで、
実際はDebug・Releaseごとに作成されてるのですが、Releaseのみしかメッセージで出力していなかったのが気づきにくい原因でした。
✨Generated apk: "/Users/xxx/xxx/android/app/build/outputs/apk/stg/release/app-stg-release.apk"
とすると
$ open /Users/xxx/xxx/android/app/build/outputs/apk/stg/release/
上記のようにディレクトリをopenをしたくなります。
この場合、stg以下にreleaseとdebugディレクトが作成されてるのですが、気づきにくいです。
解決策として
1. gradle(build_type: xxx)に”Debug”を指定する
build_type:を指定すると、指定したBuildTypeのapkファイルのみ作成されます。
ポイントは”Debug”にする、”debug”だと上手くいかないです。
配布するBuildTypeが決まっているなら.envファイルに記入してもいいかもしれないです。
2. UI.successの出力にSharedValues::GRADLE_ALL_APK_OUTPUT_PATHSを使う
もしくはメッセージを出力する際にSharedValues::GRADLE_ALL_APK_OUTPUT_PATHS を指定すれば複数のBuild Typesのパスが表示されましたので気づけそうです。
https://docs.fastlane.tools/actions/build_android_app/
余談
Fastlaneのログをよくみてみると、実態はgradlewに対して、assemblestgというコマンドを実行しています。
$ /Users/xxx/xxx/{プロジェクトのroot}/gradlew assemblestg ...
$ ./gradlew tasks
このコマンドの中身はAndroidのルートディレクトリで、
を実行するとタスクの一覧が見ることができます。
https://qiita.com/suin/items/1dc1b76b60246a45fac9
ちなみにBuildTypesを指定しないときに実行されるassembleStgは以下のように説明されてます。
$ ./gradlew tasks
> Task :tasks
------------------------------------------------------------
Tasks runnable from root project 'xxx'
------------------------------------------------------------
...
Build tasks
-----------
assembleStg - Assembles main outputs for all Stg variants.
// すべてのStgバリアント用のメイン出力をアセンブルします。
なるほど、これは全てのStgバリアントのapkファイルを出力してくれます、ということなんだと思います。