8

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

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

4

2 回答 2

6

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

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

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

然而,反过来也是正确的——Android 模块可以依赖于普通的 Java 模块。

笔记

由于 Gradle 构建器中尚未解决的限制,您无法以与构建文件中的 JAR 相同的方式访问本地 AAR(通过compile files(...)语句引用它们);您必须欺骗 Gradle,让他们认为它们位于某种 Maven 存储库中(也许通过将它们放在可以是本地的实际Maven 存储库中)。如果需要,请参阅将本地 .aar 文件添加到我的 gradle 构建以获取解决方法。

于 2014-03-01T18:41:12.057 回答
1

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

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

于 2014-02-28T22:10:30.450 回答