在 android 的 build.gradle 中创建和访问 productFlavor 变量
Create and access productFlavor variables in android's build.gradle
我有一个由 CI 构建并发布到 HockeyApp 的多风格项目。
每个 flavor 都有一个 applicationId 和一个 apiToken,它存储在 flavor 本身中(将所有重要变量保存在一个地方):
def token = null
productFlavors {
prod {
applicationId "de.example.appname"
buildConfigField 'String', 'FLAVOR_ID', '"0"'
buildConfigField 'String', 'HOCKEY_APP_ID', '"1234567890"'
token = "1q2w3e4r5t6z7u8i9o0p"
}
demo {
applicationId "de.example.appname.demo"
buildConfigField 'String', 'FLAVOR_ID', '"1"'
buildConfigField 'String', 'HOCKEY_APP_ID', '"987654321"'
token = "p0o9i8u7z6t5r4e3w2q1"
}
}
在与 "productFlavors" 相同的级别上,有 hockeyApp 设置:
hockeyapp {
apiToken = token
releaseType = 0
notify = 0
status = 1
notesType = 1
notes = "Uploaded with gradle"
}
为了调试代码,我构建并通过终端上传了 .apk 文件:
./gradlew uploadProdReleaseToHockeyApp [...]
不幸的是,prod-flavor 的变量 token 总是被 demo-value 覆盖。所以在每次上传过程后我都会收到类似
的错误
Error response from HockeyApp: App could not be created.
因为 gradle 尝试使用演示令牌上传 prod-flavor。
补充一些基本数据:
compileSdkVersion 24
buildToolsVersion "24.0.1"
compile 'net.hockeyapp.android:HockeySDK:4.0.0'
classpath 'com.android.tools.build:gradle:2.1.3'
classpath 'de.felixschulze.gradle:gradle-hockeyapp-plugin:3.5'
根据我的要求,是否有定义风味变量并以所示方式访问它们的解决方案?
虽然 OP 可能不再寻找答案,但其他人可能会偶然发现这个线程(就像我在处理这个问题时所做的那样)所以我想分享一个解决方案。
我正在处理影响 gradle 过程本身(不是源代码)的变量,所以我不能使用 resValue 或 buildConfigField。
这个问题可以通过使用settings.gradle文件来解决。此文件在 build.gradle 之前执行,因此您可以使用此条件准备所有变量:
include ':project...'
rootProject.name = 'name...'
def VARIANT1 = "YourFlavorName";
if((gradle.startParameter.taskNames.contains(":assemble"+VARIANT1+"Debug"))||
(gradle.startParameter.taskNames.contains(":assemble"+VARIANT1+"Release"))
||
(gradle.startParameter.taskNames.contains(":generate"+VARIANT1+"DebugSources"))||(gradle.startParameter.taskNames.contains(":generate"+VARIANT1+"ReleaseSources"))) {
gradle.ext.variable = value
gradle.ext.var...
}
这有点变通,但它的作用是检查您的 Android Studio 给出的构建命令并在其中搜索风味名称。带有“:generate”的条件仅用于构建,“:assebmle”用于 运行 设备上的应用程序。
您在设置文件中创建的任何变量都可以从您的 build.gradle 文件访问。
myVariable = gradle.ext.variable
这应该可以做到。
在这种特殊情况下,我找到了以下答案:
添加 hockeyapp-task 并根据需要进行修改
hockeyapp {
apiToken = "not_required"
releaseType = 0
notify = 0
status = 2
teams = 1234
notesType = 1
}
下一步添加基于风味的 gradle 任务来修改 hockeyapp 的 apiToken:
task setDevReleaseApiToken << {
hockeyapp.apiToken = "1234567890abcdefghijklmnopqrstuvwxyz"
}
task setProdReleaseApiToken << {
hockeyapp.apiToken = "1234567890abcdefghijklmnopqrstuvwxyz"
}
这些任务在 gradle 的 whenTaskAdded
任务中被调用,您可以简单地 "override" 像这样:
tasks.whenTaskAdded { task ->
if (task.name == 'uploadDevReleaseToHockeyApp') {
task.dependsOn 'setDevReleaseApiToken'
} else if (task.name == 'uploadProdReleaseToHockeyApp') {
task.dependsOn 'setProdReleaseApiToken'
}
}
每次调用任务 uploadDevReleaseToHockeyApp
(手动或通过 CI..)调用任务 setDevReleaseApiToken
并分配相关的 apiToken。
如果需要,为所有其他风格扩展此架构!
我有一个由 CI 构建并发布到 HockeyApp 的多风格项目。 每个 flavor 都有一个 applicationId 和一个 apiToken,它存储在 flavor 本身中(将所有重要变量保存在一个地方):
def token = null
productFlavors {
prod {
applicationId "de.example.appname"
buildConfigField 'String', 'FLAVOR_ID', '"0"'
buildConfigField 'String', 'HOCKEY_APP_ID', '"1234567890"'
token = "1q2w3e4r5t6z7u8i9o0p"
}
demo {
applicationId "de.example.appname.demo"
buildConfigField 'String', 'FLAVOR_ID', '"1"'
buildConfigField 'String', 'HOCKEY_APP_ID', '"987654321"'
token = "p0o9i8u7z6t5r4e3w2q1"
}
}
在与 "productFlavors" 相同的级别上,有 hockeyApp 设置:
hockeyapp {
apiToken = token
releaseType = 0
notify = 0
status = 1
notesType = 1
notes = "Uploaded with gradle"
}
为了调试代码,我构建并通过终端上传了 .apk 文件:
./gradlew uploadProdReleaseToHockeyApp [...]
不幸的是,prod-flavor 的变量 token 总是被 demo-value 覆盖。所以在每次上传过程后我都会收到类似
的错误Error response from HockeyApp: App could not be created.
因为 gradle 尝试使用演示令牌上传 prod-flavor。
补充一些基本数据:
compileSdkVersion 24
buildToolsVersion "24.0.1"
compile 'net.hockeyapp.android:HockeySDK:4.0.0'
classpath 'com.android.tools.build:gradle:2.1.3'
classpath 'de.felixschulze.gradle:gradle-hockeyapp-plugin:3.5'
根据我的要求,是否有定义风味变量并以所示方式访问它们的解决方案?
虽然 OP 可能不再寻找答案,但其他人可能会偶然发现这个线程(就像我在处理这个问题时所做的那样)所以我想分享一个解决方案。
我正在处理影响 gradle 过程本身(不是源代码)的变量,所以我不能使用 resValue 或 buildConfigField。
这个问题可以通过使用settings.gradle文件来解决。此文件在 build.gradle 之前执行,因此您可以使用此条件准备所有变量:
include ':project...'
rootProject.name = 'name...'
def VARIANT1 = "YourFlavorName";
if((gradle.startParameter.taskNames.contains(":assemble"+VARIANT1+"Debug"))||
(gradle.startParameter.taskNames.contains(":assemble"+VARIANT1+"Release"))
||
(gradle.startParameter.taskNames.contains(":generate"+VARIANT1+"DebugSources"))||(gradle.startParameter.taskNames.contains(":generate"+VARIANT1+"ReleaseSources"))) {
gradle.ext.variable = value
gradle.ext.var...
}
这有点变通,但它的作用是检查您的 Android Studio 给出的构建命令并在其中搜索风味名称。带有“:generate”的条件仅用于构建,“:assebmle”用于 运行 设备上的应用程序。
您在设置文件中创建的任何变量都可以从您的 build.gradle 文件访问。
myVariable = gradle.ext.variable
这应该可以做到。
在这种特殊情况下,我找到了以下答案:
添加 hockeyapp-task 并根据需要进行修改
hockeyapp {
apiToken = "not_required"
releaseType = 0
notify = 0
status = 2
teams = 1234
notesType = 1
}
下一步添加基于风味的 gradle 任务来修改 hockeyapp 的 apiToken:
task setDevReleaseApiToken << {
hockeyapp.apiToken = "1234567890abcdefghijklmnopqrstuvwxyz"
}
task setProdReleaseApiToken << {
hockeyapp.apiToken = "1234567890abcdefghijklmnopqrstuvwxyz"
}
这些任务在 gradle 的 whenTaskAdded
任务中被调用,您可以简单地 "override" 像这样:
tasks.whenTaskAdded { task ->
if (task.name == 'uploadDevReleaseToHockeyApp') {
task.dependsOn 'setDevReleaseApiToken'
} else if (task.name == 'uploadProdReleaseToHockeyApp') {
task.dependsOn 'setProdReleaseApiToken'
}
}
每次调用任务 uploadDevReleaseToHockeyApp
(手动或通过 CI..)调用任务 setDevReleaseApiToken
并分配相关的 apiToken。
如果需要,为所有其他风格扩展此架构!