ビルドタイプとフレーバーを介して同じコードベースを共有するFirebaseプロジェクトがいくつかあります。 Gradleを介したアプリ配布を使用し、サービスアカウントの資格情報を使用して認証することを目指しています。
docs では、firebaseAppDistribution
ブロックを使用してパラメーターを構成でき、サービス資格情報ファイルのパスがその1つであることが示されています。各バリアントはFirebaseプロジェクトであり、各プロジェクトには独自のサービス認証情報があるため、私が理解できる限り、Gradle構成で個別のサービス認証情報ファイルパスを指定する必要があります。
バリアントに応じてgradleタスクでファイルパスを更新しようとしましたが、機能しませんでした。現在のビルドファイルは次のようになります。
...
apply plugin: 'com.google.firebase.appdistribution'
class StringExtension {
String value
StringExtension(String value) {
this.value = value
}
public void setValue(String value) {
this.value = value
}
public String getValue() {
return value
}
}
Android {
...
productFlavors.whenObjectAdded {
flavor -> flavor.extensions.create("service_key_prefix", StringExtension, '')
}
productFlavors {
flavor1 {
...
service_key_prefix.value = "flavor1"
}
flavor2 {
...
service_key_prefix.value = "flavor2"
}
}
buildTypes {
debug {
firebaseAppDistribution {
releaseNotesFile = file("internal_release_notes.txt").path
groupsFile = file("group_aliases_debug_fb.txt").path
}
}
release {
firebaseAppDistribution {
releaseNotesFile = file("release_notes.txt").path
groupsFile = file("group_aliases_prod_fb.txt").path
}
}
}
}
...
Android.applicationVariants.all { variant ->
task("firebaseCredentials${variant.name.capitalize()}", overwrite: true) {
variant.productFlavors.each { flavor ->
doLast {
firebaseAppDistribution {
def serviceKeyFile = file(
"../${flavor.service_key_prefix.value}-${variant.buildType.name}-service-key.json")
if (serviceKeyFile != null) {
serviceCredentialsFile = serviceKeyFile.path
}
}
}
}
}
}
Android.applicationVariants.all { variant ->
def distTask = tasks.named("appDistributionUpload${variant.name.capitalize()}")
def configTask = tasks.named("firebaseCredentials${variant.name.capitalize()}")
distTask.configure {
dependsOn(configTask)
}
}
apply plugin: 'com.google.gms.google-services'
タスクは正しく実行されているようですが、appDistributionUpload
を実行すると次のエラーが発生するため、ファイルパスは更新されていないと思います。
資格情報が見つかりませんでした。認証するには、いくつかのオプションがあります。
Gradleプラグインで
serviceCredentialsFile
プロパティを設定しますFIREBASE_TOKEN環境変数を使用して更新トークンを設定します
FirebaseCLIでログインします
GOOGLE_APPLICATION_CREDENTIALS環境変数を使用してサービス資格情報を設定します
そのような配布構成を実現する方法についてのアイデアはありますか?
バリアントごとに異なるserivceAccountファイルを定義する必要が本当にありますか?それとも、フレーバー/ビルドタイプごとに別々のファイルを用意するだけで十分ですか?
buildType
とproductFlavors
は、評価フェーズの後に実行されるAndroid.applicationVariants
を介してアクセスされる場合、読み取り専用であるためです。ただし、gradleの構成フェーズで、BuildTypeまたはFlavorの値を直接設定できます。
現在、これが私がそれを機能させる唯一の方法です。
BuildTypes:
Android.buildTypes.all{
File serviceAccountFile = file("/path/to/file-${it.name}.json")
if (serviceAccountFile.exists()) {
it.firebaseAppDistribution {
serviceCredentialsFile = serviceAccountFile.path
}
}
}
フレーバー:
Android.productFlavors.all{
File serviceAccountFile = file("/path/to/file-${it.name}.json")
if (serviceAccountFile.exists()) {
it.firebaseAppDistribution {
serviceCredentialsFile = serviceAccountFile.path
}
}
}