【问题标题】:Can an Android library JAR depend on an Android library AAR?Android 库 JAR 可以依赖于 Android 库 AAR 吗?
【发布时间】:2014-04-01 23:11:35
【问题描述】:

我有一个 Android 库项目FooLibFooLib 引用 Android Contexts 之类的东西,但不需要任何资源文件(res/ 中的东西),所以我目前将其打包为 JAR 供我的应用使用。

我现在想让FooLib 依赖于BarLib,但BarLib 确实使用资源,所以我不能将BarLib 打包为JAR。相反,它被打包为 AAR。我是否有可能让FooLib 依赖于BarLib 但继续将FooLib 打包为JAR?或者,FooLib 中的 AAR 依赖项是否会迫使我也将其设为 AAR?

【问题讨论】:

  • JAR 如何“依赖”任何东西?它只是一个类的容器。
  • 嗯,是的,也许我应该这样说——“可以​​打包为 JAR 的 Android 库项目能否依赖于另一个使用资源的 Android 库项目(因此打包为 AAR)并且仍被打包为 JAR?”我怀疑答案是否定的,但我只是想确认一下。

标签: android jar gradle android-gradle-plugin aar


【解决方案1】:

如果您的项目包含 JAR 文件和 AAR 文件作为依赖项(请参阅下面的注释),那么您可以将特定于 Android 的 JAR 作为依赖于 Android API 中的类的依赖项,尽管 JAR 文件不能包含您已经知道的 Android 资源。仅仅因为它依赖于 Android 类并不意味着它需要被打包为 AAR。

这里我说的是可能包含许多 JAR 和 AAR 依赖项的单模块项目。 JAR 文件只是类文件(可能还有非 Android 资源和其他文件)的集合,没有依赖感,因此没有什么可破坏的。当需要进行构建时,构建器只是将所有内容捆绑在一起并将其打包,并且不会检查 JAR 是否对其他类具有不可解析的依赖关系——您会在运行时发现类加载器异常。

如果您在 IDE 中的多模块项目中谈论库 modules,那就另当别论了。如果您有一个可以编译为普通 JAR 的模块 A(它使用构建文件中的 apply plugin: 'java' 语句),那么它不能依赖于编译为 AAR 的 Android 模块 (apply plugin: 'android-library')。这很可能永远不会得到解决,或者至少在可预见的未来不会得到解决:这是因为 Android 模块的源文件夹概念要复杂得多,而且 Gradle 中的 Java 插件无法理解 Android 的源集。

反之亦然——Android 模块可以依赖于普通的 Java 模块。

注意

由于 Gradle 构建器中尚未解决的限制,您无法以与构建文件中的 JAR 相同的方式访问本地 AAR(通过 compile files(...) 语句引用它们);你必须让 Gradle 误以为它们在某种 Maven 存储库中(也许通过将它们放在一个 actual Maven 存储库中,它可以是本地的)。如果您需要解决方法,请参阅 Adding local .aar files to my gradle build

【讨论】:

  • 是的,我说的是多模块项目中的库模块。假设模块 A 和模块 B 都是 Android 模块(它们的 build.gradle 文件中都有 apply plugin: 'android-library' 语句)。如果不需要资源,我似乎仍然可以使用stackoverflow.com/a/19484146/128948 将模块 A 打包为 JAR。如果模块 B 确实需要资源并且我将其打包为 AAR,我可以让模块 A 依赖于模块 B 并且仍然将模块 A 打包为 JAR?
  • 看起来应该可以了。 android-library 插件可以相互依赖,Jake Wharton 的脚本看起来应该可以让它从模块中获取 JAR 输出。我相信有了这些更改,模块将生成两个输出,AAR 和 JAR。
  • 关于这个的问题...因为例如 appcompat-v7 在同一个 maven 子文件夹中同时提供 .aar 和 .jar ...当我指定依赖项时,gradle 总是选择 .aar 文件当然,gradle java插件不知道它是什么......即使POM指定包.aar,有没有办法选择.jar而不是.aar?
  • Appcompat 仅提供 .aar。我不知道你在哪里看到它的 .jar 版本。
【解决方案2】:

因为AAR format 不像 jar 文件那样直接包含类,所以它对非 Android 项目没有用处。因此,最好将 FooLib 设为 AAR。

另一个解决方案是从 BarLib 中提取 jar 库并依赖它。

【讨论】:

  • 我不打算在非 Android 项目中使用 FooLib,但我想将 FooLib 保留为 JAR 以最大限度地提高兼容性,因为如果它是 AAR,我将无法在我的基于 Ant 的 Android 应用程序中使用它。要回答最初的问题,您是说“不,Android 库 JAR 不能依赖于 Android 库 AAR”吗?
猜你喜欢
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2018-04-02
  • 2014-07-26
  • 1970-01-01
  • 2018-05-27
相关资源
最近更新 更多