一、Android APK打包过程
Android APK 的打包过程是一个多步骤的编译和优化流程,主要包括资源处理、代码编译、打包、签名和对齐优化等阶段。以下是详细的打包流程:
1. 资源处理(AAPT/AAPT2)
- 工具:
AAPT
(Android Asset Packaging Tool)或AAPT2
- 作用:
- 编译
res/
目录下的资源文件(如XML
、图片、字符串等),生成二进制格式文件(如resources.arsc
)。 - 生成
R.java
文件,为每个资源分配唯一 ID(如R.layout.activity_main
)。 - 处理
AndroidManifest.xml
,编译成二进制格式。
- 编译
- 优化点:
- 删除无用资源,压缩图片(如转
WebP
),减少 APK 体积。
- 删除无用资源,压缩图片(如转
2. 处理 AIDL 文件
- 工具:
aidl
- 作用:
- 将
.aidl
接口定义文件转换为 Java 接口文件,用于跨进程通信(IPC)。
- 将
- 优化建议:
- 减少频繁的 IPC 调用,避免性能问题。
3. Java/Kotlin 代码编译
- 工具:
javac
(Java)或kotlinc
(Kotlin) - 作用:
- 将 Java/Kotlin 源代码(包括
R.java
和 AIDL 生成的代码)编译成.class
文件。
- 将 Java/Kotlin 源代码(包括
- 优化点:
- 使用
R8
或ProGuard
进行代码混淆和优化,移除未使用的代码。
- 使用
4. 生成 DEX 文件
- 工具:
dx
或d8
- 作用:
- 将
.class
文件转换为 Android 虚拟机可执行的.dex
文件(Dalvik/ART 字节码)。 - 支持多
DEX
(multidex
)以解决 64K 方法数限制。
- 将
5. 打包未签名 APK
- 工具:
apkbuilder
或zipflinger
- 作用:
- 合并资源(
resources.arsc
、res/
)、代码(.dex
)、清单文件(AndroidManifest.xml
)和assets/
,生成未签名的 APK。
- 合并资源(
6. APK 签名
- 工具:
jarsigner
或apksigner
- 作用:
- 使用开发者密钥(
.keystore
)对 APK 签名,确保应用完整性和来源可信。
- 使用开发者密钥(
- 优化点:
- 自动化签名配置(如 Gradle 的
signingConfigs
)。
- 自动化签名配置(如 Gradle 的
7. Zipalign 对齐优化
- 工具:
zipalign
- 作用:
- 调整 APK 文件结构,使资源按 4 字节对齐,提升内存映射效率,减少运行时内存占用。
最终 APK 文件结构
解压 APK 后可见以下关键文件:
classes.dex
:编译后的代码。resources.arsc
:资源索引表。res/
:编译后的资源。AndroidManifest.xml
:应用配置。META-INF/
:签名信息。
总结
APK 打包流程可简化为:
资源处理 → 代码编译 → 打包 → 签名 → 对齐优化
核心目标:生成高效、安全、可安装的 Android 应用。
如需进一步优化 APK 体积或性能,可参考各阶段的工具配置(如 aaptOptions
、R8
等)。
二、APK安装流程
Android APK 的安装流程主要分为 复制 APK 文件、解析应用信息、优化代码(如 AOT 编译)、注册应用 几个关键步骤,具体流程如下:
1. 复制 APK 文件
- 路径:APK 会被复制到系统的应用目录(如
/data/app/<package-name>/
),通常以.base.apk
命名。 - 权限:目录权限为
755
(所有者可读写,其他用户只读),确保应用数据隔离。 - 多用户支持:如果是多用户设备(如工作资料),APK 会被复制到对应的用户目录(如
/data/user/<user-id>/
)。
2. 解析应用信息
- 解析
AndroidManifest.xml
系统通过PackageManagerService
(PMS)解析 APK 中的清单文件,获取:- 包名(
packageName
)、版本号(versionCode
)。 - 权限声明(
<uses-permission>
)、四大组件(Activity/Service 等)信息。
- 包名(
- 生成
Package
对象
将解析结果存入 PMS 内存,后续通过getPackageInfo()
可查询。
3. 优化代码(DEX→OAT)
- 工具:
dex2oat
(Android 5.0+ 使用 ART 虚拟机)。 - 作用:
- 将 APK 中的
classes.dex
转换为更高效的OAT
格式(机器码),提升运行速度。 - AOT(Ahead-Of-Time)编译:安装时编译(默认行为),或 JIT(Just-In-Time) 运行时编译(Android 7.0+ 混合模式)。
- 将 APK 中的
- 输出文件:
- 生成
.odex
(Optimized DEX)或.vdex
(Verifier DEX)文件,存放于/data/dalvik-cache/
。
- 生成
4. 注册应用
- 注册四大组件:
将 Activity、Service 等组件信息注册到ActivityManagerService
(AMS),以便系统调度。 - 更新应用列表:
更新 PMS 中的应用数据库(packages.xml
和packages.list
),记录包名、路径、权限等。
5. 安装完成
- 广播通知:
发送ACTION_PACKAGE_ADDED
广播,通知其他应用(如桌面启动器)更新图标。 - 用户可见:
应用图标出现在桌面,可正常启动。
安装方式差异
安装方式 | 流程特点 |
---|---|
普通安装 | 走完整流程(复制、解析、优化、注册)。 |
静默安装 | 系统应用或 root 权限下直接安装,不提示用户(如系统更新)。 |
Instant Run | 开发调试时,仅推送增量代码,跳过部分优化步骤,加快安装速度。 |
Split APKs | 动态功能模块(Dynamic Feature )按需安装,主 APK 安装后下载模块。 |
关键系统服务
- PackageManagerService (PMS):管理 APK 安装、卸载、解析。
- ActivityManagerService (AMS):处理应用组件生命周期。
- Installd:底层服务,负责 APK 文件复制和 DEX 优化。
用户可见行为
- 点击安装按钮或通过
adb install
触发。 - 系统显示“安装中”进度条(实际在后台执行上述流程)。
- 安装完成后提示“应用已安装”。
总结
Android APK 安装的本质是:
将 APK 文件安全地部署到系统,并注册到框架服务中。
优化措施(如 AOT 编译)平衡了安装速度和运行时性能。