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

Android 如何合并/合并两个aar文件?,android,android-studio,gradle,android-gradle-plugin,dependency-management,Android,Android Studio,Gradle,Android Gradle Plugin,Dependency Management,我的用例如下所示: 我有一个由第三方提供的aar库(比如L1)。请注意,我没有这方面的来源 我想在L1上写一个包装层,并创建另一个aar(SDK)(比如L2)。L1应封装在L2中。请注意,L2中的代码是最小的,它就像L1的包装器 这个想法是,如果有人将这个SDK集成到他们的Android应用程序中,应用程序应该只与L2交互,它甚至不需要知道L1的存在。基本上,我希望在应用程序gradle文件中只包含L2 我的问题是这是否可能? 我研究了一些关于堆栈溢出的类似问题——我得到了以下可能的解决方案——

我的用例如下所示:

  • 我有一个由第三方提供的aar库(比如L1)。请注意,我没有这方面的来源
  • 我想在L1上写一个包装层,并创建另一个aar(SDK)(比如L2)。L1应封装在L2中。请注意,L2中的代码是最小的,它就像L1的包装器
  • 这个想法是,如果有人将这个SDK集成到他们的Android应用程序中,应用程序应该只与L2交互,它甚至不需要知道L1的存在。基本上,我希望在应用程序gradle文件中只包含L2
  • 我的问题是这是否可能? 我研究了一些关于堆栈溢出的类似问题——我得到了以下可能的解决方案——但它们似乎都不合适:

  • 使用android fat aar插件-据我所知,该插件不适用于最新的gradle版本,并且不再积极维护。我使用的是Android Studio版本3.3.1和gradle版本4.10.1。我认为它还有一些其他的局限性,在aidl文件的情况下不能很好地工作
  • 一些答案似乎表明要将aar发布到像maven这样的存储库中,在这种情况下,这将得到解决。我不确定我是否正确理解了这一点,但无论如何,将L1或L2发布到任何公共存储库都不是我的选择
  • 因此,再次重申基本要求是:

  • 应用程序应该只调用L2的API并与之交互
  • 应用程序应该只需要在其gradle文件中包含L2的依赖性
  • 考虑到我提到的限制因素,有没有办法实现这一目标?不一定要通过合并AAR来实现

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

  • 编写L2所需的代码,并从中创建一个jar
  • 提取L1 aar(因为aar基本上是一个归档文件)
  • 添加上面步骤1中创建的jar,并创建一个新的aar(比如L3),其中包括l2api
  • 应用程序现在需要添加为依赖项,并且只与一个依赖项L3(将具有L2 API)交互

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

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

    2.-创建优步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即可。所有其他路径都会遇到一些问题,这在某个时候会给您带来困难。

    我认为您与以下用户有相同的问题。不,不可能合并2个AAR文件,您必须将L1托管到maven或其他存储库。在artifactory上托管您的L1之后,您将获得一个像其他任何组件一样的gradle依赖项。对L1使用“实现”而不是“api”或“编译”,这将限制L2的用户仅使用L2的代码而不是L1代码。在应用程序项目的
    app/build.gradle
    依赖项中启用对
    aar
    依赖项的传递依赖项。当你不提供错误日志,
    build.gradle
    等时,你真的束缚了我们的手脚。。。