我们建立了一个库并分发给我们的客户,我们分发了原始的aar文件供他们使用,我们还使用GitHub的原始访问API提供了一个Maven仓库。
现在,为了保持整洁,我们将库划分为几个模块:
include ':library'
include ':geohash'
include ':networkstate'
include ':okvolley'
include ':volley'
library
是一个Android库,volley
、okvolley
和networkstate
也是。
现在,当我发布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:unspecified
和android-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。
4条答案
按热度按时间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内容都放在一个模块中要容易得多。
当然,模块化你的项目是一个好主意。我真的尝试过保持独立的模块,但在某些时候我不得不给予,所有这些变通办法只是不值得。
hlswsv352#
我也有类似的需求,所以在搜索了很多之后,我最终破解了android插件,我对groovy了解不多,但是我可以设法编造一个gradle文件,它可以构建一个被应用程序接受的fat aar文件。
生成的代码可以在github.com/adwiv/android-fat-aar上找到,详细的说明可以在GitHub网站上找到,生成的
build.gradle
如下所示:当前代码没有尝试合并AIDL文件,因为我不使用它们。下面的特性是存在的,并且对我有用(虽然我的库并不太复杂)
1.类的合并(所以proguard在合并的类上工作)
1.资源和JNI库的合并
1.舱单的合并
1.资源的合并
1.嵌入同一项目中的库
1.嵌入来自Maven存储库的库
只有android库(aar)可以嵌入,jar文件不能,尽管嵌入库的libs文件夹中的jar文件可以解压缩和合并。
试试看,有问题就告诉我。你可以浏览代码,根据需要修改。
n3ipq98p3#
官方不支持捆绑的aar,这里有一个answer来自google的一个技术领导者。
我制作了一个gradle插件,可以入侵Android插件:fat-aar-plugin.
它基本上和adwiv的一样。
希望有帮助。
z8dt9xmd4#
现在面临同样的问题,一个选择是在您自己的DevOps包控制器上发布这些Android Java模块,然后从您想要实现它们的模块指向它们。