使用 Gradle 依赖项私下分发 AAR
Distributing AAR privately with Gradle dependencies
我正在尝试创建一个 Android 闭源 SDK 包以分发给 select 个客户。
我知道创建一个包含源代码、清单、布局 XML 和其他资源等的可分发 Android 包的最佳方法是创建一个 AAR 文件,我有使用 Android Studio 完成此操作。
理想情况下,人们会通过 Maven 存储库分发 AAR 以允许其他人使用源代码,同时分发列出依赖项的 pom.xml
文件。
但是,我不想被迫将我的 AAR 上传到 public(甚至私有)存储库——我只是想有一种方法可以通过电子邮件或其他方式简单地分发我的 AAR 文件一个可下载的 ZIP 文件。
问题是我的库项目有很多依赖项(来自 Maven 和本地项目)并且 AAR 本身似乎没有任何内置支持来列出(甚至捆绑)它们的依赖项,这需要由外部处理(我认为?)。
这意味着当在另一个应用程序中包含 AAR 时,每当我尝试使用任何 AAR 的依赖项时,我最终都会得到 java.lang.NoClassDefFoundError
。
我发现的一个解决方法(这并不理想)是将 Maven 依赖项复制到 build.gradle
的主机应用程序的 dependencies
部分。这不是很好,因为它是客户集成 SDK 的额外步骤,并且在管理依赖关系层次结构方面并不干净。
此解决方法也不适用于我拥有的项目依赖项,因为它在构建时被排除在外。我大概可以提供此依赖项作为源代码,并要求我的客户将其添加到他们的项目中,我确信这会起作用,但这只会变得更加混乱。
所以问题是:如何创建一个易于分发的 AAR 文件,无需存储库即可通过自动依赖项解析将其放入另一个应用程序中?
最接近您所寻求的是将 Maven 风格的存储库作为 ZIP 存档分发。这基本上就是您从 Android SDK 获得的 Android 存储库和 Google 存储库。您的客户会在某处(个人工作站、公共文件服务器等)解压缩存档并在他们模块的 repositories
闭包中引用它,然后使用正常的 compile
指令。您可以将 pom.xml
与指向依赖项的指针一起发送。那些本身是私有的依赖项将成为 ZIP 存档的一部分;那些 public 将从 JCenter 或任何地方提取。
(注意:您不需要 repositories
闭包中的 Android 存储库和来自 SDK 的 Google 存储库的唯一原因是 Google for Android 插件自动添加它们,或多或少)
但是,当您发布更新时,这会有些痛苦。您需要将新工件和 pom.xml
文件放入原始存储库的 N 个副本中,其中 N 是您的活跃客户数。提供替换存储库是可能的,但随后该存储库开始随着您的 SDK 受支持版本的数量线性增长。如果您决定取消对旧版本的支持,您将开始破坏尚未升级到新版本的任何人的构建,这可能会增加您的支持负担。或者,您需要制定机制和说明,以便仅使用新内容分发各种类型的存储库 "patchset",并希望客户正确安装它。
我也曾为此苦苦挣扎,described here 一个对我有用的解决方案。基本上,为了让 proguard 使用 -injars 指令处理您的依赖项(将它们放入 AAR 并进行混淆),需要将依赖项作为 JAR 放入 libs 文件夹中。如果你不使用proguard来minimize/obfuscate AAR,依赖将按原样打包。
我正在尝试创建一个 Android 闭源 SDK 包以分发给 select 个客户。
我知道创建一个包含源代码、清单、布局 XML 和其他资源等的可分发 Android 包的最佳方法是创建一个 AAR 文件,我有使用 Android Studio 完成此操作。
理想情况下,人们会通过 Maven 存储库分发 AAR 以允许其他人使用源代码,同时分发列出依赖项的 pom.xml
文件。
但是,我不想被迫将我的 AAR 上传到 public(甚至私有)存储库——我只是想有一种方法可以通过电子邮件或其他方式简单地分发我的 AAR 文件一个可下载的 ZIP 文件。
问题是我的库项目有很多依赖项(来自 Maven 和本地项目)并且 AAR 本身似乎没有任何内置支持来列出(甚至捆绑)它们的依赖项,这需要由外部处理(我认为?)。
这意味着当在另一个应用程序中包含 AAR 时,每当我尝试使用任何 AAR 的依赖项时,我最终都会得到 java.lang.NoClassDefFoundError
。
我发现的一个解决方法(这并不理想)是将 Maven 依赖项复制到 build.gradle
的主机应用程序的 dependencies
部分。这不是很好,因为它是客户集成 SDK 的额外步骤,并且在管理依赖关系层次结构方面并不干净。
此解决方法也不适用于我拥有的项目依赖项,因为它在构建时被排除在外。我大概可以提供此依赖项作为源代码,并要求我的客户将其添加到他们的项目中,我确信这会起作用,但这只会变得更加混乱。
所以问题是:如何创建一个易于分发的 AAR 文件,无需存储库即可通过自动依赖项解析将其放入另一个应用程序中?
最接近您所寻求的是将 Maven 风格的存储库作为 ZIP 存档分发。这基本上就是您从 Android SDK 获得的 Android 存储库和 Google 存储库。您的客户会在某处(个人工作站、公共文件服务器等)解压缩存档并在他们模块的 repositories
闭包中引用它,然后使用正常的 compile
指令。您可以将 pom.xml
与指向依赖项的指针一起发送。那些本身是私有的依赖项将成为 ZIP 存档的一部分;那些 public 将从 JCenter 或任何地方提取。
(注意:您不需要 repositories
闭包中的 Android 存储库和来自 SDK 的 Google 存储库的唯一原因是 Google for Android 插件自动添加它们,或多或少)
但是,当您发布更新时,这会有些痛苦。您需要将新工件和 pom.xml
文件放入原始存储库的 N 个副本中,其中 N 是您的活跃客户数。提供替换存储库是可能的,但随后该存储库开始随着您的 SDK 受支持版本的数量线性增长。如果您决定取消对旧版本的支持,您将开始破坏尚未升级到新版本的任何人的构建,这可能会增加您的支持负担。或者,您需要制定机制和说明,以便仅使用新内容分发各种类型的存储库 "patchset",并希望客户正确安装它。
我也曾为此苦苦挣扎,described here 一个对我有用的解决方案。基本上,为了让 proguard 使用 -injars 指令处理您的依赖项(将它们放入 AAR 并进行混淆),需要将依赖项作为 JAR 放入 libs 文件夹中。如果你不使用proguard来minimize/obfuscate AAR,依赖将按原样打包。