概述

Android应用程序包(Android application package,APK),是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。

apk 文件基于 zip 文件格式,它与 jar 文件的构造方式相似。

1. apk文件结构

\assets\              存放不经过aapt编译的资源文件
\lib\                 存放so文件
\META-INF\            存放签名文件
\META-INF\CERT.RSA    签名证书文件,存放的是公钥和加密算法描述 
\META-INF\CERT.SF     摘要加密文件,存放的是加密文件,是使用私钥对摘要明文加密后得到的密文信息,只有使用私钥配对的公钥才能解密该文件
\META-INF\MANIFES.MF  文件摘要文化,存放的是程序清单文件,包含包中所有文件的摘要明文
\res\                 存放的是资源文件,是经过aapt编译后的文件
\res\drawable*        存放图片和xml     
\AndroidManifest.xml  配置文件,包含组件的声明和配置
\classes.dex          java文件编译生成的可执行文件
\resources.arsc       经过aapt打包res目录下的资源文件后生成的文件

2. 粗略流程图

Android PackageInstaller安装apk android application package_java

3. 官方流程图

Android PackageInstaller安装apk android application package_Android_02

4. 详细打包流程

打包工具主要位于 sdk/build-tools/版本号/ 目录下。

4.1 打包资源文件,生成相应的 R.java 文件

【工具】aapt(Android Asset Package Tool)

【输入】res 文件夹,assets 文件夹,AndroidManifest.xml 文件

【输出】R.java,二进制的 resource.arsc ,res 文件夹(包括二进制的 xml 文件以及 没有改变的图片和 res/raw 下的文件),

没有改变的 assets 文件夹,二进制的 AndroidManifest.xml 文件

4.2 处理 aidl 文件,生成相应的 java 文件

【工具】aidl(Android Interface Denifition Language)

【输入】aidl文件

【输出】相应的 java 接口文件

4.3 编译所有的 java 文件,生成 class 文件

【工具】javac(java 编译器)

【输入】R.java,java接口文件,java源文件

【输出】class文件

4.4 把class文件转换成dex文件

【工具】dx.bat

【输入】class文件,第三方库文件.jar(jar包中大都是class文件)

【输出】classes.dex文件

4.5 打包生成apk文件

【工具】apkbuilder(主要用到的是sdk/tools/lib/sdklib.jar文件中的ApkBuilderMain类)

【输入】resource.arsc文件,AndroidManifest.xml文件,res文件夹,assets文件夹,classes.dex文件

【输出】apk文件

4.6 对apk文件进行签名

【工具】apksigner

【输入】未签名的apk文件

【输出】签名的apk文件

4.7 对签名后的apk文件进行对齐处理

【工具】zipalign

【输入】签名的apk文件

【输出】最终的apk文件

注:如果是release版本,需要对apk文件进行对齐处理。

对齐处理使得apk包中的所有资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度更快,同时减少运行时内存的使用。

5. 详细流程图

Android PackageInstaller安装apk android application package_java_03