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

时间:2019-03-01 17:14:58

标签: android android-studio gradle android-gradle dependency-management

我的用例如下:

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

1 个答案:

答案 0 :(得分:0)

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

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

2。-创建一个超级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即可完成。所有其他路径都有陷阱,在某些时候会给您带来困难。