[英]library with bundles dependencies (fat aar)
我们建立了一个图书馆,我们分发给我们的客户。 我们分发原始 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 ...
我也有类似的要求,因此经过大量搜索后,我最终通过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文件,因为我没有使用它们。 存在以下功能并对我有用(尽管我的库不太复杂)
尽管可以解压缩并合并嵌入式库的libs文件夹中的jar文件,但只能嵌入android库(aar),不能嵌入jar文件。
试试看,让我知道任何问题。 您可以遍历代码并根据需要进行修改。
我只是不鼓励根据另一个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东西保存在一个模块中要容易得多。
当然,将项目模块化是个好主意。 我确实试图保留单独的模块,但是在某些时候我不得不放弃,所有这些变通办法都不值得。
官方不支持捆绑的aar。 这是谷歌技术负责人的回答 。
我制作了一个gradle插件,该插件可入侵 android插件: fat-aar-plugin 。
它基本上与adwiv的相同。
希望能帮助到你。
现在面临同样的问题,一种选择是在您自己的 DevOps package controller 上发布这些 Android Java 模块,然后从您要实现它们的模块中指向它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.