我有:
3
4.1
classpath 'com.android.tools.build:gradle:3.0.1'
当我有一个模块并使用了gradle工具2时,我使用了:
task makeJar(type: Copy) {
def releaseFolder = new File('build/intermediates/bundles/release/')
if (releaseFolder.exists()) {
from('build/intermediates/bundles/release/')
} else {
from('build/intermediates/bundles/default/')
}
into('build/outputs/jar/')
include('classes.jar')
rename ('classes.jar', 'MY-Android-SDK.jar')
}
现在有3个模块:
MainModule (com.my)
/ \
(com.my.m1) Module1 Module2 (com.my.m2)
我想从所有3个模块创建MY-Android-SDK.jar
文件。
到目前为止,我将能够为每个模块创建3个jar文件并以某种方式合并它们,但我认为它不是正确的方法。
有什么想法吗?
答案 0 :(得分:3)
首先,如果您要创建Android库,请创建AAR,而不是JAR。 AAR文件遵循android SDK结构,可以有清单文件,因此需要权限和xml资源等。
其次,如果你是从几个不同的模块创建一个框架(实际上是一个非常合理的方法!),你应该创建不同的工件(AAR / JAR文件)。这样可以更容易处理传递依赖,SDK级别冲突,只消耗你需要的东西(有些情况下你不需要一半的SDK,在这种情况下丢弃gradle文件中的一些条目比摆弄它更容易proguard删除所有未使用的类),提供替代实现或可插拔系统(例如,您创建一个合同模块,比如DFP,以及双击模块。然后,通过Inversion of Control,您使用double填写合同点击,下个月,他们会要求您用亚马逊广告替换双击。您可以在合同模块后创建一个包含亚马逊广告的模块,并替换亚马逊注入的双击参考。)
无论如何,请记住传递性。根据您带来依赖项的方式,可以使用build.gradle文件中的单个依赖项将所有内容添加到路径中。如果您使用'api':
api 'com.myname:moduleX:xxx'
在模块com.myname:moduleY中,moduleX也将在路径中。首先使用Gradle maven plugin创建工件。这将允许您使用“安装”任务创建一个Android AAR文件,并将其部署到您的本地maven仓库(gradle中的mavenLocal())。如果使用“api”包含所有子模块,它们将被添加到路径中。我不建议这样做,而是只导入每个模块中的必要内容,并为每个模块创建单独的AAR文件,并在您的应用中使用它们。
现在,如果由于某种原因,你需要创建一个胖/优步JAR,那么这个过程就叫做“着色”。所以,你需要一个用于gradle的阴影插件。幸运的是,有一个few。只需选择最适合您的情况(或使用maven和maven shade插件)。无论如何,作为具有开发库和框架经验的人,请尽可能保持模块的原子性和独立性。最后,如果你需要一个gradle maven插件的工作示例,请尝试this,它是旧的,但作为一个例子。祝你好运!
答案 1 :(得分:1)
在settings.gradle
中添加其他两个模块的依赖关系
<强> settings.gradle 强>
rootProject.name = 'MainModule'
include 'module2'
include 'module3'
在属于build.gradle
的{{1}}中添加此代码:
<强>的build.gradle 强>
MainModule