创建一个依赖于多个AAR的AAR

时间:2016-07-18 15:46:51

标签: android gradle module android-gradle aar

我正在努力构建一个可以在其他应用程序中使用的SDK。

我的项目结构如下:

ProjectFolder
  |
  +--AndroidLibs
  |      |
  |      +--UI (android library - AAR)
  |      |
  |      +--Protocol (android library - AAR)
  |      |
  |      +--infra (android library - AAR)
  |
  +--SDK(depends on UI, Protocol and Infra) 
  |
  +--APP(depends on SDK)

如您所见,我们有3个不同的库,每个库都是我们系统中的模块(infra,ui和protocol)。他们每个人都在创建一个AAR。

我们的SDK是一个包装器,对较低层有一些API调用。

我们希望创建一个依赖于所有其他AAR的AAR,但出于某些原因,当我们尝试运行它时,它表示他无法找到某些类的源代码。

我发现了一些与此问题相关的问题,但它们并没有奏效。 还尝试使用transitive依赖项,但底线是相同的 - 无法找到源代码。

  1. android-studio-how-to-package-single-aar-from-multiple-library-projects:有一个答案说没有解决方案(Google员工)。
  2. create-an-aar-with-multiple-aars-jars:使用transitive依赖项。
  3. Create Mojo for creating AAR with all "aar" dependencies
  4. 我们还能做些什么吗?

2 个答案:

答案 0 :(得分:3)

来自我的answer here

据我所知,你不能在aar里面包含aars。他们没有配置文件来说明他们需要什么样的依赖项。你可以

  1. 从您正在使用的库中删除源代码,然后用您的aar编译它。如果UI / Protocal / Infra库是内部的,并且您是唯一的提供者,这将完成这项工作。

  2. 考虑上传到bintrayMaven Central Repository

  3. 第二个是更优选的,因为这样你的客户端所要做的就是包含一个compile 'com.abc.efg:version'之类的链接来获取你配置的所有依赖项。它也是一个更好的选择,因为有一些方法可以处理版本冲突(例如exclude group)。

    想象一下,如果您的客户端正在使用另一个sdk,它正在使用不同版本的UI / Protocal / Infra。如果你的aar是通过第一种方法给他们的,那么由于版本冲突他们甚至根本无法构建项目。但是对于第二个版本,他们可以简单地执行

    compile ('com.abc.efg:version') { exclude group: 'com.companyName.ui' }
    

    并摆脱所有头痛。一个真实的例子是Facebook的SDK。它吸引了谷歌的游戏服务,但人们通常已将其作为项目的依赖项,并遇到像this这样的问题。

答案 1 :(得分:1)

由于您的项目通常依赖于内部和第三方库。内部库可以在Artifactory存储库上发布,并使用Gradle解决Artifactory上的依赖关系。

很容易!请仔细阅读以下文章,

这是高度可扩展的,并且易于跨多个模块维护代码。

希望这会对你有帮助!