【问题标题】:Create and access productFlavor variables in android's build.gradle在 android 的 build.gradle 中创建和访问 productFlavor 变量
【发布时间】:2016-10-07 07:40:19
【问题描述】:

我有一个由 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 的变量 token 总是被 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'

根据我的要求,是否有定义风味变量并以所示方式访问它们的解决方案?

【问题讨论】:

  • 这似乎与this unanswered question 相同。另请参阅this thread,它可能会提供解决方案。
  • 嘿,找到任何解决方案了吗?我正在寻找相同的解决方案。
  • @iMDroid 看看我的正确标记答案 ;-)
  • @JU5T1C3 太好了。非常感谢。

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


【解决方案1】:

在这种特殊情况下,我找到了以下答案:

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

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

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

如果需要,将此架构扩展到所有其他风格!

【讨论】:

    【解决方案2】:

    虽然 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
    

    应该这样做。

    【讨论】:

      猜你喜欢
      • 2018-08-14
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2011-09-12
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多