Android库JAR可以依赖Android库AAR吗?

时间:2014-02-28 19:10:21

标签: android jar gradle android-gradle aar

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

我现在希望FooLib取决于BarLib,但BarLib 确实使用资源,因此我无法将BarLib打包为罐。相反,它被打包为AAR。我可以让FooLib依赖BarLib,但继续打包FooLib作为JAR吗?或者,FooLib中的AAR依赖性是否也迫使我将其作为AAR?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

注意

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

答案 1 :(得分:1)

因为AAR format不直接包含类作为jar文件,所以对于非Android项目没有用。因此,最好使FooLib成为AAR。

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