APK目录
- Assets
支持任意深度的文件,并且不会被转换为资源文件,访问需要通过AssetsManager类
- Lib
存放native库文件,一般用c/c++编写。根据CPU型号分arm,mips,x86。大部分移动设备都是arm架构
- META-INF
签名文件保证apk完整性,保证每一个文件都不会被修改
- Res
res下文件会被映射到R文件中,生成对应资源ID,包含但不限于anim,drawable,layout,values(colors.xml, string.xml, dimens.xml, styles.xml),xml,raw
- AndroidManifest.xml
完整的介绍apk整体,包含名称,四大组件,权限等等
- classes.dex
dx工具可以对多个class文件进行合并,重组,优化,可以达到减小体积,缩短运行时间的目的
- resources.arsc
记录资源ID和资源文件位置对应关系的文件
打包流程
打包资源文件,生成R.java文件
- 工具:
aapt即
Android Asset Packaging Tool
- 目录:
sdk\build-tools\25.0.0\aapt ,作用是生成
R.java文件
在这个过程中,项目中的AndroidManifest.xml文件和布局文件XML都会编译,然后生成相应的R.java,另外AndroidManifest.xml会被aapt编译成二进制。
存放在APP的res目录下的资源,该类资源在APP打包前大多会被编译,变成二进制文件,并会为每个该类文件赋予一个resource id。对于该类资源的访问,应用层代码则是通过resource id进行访问的。Android应用在编译过程中aapt工具会对资源文件进行编译,并生成一个resource.arsc文件,resource.arsc文件相当于一个文件索引表,记录了很多跟资源相关的信息。
处理AIDL文件,生成java文件
- 工具:
aidl即
Android Interface Definition Language
- 目录:
sdk\build-tools\25.0.0\aidl
生成对应的java代码,供程序使用
编译项目源码,生成class文件
- 工具:
Java编译器(javac)
- 生成的文件目录:工程文件目录下
bin/classes项目中所有的
Java代码,包括R.java和.aidl文件,都会变Java编译器(javac)编译成
.class文件
转换class文件为classes.dex文件
- 工具:
dx即
dex
- 目录:
sdk\build-tools\25.0.0\dx生成可供Android系统Dalvik虚拟机执行的
classes.dex文件。任何第三方的libraries和.class文件都会被转换成.dex文件。dx工具的主要工作是将
Java字节码转成
Dalvik字节码、压缩常量池、消除冗余信息等。
打包生成APK
- 工具:
apkbuilder
- 目录:
android-sdk/tools
签名
- debug.keystore
release.keystore
对齐处理
- 工具:zipalign
- 目录:sdk\build-tools\25.0.0\zipalign
APK安装过程
Adroid的应用安装涉及到如下几个目录:
/data/app:存放用户安装的APK的目录,安装时,把APK拷贝于此。
/data/data:应用安装完成后,在/data/data目录下自动生成和APK包名(packagename)一样的文件夹,用于存放应用程序的数据。
/data/dalvik-cache:存放APK的odex文件,便于应用启动时直接执行。
具体安装过程如下:
复制APK安装包到/data/app下,然后校验APK的签名是否正确,检查APK的结构是否正常,进而解压并且校验APK中的dex文件。
确定dex文件没有被损坏后,再把dex优化成odex,使得应用程序启动时间加快。
同时在/data/data目录下建立于APK包名相同的文件夹,如果APK中有lib库,系统会判断这些so库的名字,查看是否以lib开头,是否以.so结尾,再根据CPU的架构解压对应的so库到/data/data/packagename/lib下。