如何合并/合并两个AAR文件?

Arc*_*nha 9 android dependency-management gradle android-studio android-gradle-plugin

我的用例如下:

  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。我认为它还有其他一些局限性,在使用辅助文件时无法正常工作。
  2. 一些答案似乎表明将aar发布到某些仓库(例如maven),在这种情况下,它将得到解决。我不确定我是否理解正确,但是无论如何,将L1或L2发布到任何公共存储库都不是我的选择。

因此,再次重申基本要求是:

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

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

以下可能/是否有意义?

  1. 编写L2所需的代码,并从中创建一个jar
  2. 提取L1 aar(因为aar基本上是一个档案)
  3. 添加在上面的步骤1中创建的jar,并创建一个包含L2 API的新aar(例如L3)。
  4. 现在,该应用程序需要添加为依赖项,并且仅与一个依赖项L3(将具有L2 API)进行交互。

Fco*_* P. 4

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

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

2.-创建一个 uber aar/fat aar。您可以使用几个插件来实现此目的。例如,这个正在积极开发中。或者你可以使用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即可完成。所有其他路径都有陷阱,在某些时候会给你带来困难。