我想知道是否有一种方法可以让根项目在其依赖项中定义/注入一些属性。更具体地说,我遇到的问题是库项目必须知道在运行组装/编译任务之前是采用“免费”还是“专业”java源和其他资源。有点像为库项目指定产品风格(继承自其父项目),但Gradle的Android插件不支持这一点。更改库项目结构,即创建“免费”和“专业”库不是一个选项。
编辑:到目前为止,我所取得的最好成绩是这样的:
根: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']
}
}
...
}
}
图书馆:gradle.build
android {
...
sourceSets {
main {
java.srcDirs = [groupFreePro + '/src']
res.srcDirs = [groupFreePro + '/res']
}
}
...
}
}
这样我将groupFreePro变量注入到lib项目中。但是这种方法有一个问题:
到时候,当lib项目到达它的android-
如果我尝试以任何其他方式设置groupFreePro的值,它要么被覆盖(就像上面的情况一样),要么我不知道我应该调用这个变量注入的适当任务/时间/地点来将变量设置为所需的值。在根项目中取消注释java. srcDir
也没有帮助。
我试图自己解决这些问题,但我对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.包含("F")
用于处理缩写版本或运行任务(如果我们想以gradle aFD
的形式运行脚本)。
ext
下的全局变量可以设置为默认值。在这种情况下,即使您在任务名称中没有“Free/Pro”的情况下运行脚本,它也应该可以正常工作。默认值的缺点是如果设置不正确,构建可能不会崩溃(如果您希望构建仅在指定任务名称中的“Free/Pro”时才能工作)。
图书馆: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')
}
java.srcDirs = ["src", groupFreePro + "/src"]
res.srcDirs = [groupFreePro + "/res"]
此外,现在还使用自定义风格编译,即flizor1Compile
(在依赖项
块中)。
在依赖项
块中编写compile project(path:': project',配置:'flizor1Debug')
的选项对我们来说并不真正有效,因为您必须通过依赖项传递这些选项,如果您有多个风味组/维度,这意味着或多或少所有的风味组合都必须在“非最后”依赖项中处理(即具有其他依赖项(具有多种风味)的依赖项)。
println
行只是为了查看并确保传递了正确的参数。
这个解决方案的好处(与Varun的相比)是您只需要运行一个(原始)任务。这也意味着它可以(或者至少应该)与Android Studio一起使用,没有任何问题。
这个解决方案的缺点是,如果你想使用gradle汇编
命令(或类似命令)构建所有变体,但缺少任务的Free
部分,它就不起作用。我想这也可以处理,但我不会这样做,因为目前的解决方案对我来说已经足够好了(尽管如果我改进了当前的解决方案,我可能也会更新这个答案)。
使用gradle. taskGraph.whenReady
还有其他解决方案,但我不知道如何正确设置srcDir
(尤其是依赖项)。欢迎建议。
此功能现在在适用于Android的Gradle插件版本0.9之后可用。
看看这里:http://tools.android.com/tech-docs/new-build-system/migrating_to_09
在此处复制粘贴:
图书馆
库项目的DSL现在与应用程序项目相同。这意味着您可以创建更多构建类型并创建风格。
-您可以在buildTypes{…}容器中创建/配置更多构建类型。
-您可以使用productFlavors{…}容器创建产品风格。
-您可以使用signingConfigs{…}容器创建signingConfigs。
例如,如果您的图书馆中有:
android {
debug {
}
release {
}
debugSigningConfig {
}
}
您可以将其替换为:
android {
buildTypes {
debug {
}
release {
}
}
signingConfigs {
debug {
}
}
}
这是LibraryVariant
,这是ApkVariant
查看上面的DSL
看起来LibraryVariant
类型不支持多个productFlavors。
如果您的free/pro
不会有太大变化,您可以为pro和free创建一个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