【发布时间】:2019-03-01 17:14:58
【问题描述】:
我的用例如下:
- 我有一个第三方提供给我的 aar 库(比如说 L1)。请注意,我没有这方面的来源。
- 我想在 L1 之上编写一个包装层并创建另一个 aar (SDK)(比如说 L2)。 L1 应该封装在 L2 里面。请注意,L2 中的代码很少,它就像 L1 的包装器。
- 这个想法是,如果有人将此 SDK 集成到他们的 Android 应用程序中,应用程序应该只与 L2 交互,甚至不需要知道 L1 的存在。基本上,我希望在应用程序 gradle 文件中只包含 L2。
我的问题是这是否可能? 我查看了一些关于堆栈溢出的类似问题 - 我得到了以下可能的解决方案 - 但它们似乎都不合适:
- 使用 android-fat-aar 插件 - 据我了解,该插件不适用于最新的 gradle 版本,并且不再积极维护。我正在使用 Android Studio 版本 3.3.1 和 gradle 版本 4.10.1。我认为它还有一些其他限制,在aidl文件的情况下不能很好地工作。
- 一些答案似乎表明将 aar 发布到某个存储库(如 maven),在这种情况下,这将得到解决。我不确定我是否理解正确,但无论如何,将 L1 或 L2 发布到任何公共存储库都不是我的选择。
所以再次重申基本要求是:
- 应用程序应该只调用 L2 的 API 并与之交互。
- 应用程序只需要在其 gradle 文件中包含 L2 的依赖关系?
鉴于我提到的限制,有什么方法可以实现它 - 它不一定必须通过合并 aars。
以下是否可能/是否有意义:
- 编写 L2 所需的代码并用它创建一个 jar
- 提取 L1 aar(因为 aar 基本上是一个存档)
- 添加在上述第 1 步中创建的 jar 并创建一个包含 L2 API 的新 aar(比如说 L3)。
- 应用程序现在需要添加为依赖项并仅与一个依赖项 L3(将具有 L2 API)进行交互。
【问题讨论】:
-
我认为您与以下用户有相同的问题。 link
-
不,不可能合并 2 个 AAR 文件,您必须将 L1 托管到 maven 或其他存储库。在 artifactory 上托管 L1 后,您将像其他任何东西一样获得 gradle 依赖项。对 L1 使用“实现”而不是“api”或“编译”,这将限制 L2 的用户只使用 L2 的代码而不是 L1 代码。
-
在应用程序项目的
app/build.gradle中启用对aar依赖项的传递依赖项。当您不提供错误日志、build.gradle等时,您真的会束缚我们的手脚...... -
我只想提一下,这是一个写得很好的问题
标签: android android-studio gradle android-gradle-plugin dependency-management