在android的build.gradle中创建和访问productFlavor变量

时间:2016-10-07 07:40:19

标签: android gradle android-gradle build.gradle hockeyapp

我有一个由CI构建并发布到HockeyApp的多风味项目。 每种风味都有 applicationId apiToken ,它存储在风味本身中(将所有重要变量保存在一个地方):

    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-settings:

    hockeyapp {
       apiToken = token
       releaseType = 0
       notify = 0
       status = 1
       notesType = 1
       notes = "Uploaded with gradle"
    }

用于调试我构建的代码&通过终端上传.apk文件:

./gradlew uploadProdReleaseToHockeyApp [...]

不幸的是,prod-flavor的变量标记总是被demo-value覆盖。因此,在每次上传过程后,我都会遇到错误,例如

  

来自HockeyApp的错误响应:无法创建应用程序。

因为gradle尝试使用demo-token上传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'

根据我的要求,是否有一个解决方案来定义flavor-variables并以所示的方式访问它们?

2 个答案:

答案 0 :(得分:2)

在这个特例中,我找到了以下答案:

添加需要修改的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 - 任务中调用,你可以像这样简单地“覆盖”它:

tasks.whenTaskAdded { task ->
    if (task.name == 'uploadDevReleaseToHockeyApp') {
        task.dependsOn 'setDevReleaseApiToken'
    } else if (task.name == 'uploadProdReleaseToHockeyApp') {
        task.dependsOn 'setProdReleaseApiToken'
    }
}

每次调用任务uploadDevReleaseToHockeyApp(手动或通过CI ..)时,都会调用任务setDevReleaseApiToken并分配相关的apiToken。

如果需要,为所有其他版本扩展此架构!

答案 1 :(得分:1)

虽然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提供的构建命令并在里面搜索flavor名称。使用&#34;的条件:生成&#34;仅用于建筑,&#34;:assebmle&#34;用于在设备上运行应用程序。

您在设置文件中创建的任何变量都可以从 build.gradle 文件中访问。

myVariable = gradle.ext.variable

这应该这样做。