APK构建流程

APK构建流程

在这里插入图片描述

  1. aapt 编译资源文件生成 R.java 并打包资源文件
  2. Java compiler Java编译器 编译Java代码与aidl 成.class文件
  3. dex工具把.class文件编译成.dex文件
  4. apkbuilder 把上面的文件打包成.apk包
  5. jarsigner给apk包签名
  6. zipalign 字节码优化

aapt/aapt2:Android资源打包工具(Android sdk 下build-tools/27.0.2/下)全称:Android Asses Packaging Tool
aidl:Android接口描述语言转化为跨进程通信.java文件的工具
javac:Java编译期
proguard:代码混淆工具
dx/d8:转化.class文件为Davik VM能识别的.dex文件
apkbuilder:打包生成apk包
jarsigner:签名工具
zipalign:字节码对齐优化工具

aapt

Android资源打包工具(Android sdk 下build-tools/27.0.2/下)全称:Android Asses Packaging Tool

资源合并

在这里插入图片描述

资源文件编译

在这里插入图片描述

res资源
  • 生成R.java文件。赋予每一个非assets资源一个ID值,以床凉的形式定义于R.java 文件中。
  • 生成resources.arsc文件,用来描述那些具有ID资源的配置信息,它的内容就相当于是一个资源索引表。包含了所有的ID值的数据集合。在该文件中,如果某个ID对应的是String,那么该文件会直接包含该值,如果ID对应的资源是某个layout或者drawable资源,那么该文件会存入对应资源的路径

R.java 结构图如下:
在这里插入图片描述

R.String.appname =0x7f0f0000;
0x7f代表的是正在编译的资源包
0f代表的是string类型,这个0f不是一成不变的
0000代表的是该字符串序号 0000是第一个字符串

resource.arsc文件(通过Android Studio Analyze apk功能查看resource.arsc 文件结构如下,从图中我们可以得出结论,resource.arsc就是一个资源索引表)
在这里插入图片描述

AndroidManifest文件

AndroidManifest文件是Android应用的全局配置文件,包名,权限,各种组件,版本号等等,编辑为一个二进制的xml文件

assets资源

是直接打包进apk的 如下图

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文件,混淆前后的映射文件。
转换为DEX文件
  • dx工具生成可供Android系统虚拟机可以执行的classes.dex文件,dx会将class转换为Dalvik字节码,生成常量池,消除冗余数据等。
  • 输入:所有的.class文件。
  • 输出:classes.dex文件。
打包apk文件
  • 打包生成apk文件,旧的apkbuilder脚本已经废弃,现在通过sdklib.jar的ApkBuilder类进行打包。
  • 输入:.ap_资源包文件,classes.dex文件,未编译的资源文件(assets资源等),libs等文件。
  • 输出:apk文件
签名apk文件
  • 对apk文件进行签名,签名后才能在设备上进行安装。
  • 输入:上一步中生成.apk文件,签名文件(debug or Release Keystore)。
  • 输出:签名后apk文件。
zipalign优化
  • zipalign对签名后的apk文件进行类对齐处理,使apk中所有资源文件巨雷文件起始偏移为4字节的整数倍,从而在通过内存映射访问apk文件时更快。同时也减少类在设备上运行时的内存消耗。
  • 输入:签名后的apk文件
  • 输出:对齐优化的apk文件

APK典型文件

  • AndroidManifest.xml 程序全局配置文件
  • classes.dex Dalvik字节码
  • resources.arsc 资源索引表
  • META-INF 该目录下存放的是签名信息
  • res 该目录下存放资源文件
  • assets 该目录可以存放一些配置或资源文件