带有多模块android库的渐变配置



回溯历史

我有这个android库aar,开发者可以正常使用

compile 'com.companyname.sdk:android-sdk:2.x'

现在我们从头开始重写这个库来创建V3。

在这次重组中,我们设法将库分解为多个模块。所以可以说,在V3上,我们会有以下工件

compile 'com.companyname.sdk:core:3.x'
compile 'com.companyname.sdk:extra_1:3.x'
compile 'com.companyname.sdk:extra_2:3.x'
compile 'com.companyname.sdk:extra_ ....

这将在梯度结构上给出以下模块:

root:
|- test_app (apk just for testing, not deployed anywhere)
|- sdk (aka: core)
|- extra_1
|- extra_2
|- extra_ ... etc

对于build.gradle上的每个extra模块,都有一个provided (':sdk'),因此它们可以使用sdk模块中的所有内容,但实际上并不在自己内部编译。

但我也想为现有的主机应用程序提供一个简单的迁移路径。也就是说,我希望在V3上也有以下结合了coreextra_1的工件(基本上就是V2上的工件)。

compile 'com.companyname.sdk:android-sdk:3.0.0'

从理论上讲,这一切听起来都很棒,但我很难弄清楚一个等级结构,让我可以轻松地导出所有这些。

我想要实现的目标

因此,我希望能够在构建过程中生成以下工件:

  • android-sdk,包括coreextra_1
  • core
  • extra_1
  • 。。。所有其他额外费用

我试过什么

  • 添加一个名为legacy的额外模块,应用不带任何代码的com.android.library,并为其他两个模块添加compile project。它生成一个空的aar

  • 使用两个模块的sourceSet添加核心/遗留构建类型。从未生成2个aar

  • 从两个模块添加带有sourceSet的核心/遗留产品Flavors。不编译,因为它找不到sdk中声明到extra_1中的导入(其中一些是在注释处理器或lombok期间生成的)

  • 添加核心/遗留产品Flavors与compile project('extra_1')。不编译,因为sdk和extra_1之间存在循环依赖关系。

回答

根据加布里埃尔的回答,我最终挖掘了更多,发现创建一个具有依赖关系的额外模块的选项是正确的。它将生成一个带有空清单和空类的AAR。但重要的部分是它将生成的POM文件,该文件将包括正确的依赖项。

关于这种方法的一个警告是关于maven-publish插件的配置。通常,您需要一个带有publicationspom.withXml节点的publishing对象。我的是这样的:

pom.withXml {
def root = asNode()
def license = root.appendNode('licenses').appendNode('license')
license.appendNode('name', 'The Apache Software License, Version 2.0')
license.appendNode('url', 'http://www.apache.org/licenses/LICENSE-2.0.txt')
license.appendNode('distribution', 'repo')
def dependenciesNode = asNode().appendNode('dependencies')
configurations.compile.allDependencies.each { dependency ->
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dependency.group)
dependencyNode.appendNode('artifactId', dependency.name)
dependencyNode.appendNode('version', dependency.version)
}
}

这种方法的问题是dependency.version(最后)是未指定的,因此它生成了一个带有<version>unspecified</version>的POM文件。

解决方案很简单,你可以用你在脚本上的一些变量替换late,并使用正确的版本号。我的看起来像:

dependencyNode.appendNode('version', "${rootProject.ext.SDK_VERSION}")

您应该这样做:

root:
|- test_app (apk just for testing, not deployed anywhere)
|- core 
|- extra_1
|- extra_2
|- extra_ ... etc
|- android-sdk

core/build.gradle:中

apply plugin: 'com.android.library'
//...

extra1/build.gradle:中

apply plugin: 'com.android.library'
//...
dependencies {
compile project(':core')
}

android-sdk/build.gradle:中

apply plugin: 'com.android.library'
//...
dependencies {
compile project(':core')
compile project(':extra')
}

最新更新