繁体   English   中英

具有捆绑包依赖项的库(fat aar)

[英]library with bundles dependencies (fat aar)

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

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

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

library是一个 Android 库, volleyokvolley以及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: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 ...

我也有类似的要求,因此经过大量搜索后,我最终通过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会处理合并的小节)
  2. 资产和JNI库的合并
  3. 合并清单
  4. 资源合并
  5. 嵌入来自同一项目的库
  6. 嵌入来自Maven存储库的库

尽管可以解压缩并合并嵌入式库的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM