每个产品口味多个 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 将自动复制到您的应用程序模块的根文件夹。
我能够做到这一点的唯一方法是绕过 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");
我认为这是针对此主题提出的其他问题的变体。
我有两种产品口味。我在不同的环境中部署我的应用程序,每个环境都与不同的 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 将自动复制到您的应用程序模块的根文件夹。
我能够做到这一点的唯一方法是绕过 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");