Android APK编译过程以及安装过程

一、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 文件。
  • 优化点
    • 使用 R8ProGuard 进行代码混淆和优化,移除未使用的代码。

4. 生成 DEX 文件

  • 工具dxd8
  • 作用
    • .class 文件转换为 Android 虚拟机可执行的 .dex 文件(Dalvik/ART 字节码)。
    • 支持多 DEXmultidex)以解决 64K 方法数限制。

5. 打包未签名 APK

  • 工具apkbuilderzipflinger
  • 作用
    • 合并资源(resources.arscres/)、代码(.dex)、清单文件(AndroidManifest.xml)和 assets/,生成未签名的 APK。

6. APK 签名

  • 工具jarsignerapksigner
  • 作用
    • 使用开发者密钥(.keystore)对 APK 签名,确保应用完整性和来源可信。
  • 优化点
    • 自动化签名配置(如 Gradle 的 signingConfigs)。

7. Zipalign 对齐优化

  • 工具zipalign
  • 作用
    • 调整 APK 文件结构,使资源按 4 字节对齐,提升内存映射效率,减少运行时内存占用。

最终 APK 文件结构

解压 APK 后可见以下关键文件:

  • classes.dex:编译后的代码。
  • resources.arsc:资源索引表。
  • res/:编译后的资源。
  • AndroidManifest.xml:应用配置。
  • META-INF/:签名信息。

总结

APK 打包流程可简化为:
资源处理 → 代码编译 → 打包 → 签名 → 对齐优化
核心目标:生成高效、安全、可安装的 Android 应用。

如需进一步优化 APK 体积或性能,可参考各阶段的工具配置(如 aaptOptionsR8 等)。

二、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+ 混合模式)。
  • 输出文件
    • 生成 .odex(Optimized DEX)或 .vdex(Verifier DEX)文件,存放于 /data/dalvik-cache/

4. 注册应用

  • 注册四大组件
    将 Activity、Service 等组件信息注册到 ActivityManagerService(AMS),以便系统调度。
  • 更新应用列表
    更新 PMS 中的应用数据库(packages.xmlpackages.list),记录包名、路径、权限等。

5. 安装完成

  • 广播通知
    发送 ACTION_PACKAGE_ADDED 广播,通知其他应用(如桌面启动器)更新图标。
  • 用户可见
    应用图标出现在桌面,可正常启动。

安装方式差异

安装方式流程特点
普通安装走完整流程(复制、解析、优化、注册)。
静默安装系统应用或 root 权限下直接安装,不提示用户(如系统更新)。
Instant Run开发调试时,仅推送增量代码,跳过部分优化步骤,加快安装速度。
Split APKs动态功能模块(Dynamic Feature)按需安装,主 APK 安装后下载模块。

关键系统服务

  • PackageManagerService (PMS):管理 APK 安装、卸载、解析。
  • ActivityManagerService (AMS):处理应用组件生命周期。
  • Installd:底层服务,负责 APK 文件复制和 DEX 优化。

用户可见行为

  1. 点击安装按钮或通过 adb install 触发。
  2. 系统显示“安装中”进度条(实际在后台执行上述流程)。
  3. 安装完成后提示“应用已安装”。

总结

Android APK 安装的本质是:
将 APK 文件安全地部署到系统,并注册到框架服务中
优化措施(如 AOT 编译)平衡了安装速度和运行时性能。

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计