gpt4 book ai didi

android - 如何合并/合并两个 aar 文件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:10:17 26 4
gpt4 key购买 nike

我的用例如下:

  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 发布到任何公共(public)存储库都不是我的选择。

再次重申基本要求是:

  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)交互。

最佳答案

可见性方面,如果您想隐藏 L1,只需使用“实现”关键字将其添加到您的项目中即可。这样,它就不会泄漏到消费者的路径中。现在,这并不意味着 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 文件夹。

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

关于android - 如何合并/合并两个 aar 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com