Android探索之Task分析(一)
这个系列文章我们主要分析apk打包的整体流程,从apk的结构入手,逐步剖析打包过程
系列文章目录
Android探索之Task分析(一)
Android探索之Task分析(二)
声明:本篇所有代码源码均参考 android build gradle 3.1.4版本,其他版本请对照分析。
apk结构
首先我们先看下apk的结构是怎么样的,再仔细深入的研究整体流程
首先找到一个apk包,使用zip解压软件解压,或者直接拖放到android studio中。可以看到如下的结构:
apk是一个压缩包,里面有lib,META-INF,classes.dex,res,resources.arsc文件夹和文件。下面看看它们各自的作用。
名称 | 内容 | 详细 |
---|---|---|
lib | 放的是so动态链接库 | apk打包不需要处理的动态库 |
META-INF | 签名文件夹 | 三个签名证书(MANIFEST.MF、CERT.SF、CERT.RSA)。MANIFEST.MF文件是对每个文件的SHA-256-Digest;CERT.SF是对每个文件的头3行进行SHA-256-Digest;CERT.RSA这个文件保存了签名和公钥证书。 |
classes.dex | 执行文件 | java编译后的Android可执行的dex文件,如果有使用multidex则会有多个dex后缀文件 |
AndroidManifest.xml | 声明文件 | 记录应用的名字、版本、权限、引用的库文件等信息 |
res | 资源文件 | 有animator,anim,color,drawable,layout,menu,raw等文件夹 |
resources.arsc | 编译后的二进制资源文件 | 记录了所有的应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息。 这是一个索引文件。 |
打包流程
估计平时很少有人会特殊关注android打包的过程中到底做了什么,只需要在Android Studio中配置一下对应的配置项,然后就能打包即可,大致的简略打包流程,可以看如下的流程:
详细的流程大致如下,祭上谷歌原生的打包流程图:
上面这个图主要是有7个打包流程。
1.打包资源文件,生成R.java文件
aapt来打包res资源文件,生成R.java、resources.arsc和res文件。
- res目录
文件 | 描述 |
---|---|
animator | 放属性动画 |
anim | 放补间动画 |
color | 颜色资源 |
drawable | 存放XML、Bitmap文件,或者.png, .9.png, .jpg, .gif文件等图像资源。打包过程中可能会被优化,比如色彩数可能会被优化,256色变8色。 |
layout | 布局资源,布局的xml文件。 |
menu | 应用程序菜单 |
raw | 直接复制到设备中的任意文件。用参数是资源的ID调用,R.raw.somefilename。和assets 不同的是,raw下面不能有目录,而和assets可以有目录。 |
values | 数值XML文件用来描述数组、颜色、尺寸、字符串和样式值等 |
xml | 应用配置信息 |
- R.java文件
R.java是我们在编写代码的时候会用到的,里面有静态内部类,资源等。
- resources.arsc文件
resources.arsc这个文件记录了所有的应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息。是一个资源索引表,在给定资源ID和设备配置信息的情况下能快速找到资源。
2.处理aidl文件,生成相应的Java文件
aidl(Android Interface Definition Language,Android接口描述语言),位于android-sdk/platform-tools目录下。aidl工具解析接口定义文件然后生成相应的Java代码接口供程序调用。如果项目没用到aidl则跳过这一步。
3.编译项目源代码,生成class文件
Java Compiler阶段。项目中所有的Java代码,包括R.java和.aidl文件,都会变Java编译器(javac)编译成.class文件,生成的class文件位于工程中的bin/classes目录下。
4.转换所有的class文件,生成classes.dex文件
dex阶段。通过dx工具,将.class文件和第三方库中的.class文件处理生成classes.dex文件。该工具位于android-sdk/platform-tools 目录下。dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。
5.打包生成APK文件
apkbuilder阶段。通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk。打包的工具apkbuilder位于 android-sdk/tools目录下。
6.对APK文件进行签名
Jarsigner阶段。通过Jarsigner工具,对上面的apk进行debug或release签名。
7. 对签名后的APK文件进行对齐处理
通过zipalign工具,将签名后的apk进行对齐处理。工具位于android-sdk/tools目录下。对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用就是减少运行时内存的使用。
我又偷了一张图,因为懒
详细task分析我们下一篇解析。