【问题标题】:How to merge / combine two aar files?如何合并/组合两个 aar 文件?
【发布时间】:2019-03-01 17:14:58
【问题描述】:

我的用例如下:

  1. 我有一个第三方提供给我的 aar 库(比如说 L1)。请注意,我没有这方面的来源。
  2. 我想在 L1 之上编写一个包装层并创建另一个 aar (SDK)(比如说 L2)。 L1 应该封装在 L2 里面。请注意,L2 中的代码很少,它就像 L1 的包装器。
  3. 这个想法是,如果有人将此 SDK 集成到他们的 Android 应用程序中,应用程序应该只与 L2 交互,甚至不需要知道 L1 的存在。基本上,我希望在应用程序 gradle 文件中只包含 L2。

我的问题是这是否可能? 我查看了一些关于堆栈溢出的类似问题 - 我得到了以下可能的解决方案 - 但它们似乎都不合适:

  1. 使用 android-fat-aar 插件 - 据我了解,该插件不适用于最新的 gradle 版本,并且不再积极维护。我正在使用 Android Studio 版本 3.3.1 和 gradle 版本 4.10.1。我认为它还有一些其他限制,在aidl文件的情况下不能很好地工作。
  2. 一些答案​​似乎表明将 aar 发布到某个存储库(如 maven),在这种情况下,这将得到解决。我不确定我是否理解正确,但无论如何,将 L1 或 L2 发布到任何公共存储库都不是我的选择。

所以再次重申基本要求是:

  1. 应用程序应该只调用 L2 的 API 并与之交互。
  2. 应用程序只需要在其 gradle 文件中包含 L2 的依赖关系?

鉴于我提到的限制,有什么方法可以实现它 - 它不一定必须通过合并 aars。

以下是否可能/是否有意义:

  1. 编写 L2 所需的代码并用它创建一个 jar
  2. 提取 L1 aar(因为 aar 基本上是一个存档)
  3. 添加在上述第 1 步中创建的 jar 并创建一个包含 L2 API 的新 aar(比如说 L3)。
  4. 应用程序现在需要添加为依赖项并仅与一个依赖项 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


【解决方案1】:

在可见性方面,如果您想隐藏 L1,只需使用“implementation”关键字将其添加到您的项目中。这样,它就不会泄漏到消费者的路径中。现在,这并不意味着 L1 会立即打包到 L2 中。常规二进制文件只打包它们的类,外部类应该从存储库中提供。因此,您有两种可能的路径:

1.-将 L1 和 L2 上传到某种存储库。请注意,所述存储库不需要公开,您可以设置自己的存储库并向用户提供凭据。从长远来看,这是最不痛苦的道路。

2.-创建一个 uber aar/fat aar。您可以使用几个插件。例如这个one,它正在积极开发中。或者您可以使用 maven android 插件并使用 maven 创建 L2;在这种情况下,任何适用于 uber 二进制文件的 maven 插件都应该可以工作。 maven android 插件兼容 gradle 项目格式,所以你只需要一个 POM 文件。显然,如果你使用额外的 gradle 插件来构建 L2,这可能是不可行的。

3.-以某种方式将所有 L1 类打包到 L2 中。例如,您可以手动构建 aar 文件。需要注意的是,维护将成为一场噩梦。你基本上会回到类似 ANT 的场景,人们避免使用 ant 的原因有很多。如果L1发生变化,那将是痛苦的。此外,最终文件将不起作用,因为您还需要跟踪 L1 的所有传递依赖项并将它们添加到 L2 的路径以便它们被导入。如果有机会为您提供 L1 的人做了类似的事情,那您就完蛋了。

4.-向用户提供 L1 和 L2 文件,以便他们将它们添加到他们的 lib 文件夹中。在这种情况下,即使 L1 被导入为“实现”,它也会泄漏到路径中,因为几乎每个人都只是导入整个 libs 文件夹。

总之,你需要挑选你的毒药。我的推荐?创建一个私人仓库(你甚至可以使用 github)。是最不痛苦的选择,您可以随时切断对用户的访问,如果需要为所有用户处理自定义构建,只需更改 artifactId/groupID 即可。所有其他路径都有陷阱,在某些时候会给你带来困难。

【讨论】:

  • 嗨!也就是说,如果在我的依赖项 { implementation (name:'mymodule', ext:'aar') } 中,我必须将 mymodule 放在一个单独的存储库中并像这个 implementation 'domain.mymodule:2.3 一样连接它。 3' ?我原来的问题ru.stackoverflow.com/questions/1309045/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多