2014-02-28 59 views
7

我有一个Android库项目FooLibFooLib引用类似Android Context的东西,但不需要任何资源文件(在res/中的东西),所以我目前将其打包为一个JAR,以供我的应用程序使用。Android库JAR依赖于Android库AAR吗?

我现在想使FooLib取决于BarLib,但BarLib确实利用资源,所以我不能打包BarLib作为一个JAR。相反,它被打包成AAR。我有可能有FooLib依赖于BarLib,但继续打包FooLib作为JAR?或者,在FooLib有一个AAR依赖项迫使我使它成为AAR吗?

+1

JAR如何“依赖”任何东西?它只是一个类的容器。 –

+0

嗯是的,也许我应该措词它 - “可以打包成JAR的Android库项目是否依赖于另一个使用资源的Android库项目(因此打包为AAR)并仍然打包为JAR?“我怀疑答案是否定的,但我只想确认。 – Matthew

回答

5

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

在这里我正在谈论什么可能是一个单模块项目,其中包括一些JAR和AAR依赖项。一个JAR文件只是一个类文件(也许非Android资源和其他文件)的集合,并且没有依赖关系,所以没有什么可以打破的。当开始构建时,构建器会将所有东西捆绑在一起并打包,而不检查JAR是否对其他类具有无法解析的依赖关系 - 您将在运行时发现类加载器异常。

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

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

由于局限在摇篮建设者尚未解决,您不能访问本地奥尔斯在你在你的构建文件的JAR同样的方式(通过经compile files(...)语句引用它们);你必须欺骗Gradle认为他们在某种Maven仓库中(也许把它们放在一个实际的 Maven仓库中,它可以是本地的)。如果需要,请参阅Adding local .aar files to my gradle build以获得解决方法。

+0

是的,我是我们假设模块A和模块B都是Android模块(它们的build.gradle文件中都有'apply plugin:'android-library''语句),似乎我仍然可以使用http://stackoverflow.com/a/19484146/128948如果模块A不需要资源,将模块A打包为JAR,如果模块B确实需要资源并将其打包为AAR,那么我可以让模块A依赖于模块B并仍然将模块A封装为JAR? – Matthew

+0

看起来应该可以工作。android-library plugi ns可以互相依赖,而且Jake Wharton的脚本看起来应该能让它将JAR输出从模块中取出。我相信随着这些变化,模块将生成两个输出,包括AAR和JAR。 –

+0

这个问题......因为例如appcompat-v7在同一个maven子文件夹中提供了.aar和.jar ......当我指定依赖时,gradle总是选择.aar文件,当然还有gradle java插件不知道它是什么...有没有办法在.aar上选择.jar,即使POM指定包.aar? –

1

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

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

+0

我不想在非Android项目中使用FooLib,但我想将FooLib作为JAR来最大化兼容性,因为如果它是AAR,我将无法在我的基于Ant的Android应用中使用它。要回答最初的问题,你是否说“不,Android库JAR不能依赖于Android库AAR?” – Matthew