一个Android库JAR可以依赖于一个Android库AAR吗?

9

我有一个Android库项目FooLib,其中引用了一些像Android Context的东西,但不需要任何资源文件(位于res/中的内容),因此我目前将其打包为JAR供我的应用程序使用。

现在我想让FooLib依赖于BarLib,但BarLib确实使用资源,所以我不能将BarLib打包成JAR。相反,它被打包为AAR。我是否可以让FooLib依赖于BarLib,但继续将FooLib打包为JAR?还是说,在FooLib中有一个AAR依赖会强制使我也将其打包为AAR?


1
一个JAR如何“依赖”其他东西?它只是一个类的容器。 - Scott Barta
嗯,也许我应该这样表达——“一个可以打包成JAR的Android库项目能否依赖于另一个使用资源(因此被打包为AAR)的Android库项目并仍然被打包为JAR?”我怀疑答案是否定的,但我只是想确认一下。 - Matthew
2个回答

6
如果您有一个包含JAR文件和AAR文件作为依赖项的项目(见下面的注释),那么您可以将Android特定的JAR文件作为依赖项,依赖于Android API中的类,虽然JAR文件不能包含Android资源,这是您已经知道的。仅仅因为它依赖于Android类并不意味着它需要被打包为AAR。
这里我正在讨论的可能是一个包括多个JAR和AAR依赖项的单模块项目。JAR文件只是一组类文件(以及可能的非Android资源和其他文件),没有依赖关系的感觉,因此没有东西会被破坏。当进行构建时,构建器只是将所有内容捆绑在一起并打包它,并且不会检查JAR是否对其他类具有无法解决的依赖关系 - 您将在运行时通过类加载器异常发现这一点。
如果你在IDE中谈论库模块,在一个多模块项目中,那就是另一回事了。如果你有一个模块A,它可以编译成一个普通的JAR(使用apply plugin: 'java'语句在build文件中),那么它不能依赖于一个Android模块(apply plugin: 'android-library')编译成AAR。这很可能永远不会被修复,或者至少在可预见的未来不会修复:这是因为Android模块对源文件夹有一个更复杂的概念,Gradle中的Java插件无法理解Android的源集。
然而,反过来则是正确的 - Android模块可以依赖于普通的Java模块。
注意:
由于Gradle构建器中尚未解决的限制,您无法像在构建文件中引用JAR那样访问本地AAR(通过compile files(...)语句引用它们);您必须欺骗Gradle认为它们在某种Maven存储库中(也许是将它们放在实际的Maven存储库中,并将其设置为本地)。如果需要,请参阅向我的Gradle构建添加本地.aar文件获取解决方法。

是的,我在谈论多模块项目中的库模块。假设模块A和模块B都是Android模块(它们的build.gradle文件中都有“apply plugin:'android-library'”语句)。如果模块A不需要资源,则似乎仍然可以使用https://dev59.com/EmIk5IYBdhLWcg3waNdr#19484146将其打包为JAR。如果模块B需要资源并且我将其打包为AAR,则模块A可以依赖于模块B并仍将模块A打包为JAR吗? - Matthew
看起来应该可以工作。android-library插件可以相互依赖,Jake Wharton的脚本看起来应该可以将其钩取到模块的JAR输出中。我相信在这些更改生效后,该模块将生成两个输出,即AAR和JAR。 - Scott Barta
关于这个问题......例如appcompat-v7在同一个maven子文件夹中提供了.aar和.jar两种格式的文件...虽然我指定了依赖关系,但gradle总是选择.aar文件作为编译对象,而gradle Java插件显然不知道如何处理它...如果POM文件指定以.aar方式打包,有没有一种方法可以让我选择使用.jar文件而非.aar文件? - Andrea Richiardi
1
Appcompat只提供.aar文件,我不知道你在哪里看到了它的.jar版本。 - Scott Barta

1

因为AAR格式不像jar文件那样直接包含类,所以对于非Android项目来说没有用处。因此,将FooLib制作成AAR格式会更好。

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


我并不打算在非Android项目中使用FooLib,但我想将FooLib保留为JAR以最大化兼容性,因为如果它是AAR,我将无法在基于Ant的Android应用程序中使用它。回答最初的问题,您是否在说“不,Android库JAR不能依赖于Android库AAR”? - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接