android - 具有 bundle 依赖项的库(fat aar)

标签 android gradle android-library

我们建立了一个分发给客户的库。我们分发原始 aar 文件供他们使用。我们还使用 GitHub 的原始访问 API 来提供 Maven 存储库。

现在为了保持整洁,我们将库分成几个模块:

include ':library'
include ':geohash'
include ':networkstate'
include ':okvolley'
include ':volley'
library是一个 Android 库,volley 也是和 okvolleynetworkstate .

现在当我发布 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 与 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/

相关文章:

android - 在布局中使用字符串数组作为 TextView 的文本属性

java - 将 sourcesJar 任务添加到自定义 Gradle 插件

android - Android 库 (aar) 的 Assets /目录中的 Assets

Android Studio Gradle 新版 "apply plugin"

java - 使用 Gradle 仅编译时依赖项和 ProGuard

android - Condition use where in sql for android开发报错

Android L 忽略形状作为可绘制背景

android - PhoneGap 链接到 Google Play

java - IntelliJ 找不到 "GL10"LibGDX 程序的 "Hello World"库

我的应用程序与 Java 7 不兼容的 Android Studio 错误