Android档案库(aar)vs标准jar

Xtr*_*ica 124 java android jar aar

我一直在阅读一些关于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?

uni*_*ify 206

AAR由于以下原因,文件更类似于Jars而不是Dlls:

Dlls可以在应用程序之间共享,其中AARs和jar与您的应用程序一起打包.

AARs vs Jars:

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

总之,AARs是朝着正确方向迈出的重要一步.

注意:
使用apk-libs 进行了类似的尝试,但它们现在已经过时,因为AAR它们要好得多.

  • @LarH我认为这意味着您可以在应用程序之间共享代码(aar文件),但它将分别包含在每个包中,以便用户独立安装应用程序.如果安装了2个应用程序并且两个都使用相同的aar,则android运行时可能足够聪明,只能加载一次. (5认同)
  • @Mohammadmoradyar你可以在你的库上使用Proguard来混淆你的类,但是和任何基于Java的字节码一样,没有办法阻止人们反编译代码. (5认同)
  • 我对 AAR 文件有很大的问题。我想制作一个 AAR 文件并将其提供给一些商家,以便为我们的业务提供支付解决方案。我不希望他们能够反映我们的班级成员,并且他们不能从他们的应用程序调用方法。我有什么方法可以保护我的代码免受反射。 (2认同)

yoA*_*ex5 12

JAR 与 AAR

\n

JAR\xe2\x80\x93 Java 存档。包含.classjava资源

\n

AAR\xe2\x80\x93 Android 存档。包含classes.jar和其他 Android 相关文件,如 AndroidManifest.xml、R.txt、proguard.txt、res 文件夹(布局、值、drawable)等。

\n

Android 可以处理文件jaraar. 作为库开发人员通常aar用于共享 Android 资源,否则 -jar喜欢更轻量级和通用的方式来分发工件。

\n

既然aar包含jar你就可以使用它[关于]

\n

不同之处:

\n\n


小智 10

声明" Jar和AAR之间的主要区别在于AAR包括布局,drawable等资源 "并不符合JAR文件规范,因此不是事实.根据JAR文件规范:

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

如您所见,没有内容限制禁止在JAR文件中包括布局,绘图等资源.有关更多详细信息,请参阅Java®虚拟机规范的第5.3条"创建和加载".

所以关于Android Archive Library(aar)vs标准jar的问题.答案取决于您使用的构建工具.

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

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

  • 我不知道 Java 世界如何,但在 Android 世界中,jar 文件不能包含资源。也就是说,即使资源位于 .jar 存档中,它们也不会被带到包含它们的项目中:/sf/ask/173243311/ (2认同)

h22*_*h22 5

问题中的引用与当前现实没有什么共同之处。当然,可以在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')
    ..
}  
Run Code Online (Sandbox Code Playgroud)

引用 Maven中央部署。