当前位置: 首页 > 知识库问答 >
问题:

带多模块android库的Gradle配置

姜嘉荣
2023-03-14

回到历史

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

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

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

在这个重组中,我们设法将lib分解成模块。所以可以说在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_ ....

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

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

对于其构建中的每个额外的模块。gradle提供了一个(“:sdk”),这样就可以使用sdk模块中的所有内容,但实际上不需要在内部编译它。

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

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

这在理论上听起来很棒,但我很难想出一个梯度结构,让我能够轻松地导出所有这些。

我想达到的目标

因此,我希望能够在构建期间生成以下工件:

  • android sdk既包括core又包括extra_1
  • core
  • extra_1
  • 。。。所有其他额外费用

我试过什么

>

使用两个模块中的源集添加核心/旧版BuildType。从未生成2aar

使用两个模块的源集添加核心/传统ProductFlavors。无法编译,因为它找不到从sdk导入的、声明extra_1(其中一些是在annotation processor或lombok期间生成的)

通过编译项目('extra_1')添加核心/传统ProductFlavors。无法编译,因为sdk和extra_1之间存在循环依赖关系。

答复

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

关于这种方法的一个警告是关于maven发布插件的配置。通常情况下,您需要一个发布对象,其中包含发布和一个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)
                }
            }

这种方法的问题在于依赖性。版本(在末尾)未指定,因此它会生成一个带有

这里的解决方案很简单,用脚本上的变量替换late,并使用正确的版本号。我的看起来像:

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

共有1个答案

唐经国
2023-03-14
匿名用户

你应该这样做:

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

core/build中。格雷德尔

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

extra/build中。格雷德尔

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

在android sdk/build中。格雷德尔:

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

 类似资料:
  • 我试图在一个多模块的gradle项目中使用Springdoc,但我无法使它工作。有人做过类似的事情吗? 我的Gradle项目结构如下: My project 应用程序 与模块1相同 Application模块依赖于每个模块项目和 在API子模块上有:

  • 我有一个带有多个模块的gradle(Android)库,有些模块依赖于其他模块(与这里的答案非常相似)https://stackoverflow.com/a/41761846/906362) 这对开发很有用,因为我可以对任何模块进行更改,并看到它们反映在其他模块上。但是要将构建发布到,我需要依赖项作为它们的在线版本。比如: 因此,当它被添加到项目中时,它正确地引用了在上找到的版本,而不是在使用时添

  • 我正在开发一款多味。(下面是gradle文件) 它使用一个名为的库,遵循相同的风格和 现在,对于棘手的部分,有一个名为的新模块,这个模块没有味道,但它需要作为依赖项 app.gradle: 追踪器。格拉德尔: 特色格拉德尔: 以下是我尝试渐变同步时出现的:

  • 多模块项目具有具有以下依赖关系的模块:web- 我在web模块中添加了sping-boo-gradle-plugin: 当SpringBootGradle插件下载旧的hibernate版本时,我在持久性模块中有重复的版本。 形象 我尝试覆盖web模块中的hibernate依赖项,它正在工作: 形象 为什么插件下载旧的Hibernate版本?是否有任何可能排除旧的Hibernate版本从sping-

  • 本文向大家介绍android-gradle 模块依赖,包括了android-gradle 模块依赖的使用技巧和注意事项,需要的朋友参考一下 示例 在多项目中gradle build,您可以与构建中的另一个模块具有依赖关系。 例: 该compile project(':mylibrary')行将名为“ mylibrary”的本地Android库模块声明为依赖项,并要求构建系统在构建应用程序时编译并包

  • 我正在开发一个使用以下依赖项的Android项目: 但是,此依赖项有2个模块javax/注入的定义,如gradle依赖项树中所示: 当尝试运行Android应用程序时,我收到错误: 我尝试排除这些模块中的任何一个,但这不起作用,因为依赖项依赖于它们来进行方法调用。 有没有其他解决方案来解决这一冲突?