首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >包含包依赖项的库(fat aar)

包含包依赖项的库(fat aar)
EN

Stack Overflow用户
提问于 2015-02-19 19:37:12
回答 2查看 15.3K关注 0票数 24

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

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

代码语言:javascript
复制
include ':library'
include ':geohash'
include ':networkstate'
include ':okvolley'
include ':volley'

library是一个Android库,volleyokvolleynetworkstate也是。

现在,当我发布library时,依赖关系树如下所示:

代码语言:javascript
复制
\--- 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的清单...

有人做过这样的事吗?在安卓之外,这将被称为fatjar,并且有像musketyr/gradle-fatjar-plugin这样的插件可以与Gradle一起产生fatjar。

我在本地模块上尝试了这一点。

代码语言:javascript
复制
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 ..。

EN

回答 2

Stack Overflow用户

发布于 2017-05-03 05:41:59

我只是不鼓励让android库依赖于另一个android库。在output aar (参见:https://stackoverflow.com/a/20715155/2707179)中没有对捆绑android库的官方支持,我认为在可预见的未来也不会出现。

因此,目前最简单的做法是将所有与android相关的东西放在一个模块中,而将其他模块保持为纯java。

捆绑普通java模块非常容易(只需将输出类或输出jar复制到gradle中的android库中),但android模块要难得多。在某种程度上,有一个很好的gradle script https://github.com/adwiv/android-fat-aar。不幸的是,它不再维护,也不能与最新的android gradle插件一起工作。android插件中的变化没有很好的文档记录,所以创建(和维护)你自己的自定义插件/脚本将是非常痛苦的。

我真的不理解Android团队不允许将一个android库嵌入到另一个库中的理由(除了“它很复杂”),但在目前的情况下,将所有android内容放在一个模块中要容易得多。

当然,模块化你的项目是一个好主意。我真的试图保持独立的模块,但在某种程度上,我不得不放弃,所有这些变通方法都不值得。

票数 8
EN

Stack Overflow用户

发布于 2017-02-27 14:14:51

官方不支持捆绑的aar。这是谷歌一位技术领军企业的answer

我做了一个gradle插件,它嵌入了android插件:fat-aar-plugin

它基本上和adwiv的一样。

希望能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28605367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档