web-dev-qa-db-ja.com

Android Firebase App Distributionを使用したビルドバリアント)ごとに個別のserviceCredentialsFileを構成する方法はありますか?

ビルドタイプとフレーバーを介して同じコードベースを共有する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を実行すると次のエラーが発生するため、ファイルパスは更新されていないと思います。

資格情報が見つかりませんでした。認証するには、いくつかのオプションがあります。

  1. GradleプラグインでserviceCredentialsFileプロパティを設定します

  2. FIREBASE_TOKEN環境変数を使用して更新トークンを設定します

  3. FirebaseCLIでログインします

  4. GOOGLE_APPLICATION_CREDENTIALS環境変数を使用してサービス資格情報を設定します

そのような配布構成を実現する方法についてのアイデアはありますか?

4
Emre Dirican

バリアントごとに異なるserivceAccountファイルを定義する必要が本当にありますか?それとも、フレーバー/ビルドタイプごとに別々のファイルを用意するだけで十分ですか?

buildTypeproductFlavorsは、評価フェーズの後に実行される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
        }
    }
}
0
Pfennigbaum