欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android-少不了的 aar 文件及生成方法

程序员文章站 2023-01-29 12:09:20
aar,为 android 而生。 在使用 eclipse 开发 android 的那个时代(其实也就几年前而已),如果想代码打包,只有一个方法-jar包,但是jar只能把 java 文件代码打包进...

aar,为 android 而生。

在使用 eclipse 开发 android 的那个时代(其实也就几年前而已),如果想代码打包,只有一个方法-jar包,但是jar只能把 java 文件代码打包进去,如果要使用的jar 是个有布局和资源的库的话,很坑爹的还需要把布局文件引入。

android studio 出来之后,出现了一个新的方法,打包 aar 文件 ,这个不仅可以把类给打进去,还包含 androidmanifest.xml和资源文件等,使用的话,直接引入一个aar 文件就足够了,非常方便。

aar,名字来源于 android archive,见名知义,是一个android库项目的二进制归档文件,使用 android studio ,非常简单可以生成一个 aar 文件。

如何 生成 aar 文件

首先创建一个 android library module. 等待 gradle 构建完毕, 就可以在项目名称/模块名称/build/outputs/aar/中找到这个库项目的 aar 文件了。 如果修改了代码,也可以通过 build > make project 的方式重新生成文件。

Android-少不了的 aar 文件及生成方法

其实这个过程,也生成了对应的 jar 包,文件在项目名称/模块名称/build/intermediates/bundles/debug(release)/classes.jar,classes.jar 这个library 对应的 jar 包。

Android-少不了的 aar 文件及生成方法

不过在 aar 文件中,修改后缀名打开后,里面也有 classes.jar ,和这个 classes.jar 是同样的内容,

aar 文件的结构

aar 文件的文件扩展名为 .aar,文件本身是一个 zip 文件,以下内容是必须包含的:

/androidmanifest.xml /classes.jar /res/ /r.txt

此外,根据打包的 library module 情况不同,打包出来的 aar 文件也可能包含以下内容:

/assets/ /libs/名称.jar /jni/abi 名称/名称.so(其中 abi 名称 是 android 支持的 abi 之一) /proguard.txt /lint.jar

上个步骤,我们生成的 .aar 文件,手动将后缀名改成 .zip文件,解压之后的样子是这个样子的:

Android-少不了的 aar 文件及生成方法

项目中使用 aar 文件的两种方式

aar 文件使用有两种方式,一种是使用在线的(网上的),一种是添加本地的 aar 文件。

本地 aar 使用

把 aar 文件放在目标 module 一个文件目录内,比如就放在 libs 目录内; 在目标 module 的 build.gradle 文件添加如下内容;
repositories {  
    flatdir {  
        dirs 'libs'   
    }  
}

dependencies {  
    compile(name:'aar的名字', ext:'aar')  
}

远程 aar 使用

事实上,在工作项目中,远程的 aar 文件的使用频率比本地高,因为用起来很方便,我们依赖很多的第三方库就是远程一览的方式。

远程的 aar 使用的前提是有一个远程的库链接,然后通过 gradle 下载依赖,因此有下面的两个步骤:

rootproject的 build.gradle 中添加远程仓库地址的引用
allprojects {
    repositories {
        // google的官方仓库
        google()

        // 出名的公共*仓库
        jcenter()
        mavencentral()

        //如果有私库,也要添加链接
        //....
    }
}

其中google()是谷爹的官方库的仓库地址, jcenter() 和 mavencentral()是比较出名的的*仓库,基本第三方库都会上传到这些仓库。 有时公司也会有自己的一些封装库,不想对外暴露,就放在自己的私有仓库中,仓库的地址也要在这里添加。

module 的 build.gradle 中添加具体 aar 的依赖。
dependencies {
    implementation 'com.android.support:support-v4:25.3.1'
}

aar 使用的注意事项

aar 使用起来爽歪歪,但是以下问题也要注意,否则使用过程中可能引起不适~

应用模块的 minsdkversion 必须大于或等于 library module 中定义的版本

aar 作为相关应用模块的一部分编译,因此,库模块中使用的 api 必须与应用模块支持的平台版本兼容,所以 aar 中的 minsdkversion 要尽量的设置低一点。

资源合并问题

如果 aar 中有资源文件,集成过程中,很容易出现资源冲突,例如两个相同名字的图片什么的。为了避免这个问题,有两种方法,一是制定一个不用冲突的命名规范,二是library module 的 build.gradle 中设置资源前缀。第一种真的很难,推荐第二种解决方法。


android {
  resourceprefix "<前缀>"
}
aar 不能使用 assets 原始资源

工具不支持在库模块中使用原始资源文件(保存在 assets/ 目录中)。应用使用的任何原始资源都必须存储在应用模块自身的 assets/ 目录中

有一个比较重要的问题

有一个核心问题,就是如果是aar 文件引用了一些第三方库,如果使用本地 aar 方式依赖的话,依赖 aar 的 module 无法获取 aar 中的依赖的第三方库。

* 非正式的官方原因说明在此

本地 aar 的解决方法可以参考这个:android-fat-aar,但是很不幸 gradle 2.2.3+ 以上,这个就不适用了。

不过不要慌,通过把 library module 上传到远程仓库的方式,然后远程依赖方式引用该库,可以解决这个问题。