[TOC]
在这万物皆卷的年代,再也无法躺平成为一个快乐的潜行胖子,我是👨🏻💻卷王,被“卷”的”juǎn“。在三十而立之后,有计划有目标地脱离卷军队列~
本文记录安卓APK 打包流程的分析,APK 打包过程涉及多个工具、多种类型源文件和中间文件,整个流程都被封装在 Android Studio IDE 中,了解其打包流程有助于理解 APK 中的文件构成,以用于做一些 APK 瘦身相关工作。
本文分两部分,首先介绍下打包过程中使用到的工具,然后分析下打包的流程。
打包相关工具
-
AAPT(Android Asset Packaging Tool)
AAPT 是 Android资源打包工具,会打包资源文件(res文件夹下的文件),并生成R.java和resources.arsc文件。
-
AIDL
AIDL工具会将所有的.aidl文件编译成.java文件。
-
JAVAC
JAVAC 用于编译 Java 源码,会将R.java、AIDL接口生成的java文件、应用代码java文件编译成.class文件。
-
dex
dex 工具用于生成 .dex 文件,会将 .class文件转换打包成一个.dex文件。
-
apkbuilder
apkbuilder 可以理解为一个压缩工具,会将资源文件和 .dex 文件生成未签名的.apk文件。
-
jarsigner
jarsigner 是签名工具,会将未签名的 .apk 文件转换为签名的 .apk 文件。
-
zipalign
资源对齐工具。
打包流程
APK 的打包流程主要包括以下步骤:
- 打包资源文件。资源文件主要包括 AndroidManifest.xml、res 文件夹的资源文件和 xml 文件,通过 AAPT 工具生成 R.java 文件和 resource.arsc 文件。
- 通过 AIDL 将 .aidl 文件翻译为 .java 文件,然后通过 javac 工具将工程下的所有 java 文件编译成 .class 文件,这里的 Java 文件包括 R.java、工程 Java文件 和 第三方库 Java 文件。
- 通过 dex 工具将上面生成的 .class 文件及第三方 .class 文件打包为 .dex 文件。
- 通过 apkbuilder 将 .dex 文件、第三方非 Java 文件(.so 文件)打包为未签名的 .apk 文件。
- 通过 jarsigner 签名工具对 .apk 文件进行签名,生成签名后的 .apk 文件。
- 最后通过 zipalign 工具对 .apk 文件中的资源文件进行内存对齐,以便于快速访问。
完成的打包流程如下图。
相关问题
-
资源文件如何通过 R.java 和 resource.arsc 快速索引到?
R.java 中存储了每个资源文件的访问 key, 而 resource.arsc 文件中存储了 key 和对应 value,value中包含了资源文件访问的路径,类似于 Map,这样就可以 O(1) 时间内访问到指定的资源文件。
-
最后一步为何需要对资源文件执行内存对齐操作?
只有内存对齐了之后每个资源文件的大小才是内存块的整数倍,这样的资源文件存储在磁盘中,可以通过起始内存块的地址快速访问到。