APK 打包流程

402 阅读2分钟

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 的打包流程主要包括以下步骤:

  1. 打包资源文件。资源文件主要包括 AndroidManifest.xml、res 文件夹的资源文件和 xml 文件,通过 AAPT 工具生成 R.java 文件和 resource.arsc 文件。
  2. 通过 AIDL 将 .aidl 文件翻译为 .java 文件,然后通过 javac 工具将工程下的所有 java 文件编译成 .class 文件,这里的 Java 文件包括 R.java、工程 Java文件 和 第三方库 Java 文件。
  3. 通过 dex 工具将上面生成的 .class 文件及第三方 .class 文件打包为 .dex 文件。
  4. 通过 apkbuilder 将 .dex 文件、第三方非 Java 文件(.so 文件)打包为未签名的 .apk 文件。
  5. 通过 jarsigner 签名工具对 .apk 文件进行签名,生成签名后的 .apk 文件。
  6. 最后通过 zipalign 工具对 .apk 文件中的资源文件进行内存对齐,以便于快速访问。

完成的打包流程如下图。

image-20210826001846615.png

相关问题

  • 资源文件如何通过 R.java 和 resource.arsc 快速索引到?

    R.java 中存储了每个资源文件的访问 key, 而 resource.arsc 文件中存储了 key 和对应 value,value中包含了资源文件访问的路径,类似于 Map,这样就可以 O(1) 时间内访问到指定的资源文件。

  • 最后一步为何需要对资源文件执行内存对齐操作?

    只有内存对齐了之后每个资源文件的大小才是内存块的整数倍,这样的资源文件存储在磁盘中,可以通过起始内存块的地址快速访问到。