介绍

APK 就是 Android Package 。 APK 文件,其实就是一个压缩包,解压后就会发现他内部主要就是资源文件和class.dex,这个class.dex 就是 Android 系统 Dalvik 虚拟机可执行的文件,

一个 APK 解压后的

添加图片

  • AndroidManifest.xml:对应源代码中的AndroidManifest.xml文件,但这里已经编译过了,文件内容已经不同了
  • assert目录: 对应源代码中的 assert 目录,是直接复制过来的
  • class.dex: 包含所有 Java 文件对应的字节码
  • lib 目录: 对应源代码中的 libs 目录,包含 so 文件
  • META_INF 目录: 包含CERT.RSA、CERT.SF、MANIFEST.MF等, 保存了各个资源文件的 SHA1 值,用于校验资源文件是否被篡改,从而防止二次打包时资源文件被替换。
  • res目录: 对应源代码中的 res 目录,包含了各种图片, xml 文件
  • resources.arsc:包含了各个资源文件的映射, 可以理解为索引, 通过该文件能找到对应的资源文件信息。

APK的打包流程

1.打包资源文件,生成R.java文件

通过 AAPT 工具,项目中的AndroidManifest.xml和布局文件 xml 都会编译,生成相应的R.java 文件 和 resources.arsc文件

  • AAPT : the Android Assert Package Tool, Android 资源打包工具 , 位于 android-sdk/build-tools目录下面

2.处理 AIDL 文件,生成相应的 Java 文件

通过 AIDL 工具解析接口定义文件,然后生成相应的 Java 代码接口供程序调用
如果项目中没有 AIDL 文件,可以跳过这一步。

  • AIDL: Android Interface Definition Language, Android 接口描述语言。位于 android-sdk/build-tools 目录下

3.编译项目源码,生成 class 文件

通过 JAVAC 工具(java 编译器),把项目中的所有 Java 文件,包括R.java 和.aidl文件编译成.class文件。
生成的.class 文件位于工程的bin/class 目录下

  • Javac 工具: 位于 javasdk/bin 下面,

4.转换所有的 class 文件,生成class.dex文件

通过 dx 工具,生成供 Android 系统 Dalvik 虚拟机执行的class.dex文件,任何第三方的 Libraries 和.class文件,都会被转成成.dex文件

  • dx工具: 将 Java 字节码转换成 Dalvik 字节码,压缩常量池,消除冗余信息。位于 android-sdk/build-tools 目录

5.打包生成 APK 文件

所有没编译的资源(如 image 等),编译过的资源和.dex文件,都会被 apkbuilder 工具 打包到最终的.apk 文件中

  • apkbuilder工具: 位于 android-sdk/tools目录,是一个脚本文件,实际调用的是android-sdk/tools/lib/sdklib.jar文件中的com.android.sdklib.build.ApkbuilderMain类。

6.对 APK 进行签名

通过 jarsigner 工具 对 APK 文件进行签名。因为只有被签名的文件才能安装到设备上。

  • jarsigner 工具 ,位于 android-sdk/build-tools 目录下

在开发过程中,主要用到的的就是两种签名,

  • 调试用的debug.keystore,它主要用于调试,在 AndroidStudio 或者 Eclipse 直接 run 以后安装到设备上使用的就是这个签名。
  • 正式版本的keystore

7.对签名后的 APK 进行对齐处理

通过 zipalign 工具 对 APK 进行对齐处理。对齐的作用就是减少运行时内存的使用
主要过程就是将 APK 包中的资源文件距离文件起始距离为 4 字节的倍数,这样通过内存映射访问的 apk 文件时速度更快。

  • zipalign 工具:位于android-sdk/build-tools 目录

第 1 , 2 , 4 , 6 , 7 步使用的工具都在 android-sdk/build-tools 下面

添加图片

流程图

添加图片


搬运地址:

Android APK打包流程

Android进阶:十四、熟悉 Android 打包编译的流程

android apk编译打包过程