使用Gradle依赖项私有分发AAR文件

7
我正在尝试创建一个 Android 闭源 SDK 软件包,以分发给一些客户。
我知道创建可分发的 Android 软件包的最佳方法是包含源代码、清单、布局 XML 和其他资源等,并创建 AAR 文件。我已经使用 Android Studio 创建了这个文件。
理想情况下,人们可以通过 Maven 存储库分发 AAR,以允许他人使用源代码,并分发列出依赖项的 pom.xml 文件。
然而,我不想强制将我的 AAR 上传到公共(甚至是私有)存储库 - 我只想以电子邮件或可下载 ZIP 文件的方式简单地分发我的 AAR 文件。
问题在于我的库项目具有许多依赖项(来自 Maven 和本地项目),并且 AAR 看起来没有内置支持列出(甚至打包)它们的依赖项,需要外部处理(我认为?)。
这意味着当将 AAR 包含在另一个应用程序中时,每当我尝试使用任何 AAR 的依赖项时,都会出现 java.lang.NoClassDefFoundError。
我找到的解决方法(不是理想的方法)是将 Maven 依赖项复制到主机应用程序的 build.gradle 的 dependencies 部分中。这不是很好,因为对于客户来说,这是一个额外的集成 SDK 步骤,并且在管理依赖关系方面也不够干净。
对于我拥有的项目依赖项,这种解决方法也不起作用,因为它在构建时被排除在外。我可以将其作为源代码提供,并要求客户将其添加到其项目中,我相信这将奏效,但这只会变得更加混乱。
因此问题是:如何创建一个易于分发的 AAR 文件,可以将其放入另一个应用程序中并具有自动依赖项解析而无需存储库?

我只是想找一种简单的方法通过电子邮件或可下载的ZIP文件分发我的AAR文件。-- 为什么您的客户要这样做,而不是使用工件存储库?请记住,工件存储库只是一个文件系统结构,可以由Web服务器提供。 - CommonsWare
正如你所说,我们可以托管自己的私有存储库。我想我们甚至可以对其进行身份验证,以防止未经授权的访问,以控制分发。但是,我们的客户将依赖于我们继续为他们托管代码。理想情况下,我们希望将SDK打包为单个有效负载,可以干净地交付给客户,而无需为他们维护存储库并设置访问控件。最终,你是对的,创建存储库并不是什么大问题,但似乎应该有一种离线分发AAR及其依赖项的方法? - Jonathan Ellis
2个回答

3
您所寻找的最接近的东西是将Maven风格的仓库作为ZIP文件进行分发。这基本上就是您从Android SDK获得的Android Repository和Google Repository。你的客户需要在某个地方(单独的工作站、公共文件服务器等)解压缩该存档,并在他们模块的repositories闭包中引用它,然后使用普通的compile指令。您会随附有指向依赖项的pom.xml。那些本身是私有的依赖关系将成为ZIP存档的一部分;那些是公开的依赖关系将从JCenter或其他地方提取。
(注意:您不需要从SDK获取的Android Repository和Google Repository中的repositories闭包中的内容的唯一原因是Google for Android插件会自动添加它们,或多或少)
然而,当您发布更新时,这将会有相当大的痛苦。您需要将新的构件和pom.xml文件放入N个原始存储库的副本中,其中N是您的活跃客户数量。替换存储库是可能的,但是那么该存储库将随着您的SDK支持的版本数呈线性增长。如果您决定停止对旧版的支持,则会破坏尚未升级到较新版本的任何人的构建,这可能增加您的支持负担。或者,您需要解决分发仓库“补丁集”的机制和说明,只包含新内容,并希望客户正确安装它。

听起来将其托管在Web服务器上是最好的选择! - Jonathan Ellis
有没有一种方法可以将项目依赖项(即多项目设置)捆绑到AAR中?我希望将OpenCV作为我的AAR的依赖项包含在内,但是似乎没有(官方的)Android OpenCV Maven分发,因此我将其用作项目依赖项。将OpenCV捆绑到要作为AAR的一部分分发的最佳方法是什么? - Jonathan Ellis
@JonathanEllis:"有没有一种方式将项目依赖项(即多项目设置)捆绑到AAR中?" -- 只能通过制作另一个JAR/AAR并依赖于JAR/AAR,或者直接合并项目(并摆脱依赖项)的方式来实现。 "捆绑OpenCV以作为我的AAR的一部分分发的最佳方法是什么?" -- 说服OpenCV发布AAR。 或者,创建您自己的AAR。 对于[Android上的SQLCipher](https://github.com/commonsguy/sqlcipher-for-android-artifact),由于我耐心地等待Zetitec发布自己的AAR,所以我最终选择了后者。 - CommonsWare

0

我也曾经遇到过这个问题,在这里描述了一个对我有效的解决方案。基本上,为了让Proguard使用-injars指令(将依赖项放入AAR并混淆),依赖项需要作为JAR文件放入libs文件夹中。如果您不使用Proguard来最小化/混淆AAR,则依赖项将按原样打包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接