每个产品口味多个 google-services.json

Multiple google-services.json Per Product Flavour

我认为这是针对此主题提出的其他问题的变体。

我有两种产品口味。我在不同的环境中部署我的应用程序,每个环境都与不同的 Firebase 项目对话。因此,对于每种风格,我需要能够针对特定环境(开发、测试、生产等)

有没有一种方法,我可以在不引入新产品风味的情况下制作 select 适当 google-services.json 文件的风味的构建变体?也许我以错误的方式解决了这个问题...

首先,将每个 buildType 的相应 google_services.json 放置在以下位置:

app/src/debug/google_services.json
app/src/main/google_services.json

现在,让我们在您的 :app 的 build.gradle 中启动一些 gradle 任务,以自动将适当的 google_services.json 移动到 app/google_services。json

task switchToDebug(type: Copy) {
    description = 'Switches to DEBUG google-services.json'
    from "src/debug"
    include "google-services.json"
    into "."
}

task switchToRelease(type: Copy) {
    description = 'Switches to RELEASE google-services.json'
    from "src/release"
    include "google-services.json"
    into "."
}

太好了 但是在构建应用程序之前必须手动 运行 这些任务很麻烦。我们希望在 :assembleDebug 或 :assembleRelease 为 运行 之前的某个时间在 运行 之上执行适当的复制任务。让我们看看当 :assembleRelease 为 运行:

时会发生什么
Zaks-MBP:my_awesome_application zak$ ./gradlew assembleRelease
Parallel execution is an incubating feature.
.... (other tasks)
:app:processReleaseGoogleServices
....
:app:assembleRelease

注意 :app:processReleaseGoogleServices 任务。该任务负责处理根 google_services.json 文件。我们希望处理正确的 google_services.json,因此我们必须立即 运行 我们的复制任务。 将此添加到您的 build.gradle。注意 afterEvaluate 封闭。

afterEvaluate {
    processDebugGoogleServices.dependsOn switchToDebug
    processReleaseGoogleServices.dependsOn switchToRelease
}

现在,无论何时调用 :app:processReleaseGoogleServices,我们新定义的 :app:switchToRelease 都会被预先调用。调试 buildType 的逻辑相同。您可以 运行 :app:assembleRelease 并且发布版本 google_services.json 将自动复制到您的应用程序模块的根文件夹。

https://medium.com/google-cloud/automatic-per-variant-google-services-json-configurations-with-gradle-d3d3e40abc0e

我能够做到这一点的唯一方法是绕过 google-services.json 的使用并动态创建 FirebaseApp 实例,例如

    if (<is dev>) {
        apiKey = <dev api key>;
        databaseUrl = <dev database url>;
    } else if (<is test> {
        apiKey = <>;
        databaseUrl = <>;
    } else // production {
        apiKey = <>;
        databaseUrl = <>;
    }


    FirebaseOptions firebaseOptions = new FirebaseOptions.Builder()
            .setApiKey(apiKey)
            .setApplicationId(context.getString(R.string.google_app_id))
            .setDatabaseUrl(databaseUrl)
            .build();

    return FirebaseApp.initializeApp(context, firebaseOptions, "MyApp");