第一步:打包资源文件,生成R.java文件.打包资源的工具 aapt 位于 android-sdk\platform-tools目录下 ,该工具的源码在Android 系统源码的 frameworks\base\tools\aapt目录下,生成的过程主要是调 用了aapt 源码目录下 Resource.cpp文件中的 buildResourcesO函数,该函数首先检查AndroidManifest.xml 的合法性,而后对res目录下的资源子目录进行处理, 处理的函数为 makeFileResources(),处理的内容包括资源文件名的合法性检查,向资源表 table 添加条目等,处理完后调用 compileResourceFile()函数编译 res与 asserts目录下的资源 并生成 resources.arsc 文件,compileResourceFile数位于aapt源码目录的 ResourceTable.cpp 文件中,该函数最后会调用parseAndAddEntry0函数生成R.java 文件,完成资源编译后,接 下来调用 compileXmlFile函数对res目录的子目录下的 xml文件分别进行编译,这样处理 过的 xml 文件就简单的被“加密”了,最后将全部的资源与编译生成的 resources.arsc 文件 以及“加密”过的AndroidManifcst.xml文件打包压缩成resources.ap_文件(使用Ant工具命 令行编译则会生成与 build.xml中“project name”指定的属性同名的ap 文件).java
第二步:处理aidl文件,生成相应的Java文件.对于没有使用到aidl的Android工程, 这一步能够跳过.这一步使用到的工具为aidl,位于 android-sdk\platform-tools目录下,aidl 工具解析接口定义文件(aidl为 android interface definition language的首字母写,Android 接口描述语言)并生成相应的 Java 代码供程序调用,有兴趣的朋友能够查看它的源码,位 于 Android 源码的 frameworks\base\tools\haidl 目录下.android
第三步:编译工程源代码,生成相应的class文件.这一步调用javac编译工程src目录 下全部的java源文件,生成的 class文件位于工程的bin\classes目录下,假定编译 工程源代码时程序是基于 Android SDK开发的,实际开发过程当中,也有可能会使用Android NDK 来编译 native 代码,所以,若是可能的话,这一步还须要使用 Android NDK 编译C/C++ 代码,固然,编译C/C++代码的步骤也能够提早到第一步诚第二步.函数
第四步:转换全部的class文件,生成classes.dex文件.前面曾屡次提到,Android系统 Dalvik 虚拟机的可执行文件为 DEX格式,程序运行所需的classes.dex就是在这一步生成的, 使用到的工具为dx,它位于 android-sdk\platform-tools目录下,dx工具主要的工做是将Java 字节码转换为 Dalvik字节码、压缩常量池,消除冗余信息等工具
第五步:打包生成APK文件.打包的工具为apkbuilder,官位于android-sdk\tools目录 下,apkbuilder为一个脚本文件,实际调用的是 android-sdk\tools\lib\sdk\lib.jar 文件中的 com.android.sdklib.build.ApkBuilderMain类,它的实现代码位于 Android 系统源码的 sdk\sdkmanager\libs\sdklib\src\com\androidsdk\lib\build\ApkBuilderMain.java 文件,代码构建 了一个 ApkBuilder类,而后以包含 resources.arsc 的文件为基础生成ak文件 这个文件 通常为 ap_结尾的文件,接者调用 addSourceFolderO函数添加工程的资源,addSourceFolderO 会调用 processFileForResourceO函数往apk 文件中添加资源,处理的内容包括res目录与assets 目录中的文件,添加完资源后调用 addResourcesFromJar()数往apk文件中写入依赖库,接 着调用 addNativeLibraries()函数添加工程libs目录下的Native库(经过Android NDK编译生 成的so或bin 文件),最后调用 sealApk()关闭apk文件,ui
第六步:对APK文件进行签名.Android 的应用程序须要签名才能在Android设备上安 装,签名apk文件有两种状况:一种是在调试程序时进行签名,使用 Eclipse开发Android程 序时,在编译调试程序时会本身使用一个debug.keystore对apk进行签名: 另外一种是打包发 布时对程序进行签名,这种状况下须要提供了一个符合Android 开发文档中要求的签名文件. 签名的方法也有两种:一种是使用 JDK 中提供的jarsigner 工具签名:另外一种是使用Android 源码中提供的 signapk工具,它的代码位于 Android 系统源码的 build\tools\signapk目录下.加密
第七步:对签名后的 APK文件进行对齐处理.这一步须要使用到的工具为zipalign,它 位于 android-sdk\tools目录,源码位于 Android 系统源码的 build\tools\zipalign目录,它的主 要工做是将apk包进行对齐处理,使apk包中的全部资源文件距离文件起始偏移为4字节整 数倍,这样经过内存映射访问apk文件时的速度会更快,验证apk文件是否对齐过的工做由 ZipAlign.cpp 文件的 verify()函数完成,处理对齐的工做则出 process()函数完成.debug
官方流程图 调试
简化流程图 orm
详细的流程图 cdn