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

2024-05-23

I have:

  • 安卓工作室3
  • gradle 4.1
  • 梯度工具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)

我想创建MY-Android-SDK.jar文件来自所有 3 个模块.

到目前为止,我将能够为每个模块创建 3 个 jar 文件并以某种方式合并它们,但我相信这不是正确的方法。

有任何想法吗?


首先,如果您要创建 Android 库,请创建 AAR,而不是 JAR。 AAR 文件遵循 android SDK 结构,可以包含清单文件,因此需要权限和 xml 资源等。

其次,如果您要从多个不同的模块创建框架(事实上这是一个相当合理的方法!),您应该创建不同的工件(AAR/JAR 文件)。这使得处理传递依赖、SDK 级别冲突变得更容易,只消耗您需要的内容(有时您不需要 SDK 的一半,在这种情况下,丢弃 gradle 文件中的一些条目比摆弄要容易得多proguard 删除所有未使用的类),提供替代实现或可插入系统(例如,您为 DFP 创建合同模块和双击模块。然后,通过控制反转,您可以使用 double 填充合同点击,下个月,他们要求你用亚马逊广告替换双击。你按照合同模块创建一个带有亚马逊广告的模块,并替换亚马逊注入的双击引用。)

不管怎样,请记住传递性。根据您引入依赖项的方式,可以通过使用 build.gradle 文件中的单个依赖项将所有内容添加到路径中。如果您使用“api”:

api 'com.myname:moduleX:xxx'

在模块 com.myname:moduleY 中,moduleX 也将在路径中。使用Gradle Maven 插件 https://github.com/dcendents/android-maven-gradle-plugin首先是为了创造工件。这将允许您使用“安装”任务创建一个 Android AAR 文件,并将其部署到本地 Maven 存储库(gradle 中的 mavenLocal())。如果使用“api”包含所有子模块,它们将被添加到路径中。我不建议这样做,而是仅导入每个模块中必需的内容,并为每个模块创建单独的 AAR 文件并在您的应用程序中使用它们。

现在,如果由于某种原因,您需要创建一个 fat/Uber JAR,那么这个过程称为“着色”。所以,你需要一个 gradle 的阴影插件。幸运的是,有一个few https://plugins.gradle.org/search?term=shade。只需选择最适合您的情况(或使用 Maven 和 Maven 阴影插件)。无论如何,作为具有开发库和框架经验的人,请尽可能保持模块的原子性和独立性。最后,如果您需要 gradle maven 插件的工作示例,请尝试this https://github.com/fcopardo/EnhancedMapView,它很旧,但可以作为示例。祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 gradle 从 3 个子模块构建 1 个 jar 的相关文章

随机推荐