我有一个Android库项目FooLib
。 FooLib
引用了Android Context
之类的内容,但不需要任何资源文件(res/
中的内容),因此我目前将其打包为JAR供我的应用使用。
我现在希望FooLib
取决于BarLib
,但BarLib
确实使用资源,因此我无法将BarLib
打包为罐。相反,它被打包为AAR。我可以让FooLib
依赖BarLib
,但继续打包FooLib
作为JAR吗?或者,FooLib
中的AAR依赖性是否也迫使我将其作为AAR?
答案 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库并依赖它。