如何使用gradle从3个子模块构建1个jar

时间:2017-12-19 10:33:02

标签: android gradle

我有:

  • Android Studio 3
  • gradle 4.1
  • gradle tools 3: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文件并以某种方式合并它们,但我认为它不是正确的方法。

有什么想法吗?

2 个答案:

答案 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