我正在努力构建一个可以在其他应用程序中使用的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
依赖项,但底线是相同的 - 无法找到源代码。
transitive
依赖项。我们还能做些什么吗?
答案 0 :(得分:3)
来自我的answer here:
据我所知,你不能在aar里面包含aars。他们没有配置文件来说明他们需要什么样的依赖项。你可以
从您正在使用的库中删除源代码,然后用您的aar编译它。如果UI / Protocal / Infra库是内部的,并且您是唯一的提供者,这将完成这项工作。
第二个是更优选的,因为这样你的客户端所要做的就是包含一个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上的依赖关系。
很容易!请仔细阅读以下文章,
这是高度可扩展的,并且易于跨多个模块维护代码。
希望这会对你有帮助!