Andorid 代码打包--aar

来源:互联网 发布:怎么剔除异常数据 编辑:程序博客网 时间:2024/05/21 22:41

背景

在日常开发中,我们经常会遇到这样的情况,我们需要将自己的代码封装成SDK供第三方使用,在这种情况下,采取开发应用的做法就可能行不通了。

我们知道,andorid打包的流程大致分为两个过程,代码的打包以及资源文件的打包,流程图如下:
这里写图片描述

(具体可参考博客android Apk打包过程概述_android是如何打包apk的)
所以当我们打包代码给第三方使用的时候,会存在这样的几个坑:
1. 我们在activity,fragment等中使用的R.X.X形式的应用,实际上指向的编译过程中指向的资源ID,而当我们的代码由第三方导入的时候,资源文件重新编译,ID已经发生了变化。
2. 我们自己代码中的activity,service等由于在第三应用中,没有注册,直接使用的话会报类找不到等错误。

在早期的Android版本中,大家的实现基本上是java文件和资源文件分开进行的,java文件打包成jar包,资源文件自己拷贝到宿主对应的目录中,基本的思路有两种:
一是通过系统提供的方法getResources().getIdentifier("main_activity", "layout", getPackageName()); 来读取资源文件;
二是通过反射根据资源名字获取资源ID(可以参考:这篇文章);
总之,实现这样的功能比较繁琐,对开发插件和接入插件的开发人员来说,都比较恶心。

在后来的android studio中,谷歌提供了一种新的打包方式:aar,这种打包方式与之前的jar包方式不同,jar包只包含了class文件以及清单文件,但是aar包中不光包含class文件、清单文件,还包括了资源文件,以及res文件夹下的一系列文件,而且在android studio中可以直接依赖,与之前的方式相比方便了很多。下面我们就来看一下具体怎么操作!

aar的操作方法

新建一个Library:

File->new -> new module ->android library,新建一个Android library

实现SDK中的逻辑

接下来就是实现你需要的逻辑,我们可以像在宿主应用开发中一样,使用R.X.X等形式,其中的代码混淆以及签名等配置基本上和普通的APP的开发是一样的,需要注意的是,混淆不要混淆activity,fragment等的名称,否则在第三方应用中将无法找到你的页面的名称。

生成aar文件

编码完成以后,选择:build->rebuild project,重新编译工程,我们可以在library部分的build->outputs->aar文件夹下,找到我们需要的aar文件
这里写图片描述
我们可以将aar文件解压观察内部结构,麻雀虽小,五脏俱全。

宿主使用aar文件

宿主可以像使用普通jar包一样使用aar文件,大概的使用方式有两种:
一种是宿主新建一个library ,然后导入我们的aar文件:
这里写图片描述

另外一种是通过添加依赖的方式引入,这里推荐此种方法。首先在宿主工程的app下的build.gradle添加如下配置:

repositories {        flatDir {            dirs 'libs' //this way we can find the .aar file in libs folder        }    }

在dependencies中添加如下配置:

    compile fileTree(dir: 'libs', include: ['*.jar'])    compile(name:'XXX', ext:'aar')//这里的XXX是你引入的aar的包的名称,不包含后缀

最后我们将aar文件放入工程的libs文件夹。

完工

编译宿主工程,接下来我们就可以愉快的使用aar中的页面了。

结语

通过上述的操作,我们可以比较方便的实现插件SDK一类的开发,结合自己编写一些小脚本(比如自动构建以及copy出aar文件等),更能够提高我们日常的开发效率。