我们建立了一个分发给客户的库。我们分发原始 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 与 bundle 的本地模块。它应该做一个本地 list 合并和远 jar ......并合并所有模块的依赖关系。只有外部模块应该显示。我确实尝试从
build/output/aar
引用本地 aar 文件。相应模块的文件夹,但这似乎也不起作用。它似乎仍然通过名称引用本地模块,而不是合并 jar 的 list ......有人做过这样的事情吗?在 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 库制作 android 库。没有官方支持在输出 aar 中 bundle android 库(参见:https://stackoverflow.com/a/20715155/2707179),我认为它不会在可预见的将来出现。
因此,目前最简单的方法是将所有与 android 相关的东西放在一个模块中,而将其他模块保留为纯 java.util.java。
bundle 纯 java 模块非常容易(只需将输出类或输出 jar 复制到 gradle 中的 android 库),但 android 模块要困难得多。在某些时候有一个很好的 gradle 脚本 https://github.com/adwiv/android-fat-aar .不幸的是,它不再维护,并且不适用于最新的 android gradle 插件。并且 android 插件中的更改没有很好的记录,因此创建(和维护)您自己的自定义插件/脚本将非常痛苦。
我真的不明白 Android 团队不允许将一个 android 库嵌入到另一个库中的理由(除了“它很复杂”),但在目前的情况下,将所有 android 的东西放在一个模块中要容易得多。
当然,模块化你的项目是个好主意。我真的试图保留单独的模块,但在某些时候我不得不放弃,所有这些变通方法都不值得。
关于android - 具有 bundle 依赖项的库(fat aar),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56494467/