繁体   English   中英

Gradle Android依赖产品口味

[英]Gradle Android dependency product flavors

我想知道根项目是否有办法在其依赖项中定义/注入一些属性。 更具体地说,我遇到的问题是库项目必须知道在运行汇编/编译任务之前是否采用“自由”或“专业”java源和其他资源。 有点像为库项目指定产品风格(从它的父项目继承),但Gradle的Android插件不支持。 更改库项目结构,即创建“免费”和“专业”库不是一种选择。

编辑:到目前为止我设法达到的最好成绩是这样的:

root: build.gradle

android {
    ...

    productFlavors {
        free, pro
    }

    sourceSets {
        free {
            project(':..:lib') {
                groupFreePro = 'free'
                // java.srcDirs = ['src', 'free/src']
             }
        }

        pro {
            project(':..:lib') {
                groupFreePro = 'pro'
                // java.srcDirs = ['src', 'pro/src']
            }
        }
    ...
    }
}

library: gradle.build

android {
    ...
    sourceSets {
        main {
                  java.srcDirs = [groupFreePro + '/src']
                  res.srcDirs = [groupFreePro + '/res']
             }
        }
    ...
    }
}

这样我将groupFreePro变量注入lib项目。 但这种方法存在问题:

当lib项目得到它的android - > sourceSets任务时,groupFreePro总是被设置为“pro”。 我认为这是因为根项目中的所有sourceSet都被读取(而不仅仅是我想要构建的一个变体;例如“free”)因此最后一个set / task总是覆盖任何先前设置的groupFreePro值。

如果我尝试以任何其他方式设置groupFreePro的值,它会被覆盖(如上例所示),或者我不知道应该调用此变量注入的东西来将变量设置为适当的任务/时间/地点期望值。 在根项目中取消注释java.srcDirs也无济于事。

我尝试自己解决这些问题,但我对Gradle很新,而且缺乏适当的文档(至少对于Android部分而言)让我猜测大部分时间都要做什么,所以我做了很多试验和错误(但现在我有点卡住)。

这就是我现在解决问题的方法。 它不是一个完美的解决方案,但它现在已经足够好了。

更新!

我已经更新了答案,包括最新的0.9.2 Gradle插件和它的新(est)功能(大多只更新了库构建脚本)。

root: gradle.build

// global variables
ext {
    // can be set to default values or blank
    groupFreePro = "free"
}

// start parameters
println "Start parametes: tasks = " + gradle.startParameter.getTaskNames()

gradle.startParameter.getTaskNames().each { task ->
    if (task.contains("Free") || task.contains("F")) {
        groupFreePro = "free"
    } else if (task.contains("Pro") || task.contains("P")) {
        groupFreePro = "pro"
    }
    println "groupFreePro = " + groupFreePro
}

android {
...
}

task.contains("F")用于处理缩写版本或运行任务(如果我们想将脚本作为gradle aFD运行)。

ext下的全局变量可以设置为默认值。 在这种情况下,即使您在任务名称中运行没有“Free / Pro”的脚本,它也应该可以正常工作。 默认值的缺点是,如果未正确设置,构建可能不会崩溃(如果您希望构建仅在指定任务名称中的“Free / Pro”时才能工作)。

library: gradle.build

android {
...
    defaultPublishConfig groupFreePro + groupDebugRelease.capitalize()

    productFlavors {
        free
        pro
    }

    ...
    sourceSets {
        main {
            java.srcDirs = ['/src']
            res.srcDirs = ['/res']
        }

        free {
            java.srcDirs = ["free/src"]
            res.srcDirs = ["free/res"]
        }

        pro {
            java.srcDirs = ["pro/src"]
            res.srcDirs = ["pro/res"]
        }
    }
    ...
}

dependencies {
    freeCompile fileTree(dir: 'free/lib', include: '*.jar')
}

更新:

该库现在包含defaultPublishConfig因此我不需要指定

  java.srcDirs = ["src", groupFreePro + "/src"] res.srcDirs = [groupFreePro + "/res"] 

现在还可以使用自定义风味编译,即flavor1Compile (在dependencies块中)。

dependencies块中编写compile project(path: ':project', configuration: 'flavor1Debug')的选项对我们来说并不真正有效,因为你必须通过依赖项传递这些选项,如果你有多个风味组/维度这个意味着或多或少所有的风味组合必须以“非最后”的依赖关系(即具有其他依赖关系(具有多种风格)的依赖关系)处理。



println行只是为了查看并确保正确的参数通过。

该解决方案的上行空间 (相对于Varun的的)是你需要运行只有一个(原始)任务。 这也意味着它可以(或者至少它应该)与Android Studio一起工作而没有任何问题。

这个解决方案的缺点是,如果你想使用gradle assemble命令(或类似的)来构建所有变量,而gradle assemble命令缺少任务的Free部分,那么它就无法工作。 我想这也可以处理,但我不这样做,因为目前的解决方案对我来说已经足够好了(尽管如果我改进了当前的解决方案,我也可能会更新这个答案)。

使用gradle.taskGraph.whenReady还有其他解决方案,但我不知道如何正确设置srcDirs (特别是依赖项)。 建议欢迎。

LibraryVariant这里ApkVariant

看看上面的DSL ,看起来像LibraryVariant类型不支持多个productFlavors

如果你的free/pro不会有太大变化,你可以为专业人士和免费创建一个aar ,并根据你的应用需要将它们用作依赖项。

更新:

我在github上有一些代码。 它可以工作,但需要在应用程序上调用实际的构建/汇编任务之前调用一个额外的任务。 https://github.com/varunkochar/Trying-Android-Gradle/tree/master/FakeLibraryProductFlavors

更新:

使用最新的android gradle插件v0.9.0,LibraryProject现在也支持与ApplicationProject相同的DSL。 因此,您可以使用最新版本并使用库项目的内置功能来构建自定义风格。 资料来源: http//tools.android.com/tech-docs/new-build-system

此功能现在可在Android版Gradle插件0.9版之后使用。

看看这里: http//tools.android.com/tech-docs/new-build-system/migrating_to_09

复制贴在这里:

图书馆

现在,库项目的DSL与应用程序项目的DSL相同。 这意味着您可以创建更多构建类型并创建风格。
- 您可以在buildTypes {...}容器中创建/配置更多构建类型。
- 您可以使用productFlavors {...}容器创建产品风格。
- 您可以使用signingConfigs {...}容器创建signingConfigs。

例如,如果您在库中:

android {
    debug {
    }
    release {
    }
    debugSigningConfig {
    }
}

您可以将其替换为:

android {
    buildTypes {
        debug {
        }
        release {
        }
    }
    signingConfigs {
        debug {
        }
    }
}

现在可以在android studio 0.5中使用产品风味(需要gradle插件0.9)

所以你现在可以有效地编写这个DSL:

android {
    buildTypes {
        debug {
        }
        release {
        }
    }
    signingConfigs {
        debug {
        }
    }
}

请参阅: http//tools.android.com/tech-docs/new-build-system/migrating_to_09http://tools.android.com/recent/androidstudio050发布

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM