前言html
转载请声明,转自【http://www.javashuo.com/article/p-wlbnlznl-gm.html】,谢谢!java
APK,即Android Package,是将android程序和资源整合在一块儿,造成的一个.apk文件。相信全部的Android程序员是在IDE的帮助下,完成打包垂手可得,但对打包流程真正清楚的可能并很少。本章的内容比较简单,也是很是基础的内容,可是对理解android应用的结构却有很大的帮助。笔者写这篇文章的目的,一方面是为了弥补这方面的盲点,回顾和梳理apk打包方面的理论知识点;第二方面,是为了给后续写Android虚拟机知识作铺垫,进而去研究android的性能优化,这也是把这篇文章放到Android性能优化系列文章当中的缘由;第三方面,也是为了方便读者理解Android虚拟机的相关内容。android
对于在IDE,如Android Studio上操做打包的过程,本文不作演示,对于更深刻的源码分析,也不在本文讨论之列,出于前面说到的缘由,本文只简单阐述其打包流程,本文主要内容以下:程序员
1、apk构建流程图segmentfault
如下截图为Google官方提供的详细的apk构建过程图,其中包含了各个环节所用到的工具和中间相关的文件。数组
apk构建过程(绿色部分为对应环节工具,蓝色部分为相关文件)性能优化
2、构建过程当中所用工具app
以下截图展现了apk构建过程当中所使用的部分工具,这些工具大部分都在sdk/build-tools/文件夹下:工具
代码混淆所用工具源码分析
打包所用工具所在的jar包
3、apk打包流程详解
依据如上的流程图和工具图,下面我们按照流程顺序对其进行讲解。
一、aapt打包资源
Android的资源文件包含了两类:1)assets类资源。该类资源放在工程目录的assets根目录下,存放一些原始文件,这些文件不会被编译为二进制文件,而是被原封不动地打包在apk文件中,一样也不能经过资源ID来查找,不保存在R文件中。2)res类资源,10种目录。这类资源保存在工程目录中的res目录下,包含了animator(属性动画资源)、anim(补间动画资源)、color(对象颜色状态选择资源)、drawable(xml或Bitmap文件的图像资源)、layout(布局文件资源)、menu(程序菜单资源)、mipmap(图标资源,推荐阅读:drawable与mipmap的区别)、raw(不被编译成二进制文件的资源,注意和assets资源的区别,推荐阅读:assets和raw的区别)、values(6种不一样的值:数组arrays.xml、颜色值colors.xml、尺寸dimens.xml、字符串strings.xml和样式值styles.xml)、xml(描述应用程序配置信息的资源)。
以下截图展现了R.java的内容,其中包含了各类静态内部类,分别对应了某种资源的类型。
R.java结构图
以R.string类为例,其中展现了字符串名称对应的id值,就是对应在res/values文件夹下,string字符串资源。
R.string结构图
推荐阅读:apk打包安装过程
二、aidl生成跨进程通讯的java文件
工程项目中的aidl原始文件
aidl工具处理后生成的java文件
三、Java编译源码
BuildConfig.java和R.java文件
输出的class文件
四、proguard代码混淆
完成javac编译以后,通常还会对其进行代码的混淆,其实就是相似于加密的功能,做用就是增长反编译的难度,同时也将一些代码的命名进行了缩短,减小代码占用的空间。推荐阅读:Android代码混淆零基础入门。
五、将全部.class文件转化为classes.dex文件
调用dx.bat将全部的class文件转化为classes.dex文件,将二进制码转化为Android虚拟机(Android4.4之前虚拟机是Dalvik,4.4上是Dalvik和ART能够切换、Android5.0及之后是ART)上的字节码、生成常量池、消除冗余数据等。因为Android虚拟机是一种针对嵌入式设备而特殊设计的java虚拟机,全部dex文件与标准的class文件在结构设计上有着很大的区别,当javac将java程序编译成class后,dx工具将全部的class文件整合到一个dex文件中,这样作使得各个类可以共享数据,在必定程度上下降了容易,同时也使文结构更加紧凑,实验代表,dex文件时传统jar文件的50%左右。class文件结构和dex文件结构比对以下(该部分还会在后文讲Android虚拟机时提到):
.class文件和.dex文件结构对比图
六、apkbuilder打包生成apk
七、对apk进行签名
签名是一个apk身份的证实,Android系统在安装apk的时候,首先会检验apk的签名,若是发现签名文件不存在或者校验签名失败,就会拒绝安装。对一个apk文件签名后,apk文件根目录下回增长META-INF目录,该目录下有三个文件:
META-IINF文件夹结构
Android系统就是根据这三个文件的内容对apk文件进行签名验证的:
MANIFEST.MF中包含对apk中除了/META-INF文件夹外全部文件的签名值。
MANIFEST.MF内容截图
CERT.SF是对MANIFEST.MF文件总体签名以及其中各个条目的签名。通常地,若是是使用工具签名,还多包括一项,就是对MANIFEST.MF头部信息签名。
CERT.SF内容截图
CERT.RSA包含用私钥对CERT.SF的签名以及包含公钥信息的数字证书。用通常的文本打开后,会显示乱码。
CETR.RSA内容截图
推荐阅读:Android签名有什么用?
八、zipalign优化
若是是在release mode下,还会对apk进行align,即对签名后的apk进行对齐处理,这种方式是对apk进行整理和优化。
4、APK文件结构
一个apk解压后,其典型的结构以下所示,分别在apk打包流程中appt资源打包、javac编译、签名阶段所产生: