Android APK打包流程

365 阅读3分钟
Apk文件组成
  • AndroidManifest.xml 程序全局配置文件
  • classes.dex Dalvik字节码
  • resources.arsc 资源索引表, 解压缩resources.ap_就能看到
  • res\ 该目录存放资源文件(图片,文本,xml布局)
  • assets\ 该目录可以存放一些配置文件
  • src\ java源码文件
  • libs\ 存放应用程序所依赖的库
  • gen\ 编译器根据资源文件生成的java文件
  • bin\ 由编译器生成的apk文件和各种依赖的资源
  • META-INF\ 该目录下存放的是签名信息
APK打包的流程

知道了apk包体的内容,我们应该会更好的理解Android打包流程:

apk打包流程图

这个打包流程主要分为以下步骤:

1、打包资源文件,生成R.java文件和 resources.ap_文件

打包资源的工具是aapt(The Android Asset Packaing Tool),位于android-sdk/platform-tools目录下。

处理的包括 res目录、assert目录、 AndroidManifest.xml 以及 Android.jar 文件

2、处理aidl文件,生成对应的.java接口文件

这一过程中使用到的工具是aidl(Android Interface Definition Language),即Android接口描述语言。位于android-sdk/platform-tools目录下。aidl工具解析接口定义文件然后生成相应的Java代码接口供程序调用。

如果在项目没有使用到aidl文件,则可以跳过这一步。

3、编译项目源代码,生成对应的.class文件

项目中所有的Java代码,包括R.java和AIDL生成的java文件,都会变Java编译器(javac)编译成.class文件,生成的class文件位于工程中的bin/classes目录下。

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

dx工具生成可供Android系统Dalvik虚拟机执行的classes.dex文件,该工具位于android-sdk/platform-tools 目录下。

任何第三方的libraries和.class文件都会被转换成.dex文件。

dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。

5、打包生成未签名的.apk文件

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

这个过程的工具在3.0之前用apkbuilder工具,但是apkbuilder内部也是使用android-sdk/tools/lib/sdklib.jar文件中的com.android.sdklib.build.ApkbuilderMain,所以3.0之后直接使用了sdklib的ApkBuilderMain

6、对apk文件进行签名

android的应用程序需要签名才能在android设备上安装,签名apk文件有两种情况:

  • 在调试应用程序时,也就是我们通常称为的debug模式的签名,平时开发的时候,在编译调试程序时会自己使用一个debug.keystore对apk进行签名
  • 正式发布时对应用程序打包进行签名,这种情况下需要提供一个符合android开发文档中要求的签名文件。这种签名也是分两种: JDK中提供的jarsigner工具签名 、android源码中提供的signapk工具

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

如果发布的apk是正式版的话,就必须对APK进行对齐处理,用到的工具是zipalign,它位于android-sdk/tools目录下。

对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。

对齐的作用就是减少运行时内存的使用。

相关工具

相关工具