gradle 带有bundle依赖项的库(fat aar)

332nm8kg  于 2023-01-31  发布在  其他
关注(0)|答案(4)|浏览(261)

我们建立了一个库并分发给我们的客户,我们分发了原始的aar文件供他们使用,我们还使用GitHub的原始访问API提供了一个Maven仓库。
现在,为了保持整洁,我们将库划分为几个模块:

include ':library'
include ':geohash'
include ':networkstate'
include ':okvolley'
include ':volley'

library是一个Android库,volleyokvolleynetworkstate也是。
现在,当我发布library时,依赖关系树如下所示:

\--- com.sensorberg.sdk:sensorberg-sdk:0.10.0-SNAPSHOT
 +--- com.squareup.okhttp:okhttp-urlconnection:2.2.0
 |    \--- com.squareup.okhttp:okhttp:2.2.0
 |         \--- com.squareup.okio:okio:1.2.0
 +--- com.google.code.gson:gson:2.3.1 
 +--- android-sdk:okvolley:unspecified
 |    +--- com.squareup.okhttp:okhttp-urlconnection:2.2.0 (*)
 |    +--- com.google.code.gson:gson:2.3.1
 |    +--- android-near-gradle:volley:unspecified
 |    \--- com.squareup.okhttp:okhttp:2.2.0 (*)
 +--- android-sdk:networkstate:unspecified
 +--- com.squareup.okhttp:okhttp:2.2.0 (*)
 +--- android-sdk:volley:unspecified
 \--- com.loopj.android:android-async-http:1.4.5

如您所见,android-sdk:networkstate:unspecifiedandroid-sdk:okvolley:unspecified显示在外部依赖项列表中。
我想创建我的library aar与本地模块捆绑。它应该做一个本地清单合并和远jar...并合并所有模块的依赖关系。只有外部模块应该显示。
我试过从各个模块的build/output/aar文件夹中引用本地aar文件,但似乎也不起作用,它似乎仍然通过它们的名称引用本地模块,而不合并jar的清单...
有人做过这样的事情吗?在Android之外,这将被称为fatjar,有像musketyr/gradle-fatjar-plugin这样的插件可以使用Gradle生成fatjar。
我在本地模块上试过了

if (project.ext.libraryBuild == true) {
    def moduleName = getName()
    File artifactFile = file("/build/outputs/aar/${moduleName}-release.aar")
    if (!artifactFile.exists()) {
        throw new GradleException("Dependency ${moduleName} is not build")
    }
    configurations.create("default")
    artifacts.add("default", artifactFile)
    return;
}

apply plugin: 'com.android.library'

android {
    compileSdkVersion 19
    buildToolsVersion = '21.1.2'
}

直接引用AAR。

sdnqo3pr

sdnqo3pr1#

我只是不鼓励依赖于另一个android库来制作android库。没有官方支持在输出aar中捆绑android库(见:https://stackoverflow.com/a/20715155/2707179),而且我认为在可预见的将来不会出现这种情况。
因此,目前最简单的方法是将所有android相关的东西放在一个模块中,而将其他模块保持为纯java。
捆绑普通java模块非常容易(只需将输出类或输出jar复制到您在Gradle中的Android库即可)但Android模块要困难得多。在某个时候,有一个很好的Gradle脚本https://github.com/adwiv/android-fat-aar。不幸的是,它不再维护,不适用于最新的android gradle插件。android插件中的更改没有很好地记录,因此创建(和维护)您自己的定制插件/脚本将是非常痛苦的。
我真的不明白Android团队为什么不允许将一个Android库嵌入到另一个Android库中(除了“这很复杂”),但在目前的情况下,将所有Android内容都放在一个模块中要容易得多。
当然,模块化你的项目是一个好主意。我真的尝试过保持独立的模块,但在某些时候我不得不给予,所有这些变通办法只是不值得。

hlswsv35

hlswsv352#

我也有类似的需求,所以在搜索了很多之后,我最终破解了android插件,我对groovy了解不多,但是我可以设法编造一个gradle文件,它可以构建一个被应用程序接受的fat aar文件。
生成的代码可以在github.com/adwiv/android-fat-aar上找到,详细的说明可以在GitHub网站上找到,生成的build.gradle如下所示:

apply from: 'fat-aar.gradle'

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])

  embedded project(':libraryone')
  embedded project('com.example.internal:lib-three:1.2.3')

  compile 'com.android.support:appcompat-v7:22.2.0'
}

当前代码没有尝试合并AIDL文件,因为我不使用它们。下面的特性是存在的,并且对我有用(虽然我的库并不太复杂)
1.类的合并(所以proguard在合并的类上工作)
1.资源和JNI库的合并
1.舱单的合并
1.资源的合并
1.嵌入同一项目中的库
1.嵌入来自Maven存储库的库
只有android库(aar)可以嵌入,jar文件不能,尽管嵌入库的libs文件夹中的jar文件可以解压缩和合并。
试试看,有问题就告诉我。你可以浏览代码,根据需要修改。

n3ipq98p

n3ipq98p3#

官方不支持捆绑的aar,这里有一个answer来自google的一个技术领导者。
我制作了一个gradle插件,可以入侵Android插件:fat-aar-plugin.
它基本上和adwiv的一样。
希望有帮助。

z8dt9xmd

z8dt9xmd4#

现在面临同样的问题,一个选择是在您自己的DevOps包控制器上发布这些Android Java模块,然后从您想要实现它们的模块指向它们。

相关问题