【Android 修炼手册】常用技术篇 — 聊聊 Android 的打包
Android APK 包结构
- assets
原生资源文件,不会被压缩或者处理
- classes.dex
java 代码通过 javac 转化成 class 文件,再通过 dx 文件转化成 dex 文件。如果有多个 dex 文件,其命名会是这样的:
classes.dex classes2.dex classes3.dex …
- lib/
保存了 native 库 .so 文件,其中会根据 cpu 型号划分不同的目录,比如 ARM,x86 等等
- res/
保存了处理后的二进制资源文件
- resources.arsc
保存了资源 id 名称以及资源对应的值/路径的映射
- META-INF/
用来验证 APK 签名,其中有三个重要的文件 MANIFEST.MT,CERT.SF,CERT.RSA
- MANIFEST.MF 保存了所有文件对应的摘要
- CERT.SF 保存了MANIFEST.MF 中每条信息的摘要
- CERT.RSA 包含了对 CERT.SF 文件的签名以及签名用到的证书
- AndroidManifest.xml
整体流程
.java
和 .kt
代码文件被 Java 编译器和 Kotlin 编译器协作编译为 .class
文件,这些文件又被编译为 .dex
文件,最终被打包进 .apk
文件。
主要有下面几个步骤:
- 使用 AAPT2 编译资源文件生成 resources.arsc 以及 R.java
- 使用 aidl 处理 aidl 文件,生成 java 文件
- 使用 JAVAC 编译 java 文件,生成 classes 文件
- 使用 DX/D8 处理 class 文件,生成最终需要的 dex 文件
- 使用 Android NDK 处理 native 代码生成 .so 文件
- 使用 apkbuilder 生成 未签名的 APK
- 使用 apksigner 对 Apk 进行签名,生成最终的 APK
签名
多渠道打包
启动
当你从应用商店下载一个应用的时候,你下载的就是包含了所有 .dex
以及资源的 apk 安装包,并被安装到设备上。当你从 launcher 上点击一个应用图标的时候,系统就会启动一个新的 Dalvik 进程,并将应用包含的 dex 代码加载进来,这些代码进一步在运行时被 Interpreter 解释器解释或者被 JIT 编译器编译。然后你就看到了应用的页面了。