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

问题描述 投票:6回答:1

我的用例如下:

  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)进行交互。
android android-studio gradle android-gradle dependency-management
1个回答
1
投票

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

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

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

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

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

所有事情都说,你需要选择毒药。我的推荐?创建一个私人仓库(你甚至可以使用github)。是最不痛苦的选择,您可以随时切断对用户的访问权限,如果有必要为所有用户处理自定义构建,只需更改artifactId / groupID即可完成。所有其他路径都会让你在某些时候遇到困难。

© www.soinside.com 2019 - 2024. All rights reserved.