使用Gradle依赖项私下分发AAR

时间:2015-09-24 16:34:02

标签: android maven android-studio gradle aar

我正在尝试创建一个Android闭源SDK包,以便分发给选定数量的客户。

我理解创建可分发的Android包的最佳方式,包括源代码,清单,布局XML和&其他资源等是创建一个AAR文件,我使用Android Studio完成了这个。

理想情况下,人们可以通过Maven存储库分发AAR,以允许其他人使用源,同时分发列出依赖关系的pom.xml文件。

但是,我不想被迫将我的AAR上传到公共(甚至是私人)存储库 - 我只是想通过电子邮件或可下载的ZIP文件简单地分发我的AAR文件。< / p>

问题是我的库项目有许多依赖项(来自Maven和本地项目),而AAR似乎本身没有内置支持列出(甚至捆绑)它们的依赖项,这需要处理外部(我想?)。

这意味着当在另一个应用程序中包含AAR时,每当我尝试使用任何AAR的依赖项时,我最终都会获得java.lang.NoClassDefFoundError

我发现(非常不理想)的解决方法是将Maven依赖项复制到dependencies的主机应用build.gradle部分。这并不是很好,因为这是客户集成SDK的额外步骤,而且在管理依赖关系层次结构方面并不干净。

此解决方法也不适用于我拥有的项目依赖项,因为在构建时将其排除在外。我可能可能会将此依赖项作为源提供,并要求我的客户将其添加到我确信可以正常工作的项目中,但这只会变得更加混乱。

所以问题是:如何创建一个易于分发的AAR文件,可以通过自动依赖关系解析将其放入另一个应用程序而无需存储库?

2 个答案:

答案 0 :(得分:2)

与您所寻求的最接近的是您将Maven风格的存储库分发为ZIP存档。这基本上就是您从Android SDK获得的Android Repository和Google Repository。您的客户将在某处(单个工作站,公共文件服务器等)解压缩存档并在其模块的repositories闭包中引用它,然后使用普通的compile指令。您将使用指向依赖项的指针发送pom.xml。那些本身是私有的依赖项将成为ZIP存档的一部分;那些公开的将从JCenter或任何地方撤出。

(注意:因为谷歌Android版插件会自动添加它们,因此你不需要在repositories关闭Android中的Android存储库和谷歌资源库中的东西是唯一的原因)

但是,当您发布更新时,这将会非常痛苦。您需要将新工件和pom.xml文件放入原始存储库的N个副本中,其中N是您的活动客户数。可能会运送替换存储库,但随后该存储库开始与SDK支持的版本数量呈线性增长。如果您决定为旧版本提供支持,则可以为尚未升级到较新版本的任何人开始构建版本,这可能会增加您的支持负担。或者,您需要制定分发回购套件的机制和说明&#34;只是新的东西,并希望客户正确安装它。

答案 1 :(得分:0)

我也在努力解决这个问题以及described here一个对我有用的解决方案。基本上,为了让proguard使用-injars指令处理您的依赖项(将它们放入AAR并进行混淆),需要将依赖项作为JAR放入libs文件夹中。如果您不使用proguard来最小化/混淆AAR,则依赖项将按原样打包。