Android Archive Library (aar) 与标准 jar 的区别

154
我一直在阅读关于Gradle作为Android应用程序标准构建系统新采用的文章。然而,从标准Java开发中出来,我通常依赖于jar文件来构建我的项目。但是似乎Android也有aar包,这相当于Windows操作系统中的dll文件,正如这里提到的那样。
首先,您必须意识到,Android平台不允许应用程序级别的“共享库”。在“传统”的编程语言平台(C、C ++、Java等),我们有这种共享运行时库的机制。(例如,在Windows上的DLL,在Unix上的DSO,在JVM上的Jar等)。但是在Android上,除非您是Google或手机制造商,否则您不能这样做(请参见下面的脚注1)。作为应用程序开发人员,这可能是一个根本性限制。软件工程实践中的“共享”或“重用”代码,无论是在构建时还是在运行时,都是非常重要的部分。由于上述限制,这在Android上相当困难(不是不可能,只是更困难)。
然而,我对这个概念有一些疑问。我的意思是说,什么时候开发人员应该包含aar依赖项在其应用程序中?这些依赖关系是否与某些SDK最小版本相关?
例如,在一个项目中,我访问COM端口,我使用NDK预编译的.so库。如果我想共享此实用程序,我是否必须创建aar?
5个回答

248

AAR文件与Jar类似,而不像DLL文件,原因如下:

DLL文件可以在应用程序之间共享,而AAR和Jars则与您的应用程序捆绑在一起。

AARJar的区别:

AARJar的主要区别在于AAR包含资源,例如布局、可绘制的图形等。这使得创建自包含的可视组件变得更加容易。例如,如果您有多个应用使用相同的登录屏幕,则使用Jar可以共享类,但不能共享布局、样式等,仍然需要复制它们。而AAR将所有内容绑定在一个整洁的包中。

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

注意:
曾经尝试过使用apk-lib,但现在已经过时了,因为AAR更好。


@unify。有没有办法可以防止aar文件被混淆库? - abh22ishek
1
我对这个答案感到困惑。第一个块引用说“aars和jars与您的应用程序一起打包”,而不是“在多个应用程序之间共享”; 然而,第二个块引用暗示aars可以让您在多个应用程序之间共享类和其他资源? - LarsH
6
我认为它的意思是,你可以在不同的应用程序之间共享代码(aar文件),但会分别包含在每个包中,以便用户可以独立安装应用程序。如果安装了两个应用程序并且都使用了相同的aar,则Android运行时可能足够聪明,只加载一次。 - Habib
2
我在处理AAR文件时遇到了大问题。我想制作一个AAR文件并将其提供给某些商家,以便与我们的业务一起提供支付解决方案。我不希望他们能够反射我们的类成员,并且不能从他们的应用程序中调用方法。有没有办法保护我的代码免受反射攻击? - Mohammad moradyar
7
你可以在你的库上使用Proguard来混淆你的类,但是对于任何基于Java字节码的代码,没有办法阻止人们反编译你的代码。 - unify

16
声明“ JAR 和 AAR 的主要区别在于 AAR 包含布局,可绘制等资源。”不符合JAR文件规范,因此不是真实情况。根据JAR文件规范

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

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

因此,在 Android Archive Library (aar) vs standard jar问题上,答案取决于您使用的构建工具。

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

但是,除了Android Studio之外,全球其他地方并不知道aar文件(工件)是什么。例如,如果您的Android构建基于Maven,则资源共享的首选文件将是jar,因为这是原生Maven java项目工件,并且没有限制要放入标准jar文件中的内容。此外,有一种方法可以向Maven解释任何文件格式,包括使用新组件进行生命周期增强的aar。一个简单的例子在这里How do I create a new packaging type for Maven?


那么我会说不同之处在于 JAR 旨在成为在 Java 生态系统中共享任何类型资源的方式,而 AAR 则专注于 Android,并且强制您采用具体布局。 - Aritz
我认为被选中答案的作者(@unify)应该对此进行一些澄清。 - lfree
2
我不了解Java的整个世界,但在Android世界中,jar文件无法包含资源。也就是说,即使资源在.jar归档文件中,它们也不会被带到包含它们的项目中:https://dev59.com/wkzSa4cB1Zd3GeqPoanx - ThomasW

12

JAR vs AAR

JAR - Java Archive。包含 .class,Java 资源。

AAR - Android Archive。包含 classes.jar 以及其他 Android 相关文件,如 AndroidManifest.xml、R.txt、proguard.txt、res 文件夹(layout、values、drawable)等。

Android 可以使用两种文件 jaraar。作为库开发人员,通常使用 aar 共享 Android 资源,否则 - jar 像更轻量和常见的分发工件方式。

由于 aar 包含 jar,因此您可以使用它[关于]

区别:


9
问题中的引证与现实无关。当然可以在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 中央部署。


-2

主要区别是aar在android内部被分割成jar。

如果您的应用程序仅在用户应用程序中使用,仅在android studio中使用,则首选aar。

如果您计划让应用程序与c/c++编译的lib.so文件通信,则首选jar。

根据要求使用基于aar和jar,aar易于工作,jar更具灵活性。

这是我对Android 5棒棒糖版本的了解。新版本我不清楚。


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