Ofi*_* A. 7 android module gradle android-gradle-plugin 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)
Run Code Online (Sandbox Code Playgroud)
如您所见,我们有3个不同的库,每个库都是我们系统中的模块(infra,ui和protocol).他们每个人都在创建一个AAR.
我们的SDK是一个包装器,包含对较低层的一些API调用.
我们想要创建一个依赖于所有其他AAR的AAR,但是出于某种原因,当我们尝试运行它时,它说他找不到某些类的源代码.
我发现了一些与此问题相关的问题,但它们没有奏效.也尝试使用transitive依赖项,但底线是相同的 - 找不到源代码.
transitive依赖项.我们还能做些什么吗?
从我的回答来看:
据我所知,你不能在 aar 中包含 aar。他们没有配置文件来说明他们需要什么依赖项。你可以
从您正在使用的库中剥离源代码并使用 aar 进行编译。如果 UI/协议/基础设施库位于内部并且您是唯一的提供商,这将完成这项工作。
考虑上传到bintray或Maven 中央存储库
第二个更可取,因为这样您的客户端所要做的就是包含一个链接,例如compile 'com.abc.efg:version'获取您配置的所有依赖项。这也是一个更好的选择,因为有多种方法可以处理版本冲突(例如 with exclude group)。
想象一下,如果您的客户正在使用另一个 SDK,该 SDK 正在引入不同版本的 UI/协议/基础设施。如果你的 aar 是通过第一种方法给他们的,由于版本冲突,他们甚至根本无法构建项目。然而,对于第二个版本,他们可以简单地做
compile ('com.abc.efg:version') { exclude group: 'com.companyName.ui' }
Run Code Online (Sandbox Code Playgroud)
并摆脱所有这些头痛。现实生活中的一个例子是 Facebook 的 SDK。它引入了谷歌的播放服务,但人们通常已经将其作为项目的依赖项包含在内,并遇到了这样的问题。