Android Archive Library(AAR)与标准jar


131

我一直在阅读有关Gradle作为Android应用程序的标准构建系统的新采用的一些文章。好吧,来自标准Java开发,我通常依赖jar文件来构建我的项目。然而似乎安卓也有AAR包,这是相当于DLL在Windows操作系统文件,提到这里

首先,您必须意识到Android平台不允许应用程序级别的“共享库”。在“传统”编程语言平台(C,C ++,Java)中,您可以使用它来共享运行库的这种机制。(例如,Windows上的DLL,Unix上的DSO,JVM上的Jar等)。但是,在Android上,除非您是Google或手机制造商,否则您不能这样做(请参阅下面的脚注1)。作为应用程序开发人员,这可能是一个基本限制。在构建时和运行时,“共享”或“重用”代码是软件工程实践中非常重要的一部分。由于上述限制,这在Android上相当困难(并非没有可能,只是更加困难)。

但是,我对此概念有些怀疑。我的意思是,开发人员什么时候应该对它的应用程序中包含aar依赖感兴趣?是否已将这些依赖关系限制为某些SDK最低版本?

例如,在一个项目中,我访问一个COM端口,该端口使用NDK预编译的 .so库。如果要共享此实用程序,是否必须创建aar?

Answers:


221

AAR文件与Jars相比与Dlls 更相似,原因如下:

Dll可以在AARs和jar与您的应用程序打包在一起的应用程序之间共享。

AARs与Jars:

之间的主要区别JarAARAAR小号包括资源,如layouts, drawables等。这使得很多更容易地创建自包含的可视化组件。例如,如果您有多个使用相同登录屏幕的应用程序,而Jar您可以使用s共享类,但不能共享布局,样式等,则您仍然必须复制它们。使用AARs,所有内容都捆绑在一个整齐的包中。

总之,AARs是朝着正确方向迈出的一大步。

注意:
apk-libs 进行了类似的尝试,但是由于AARs更好,因此现在已作废。


@unify。有什么办法可以防止aar文件混淆库吗?
abh22ishek

这个答案让我感到困惑。第一个引号是“应用程序打包了aar和jars”,而不是“跨应用程序共享”;但是第二个引号是暗示aars可以让您在多个应用程序之间共享课程和其他资源?
LarsH '16

5
@LarH我认为这意味着您可以在应用程序之间共享代码(aar文件),但是它将分别包含在每个软件包中,以使用户独立安装应用程序。如果安装了2个应用程序,并且都使用相同的aar,则android运行时可能足够聪明,只能加载一次。
哈比卜

1
我对AAR文件有很大的疑问。我想制作一个AAR文件,并将其提供给一些商人,以便在我们的业务中使用付款解决方案。我不希望他们可以反映我们的班级成员,也不能从他们的应用程序中调用方法。我有什么办法可以防止代码被反射。
Mohammad moradyar'2

5
@Mohammadmoradyar,您可以在库中使用Proguard来混淆类,但是与任何基于Java的字节码一样,无法阻止人们反编译您的代码。
统一

11

Jar和AAR之间的主要区别是AAR包含诸如布局,可绘制对象等资源。这样的语句不符合JAR文件规范,因此不是事实。根据JAR文件规范

JAR文件是一种基于流行的ZIP文件格式的文件格式,用于将许多文件聚合到一个文件中。JAR文件本质上是一个zip文件,其中包含一个可选的META-INF目录。

如您所见,没有内容限制,禁止在JAR文件中包含布局,可绘制内容等资源。有关更多详细信息,请参见Java®虚拟机规范的文章5.3“创建和加载”。

因此,关于Android Archive Library(aar)与标准jar的问题。答案取决于您所使用的构建工具。

如果您将Android Studio用作构建工具(分别作为项目组织者),则绝对最好使用* .aar文件在Android项目之间共享封装的资源。AAR文件格式是Android Studio构建的一部分,正如此处其他评论所述,其用户界面支持Android库的aar格式。

但是,除了Android Studio外,世界其他地方都不知道文件是什么东西(工件)。例如,如果您的Android构建基于Maven,则资源共享的首选文件将是jar,因为这是本地Maven Java项目工件,并且对放入标准jar文件中的内容没有限制。此外,还有一种方法可以解释Maven的任何文件格式,包括通过使用具有新组件的生命周期增强功能来包括aar。这里一个简单的示例如何为Maven创建新的包装类型?


那么我会说,不同之处在于JAR旨在成为一种在Java生态系统中共享任何类型资源的方式,而AAR是Android的重点,并迫使您进行具体布局
Xtreme Biker'5

我认为所选答案(@unify)的作者应对此进行一些澄清。
lfree

我不了解更广阔的Java世界,但在Android世界中,jar文件无法包含资源。也就是说,即使资源位于.jar存档中,也不会将其带到包含这些资源的项目中:stackoverflow.com/q/2474904/211292
ThomasW

6

问题中的引用与当前现实没有什么共同之处。当然,可以在Android中使用外部库,并且有很多可用的库。也许他们想说每个应用程序都必须捆绑它需要的所有库,但是在构建时重用该库(静态链接)确实不是问题。

.aar不同于.jar不超过.jar从不同.zip。它具有其上样的内容应该有预期的某些概念,但两者.jar.aar最经常包含编译的类和他们的资源。.aar只是指定该库是Android特定的,并且具有某些预期的结构,对于此类库来说是合理的(当然,.jar也具有某些预期的结构)。

也不再支持.aar仅受Android Studio支持的视图。可以将此类库部署到Maven Central,例如gradle之类的工具可以使用@aar后缀来引用它们,例如:

dependencies {
    compile ('io.github.andviane:uncover:2.0.1@aar')
    ..
}  

引用 Maven中央部署。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.