我有一个
Android库项目FooLib. FooLib引用了诸如Android上下文之类的东西,但不需要任何资源文件(res /中的东西),所以我目前将其打包为JAR供我的应用程序使用.
我现在想让FooLib依赖于BarLib,但BarLib确实使用了资源,因此我无法将BarLib打包为JAR.相反,它被打包为AAR.我是否有可能让FooLib依赖BarLib但继续将FooLib打包为JAR?或者,在FooLib中具有AAR依赖性是否也迫使我将其作为AAR?
解决方法
如果您有一个包含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(通过编译文件(…)语句引用它们);你必须欺骗Gradle认为他们在某种Maven存储库中(可能将它们放在一个真正的Maven存储库中,可以是本地存储库).如果需要,请参阅Adding local .aar files to my gradle build以获取解决方法.