apk打包流程

180 阅读3分钟

APK目录

  1. Assets

支持任意深度的文件,并且不会被转换为资源文件,访问需要通过AssetsManager类

  1. Lib

存放native库文件,一般用c/c++编写。根据CPU型号分arm,mips,x86。大部分移动设备都是arm架构

  1. META-INF

签名文件保证apk完整性,保证每一个文件都不会被修改

  1. Res

res下文件会被映射到R文件中,生成对应资源ID,包含但不限于anim,drawable,layout,values(colors.xml, string.xml, dimens.xml, styles.xml),xml,raw

  1. AndroidManifest.xml

完整的介绍apk整体,包含名称,四大组件,权限等等

  1. classes.dex

dx工具可以对多个class文件进行合并,重组,优化,可以达到减小体积,缩短运行时间的目的

  1. 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下。

参考:blog.csdn.net/aha_jasper/…