APK构建打包过程
- 通过aapt打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样)
- 处理.aidl文件,生成对应的Java接口文件
- 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件
- 通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex
- 通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk
- 通过Jarsigner工具,对上面的apk进行debug或release签名
- 通过zipalign工具,将签名后的apk进行对齐处理。
工具介绍:
工具 | 描述 |
---|---|
aapt/aapt2 | Android资源打包工具 |
aidl | Android接口描述语言转换为跨进程通信.java文件的工具 |
javac | Java编译器 |
proguard | 代码混淆工具 |
dx/d8 | 转化.class文件为Davik VM能识别的.dex文件 |
apkbuilder | 打包生成apk |
jarsinger | 签名工具 |
zipalign | 字节码对齐优化工具 |
资源编译流程
AAPT: Android Asset Packaging Tool
资源合并
资源文件编译
编译的内容包括res资源,AndroidManifest文件,assets资源
编译之后生成两个文件:
R.java文件:赋予每个非assets资源一个id值,以常量的形式定义于R.java文件中
resources.arsc文件,用来描述那些具有id值的资源的配置信息,它的内容就相当于是一个资源索引表。包含了所有的id值的数据集合。在该文件中,如果某个id对应的是string,那么该文件会直接包含该值,如果id对应的资源是某个layout或者drawable资源,那么该文件会存入对应资源的路径。
R.java文件结构图
id值的最高字节代表package的id,次高字节代表type的id,最后的字节代表当前类型中出现的序号
resource.arsc文件
通过Analyze apk功能查看resource.arsc文件结构
aidl文件编译
aidl : Android Interface Definition Language
- aidl工具解析接口定义文件,然后生成相应的Java代码接口供程序调用。如果在项目中没有使用到aidl文件,则可以跳过这一步。
- 输入:aidl后缀的文件,位于工程src/main/aidl目录。
- 输出:可用于进程通信的C/S端java代码,位于build/generated/source/aidl。
Java源码编译
- R.java和aidl生成的Java文件,再加上工程的源代码,使用javac编译生成class文件。
- 输入:java源码文件夹(另外还包括了aapt生成的R.java,aidl生成的java文件,以及BuildConfig.java)。
- 输出:对于gradle编译,生成的class文件保存在build/intermediates/classes
proguard代码混淆
- javac完成代码编译之后,一般还会对源码进行混淆,类似于加密,目的是为了增加反编译的难度,同事也将代码名称进行缩短,减少代码占用体积。
- 输入:编译后的.class文件,混淆规则配置文件proguard-rules.pro。
- 输出:被混淆后的.class文件,混淆前后的映射文件。
混淆之后的class文件转换为dex文件
- dx工具生成可供Android系统虚拟机可以执行的classes.dex文件。dx会将class转换为Dalvik字节码,生成常量池,消除冗余数据
- 输入:所有.class文件。
- 输出:classes.dex文件。
如上图所示,多个.class文件生成一个.dex文件
打包apk文件
- 打包生成apk文件。旧的apkbuilder脚本已经废弃,现在通过sdklib.jar的ApkBuilder类进行打包
- 输入:.ap_资源包文件,classes.dex文件,未编译的资源文件(assets资源等),libs等文件。
- 输出:apk文件。
签名apk文件
- 对apk文件进行签名,签名后才能在设备上进行安装。
- 输入:上一步中生成.apk文件、签名文件(Debug or Release keystore)
- 输出:签名后apk文件。
签名之后的apk会多一个META-INF文件夹,针对apk的签名信息。
zipalign优化
- zipalign对签名后的apk文件进行对齐处理,使apk中所有资源文件距离文件起始偏移为4字节的整数倍,从而通过内存映射访问apk文件时会更快。同时也减少了在设备上运行时的内存消耗。
- 输入:签名后的apk文件。
- 输出:对齐优化的apk文件。
APK典型文件
文件或文件夹 | 作用 |
---|---|
AndroidManifest.xml | 程序全局配置文件 |
classes.dex | Dalvik字节码 |
resources.arsc | 资源索引表 |
MEAT-INF | 该目录下存放的签名信息 |
res | 该目录存放资源文件 |
assets | 该目录存放一些配置或资源文件 |
关联技术
- APK加固
- 资源混淆:对资源索引表进行修改,从而混淆资源名
- 热修复:multidex的学习
- 插件化:multidex的学习
- 快速多渠道打包
DEX编译过程
编译流程
- java源码编译:通过javac将源码编译为.class文件
- 多DEX分包:脚本将类根据一定规则划分到主dex和从dex中,生成配置文件
- proguard优化混淆:对.class文件进行压缩、优化、混淆处理
- 转换为dex文件:dx/d8将.class文件转换为dex文件
来源:CSDN
作者:csdn_Mew
链接:https://blog.csdn.net/CSDN_Mew/article/details/104126025