gpt4 book ai didi

android - 使用多模块 android 库的 Gradle 配置

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:26 25 4
gpt4 key购买 nike

回溯历史

我有这个 android 库 aar开发人员可以正常使用

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

现在我们正在从头开始重写库以创建 V3。

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

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_ ....

这将为 gradle 结构提供以下模块:

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

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

但我还想为现有主机应用程序提供一个简单的迁移路径。意思是,我希望在 V3 上也有以下结合了 core 的 Artifact 和 extra_1 (这基本上就是当前 V2 上的内容)。

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

这一切在理论上听起来都很棒,但我真的很难找到一个 gradle 结构来让我轻松导出所有这些。

我想要实现的目标

所以我希望能够在构建过程中生成以下 Artifact :

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

我尝试了什么

  • 添加一个名为 legacy 的额外模块, 申请 com.android.library没有任何代码并添加 compile project对于其他两个模块。它生成一个空的 aar

  • 使用来自两个模块的 sourceSets 添加核心/遗留 buildTypes。从未生成 2 aar

  • 使用来自两个模块的 sourceSets 添加核心/遗留 productFlavours。无法编译,因为它找不到来自 sdk 的导入声明为 extra_1 (其中一些是在注释处理器或lombok期间生成的)

  • 使用 compile project('extra_1') 添加核心/遗留 productFlavours .无法编译,因为 sdk 和 extra_1 之间存在循环依赖。

回答

基于 Gabrielle 的回答,我最终进行了更多挖掘,发现创建具有依赖项的额外模块的选项是正确的。它将生成一个包含空 list 和空类的 AAR。但重要的部分是它将生成的 POM 文件,其中将包含正确的依赖项。

有关该方法的警告是关于 maven-publish 的配置插入。通常你需要一个 publishing对象 publications和一个 pom.withXml节点。我的情况如下:

   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')
}

关于android - 使用多模块 android 库的 Gradle 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41761083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com