【Android】APK的打包流程

APK打包流程

apk其实就是一个压缩包,里面有lib,META-INF,classes.dex,res,resources.arsc等文件,我们对一个apk文件进行解压,可以发现里面其实有许多文件:

每个文件对应的描述如下:

  • res文件夹:包含了工程中res目录下除values以外的所有内容,一般包括各种layout文件,drawable。其中,layout文件内容是以二进制xml的方式进行保存的而所有的drawable图像资源都是未经压缩过的原始文件
  • classes.dex文件:Android系统Dalvik虚拟机执行的classes.dex文件,在apk文件中,classes.dex文件可能会有多个。
  • resources.arsc:是所有的资源id的数据集合,记录了所有的应用程序资源目录的信息,该文件同样是二进制格式的文件。
  • lib:工程中包含的.jar文件。
  • META-INF:app签名文件,存放签名证书
  • AndroidManifest.xml:合并后的最终的AndroidManifest.xml文件
  • assets:混合开发中一般html5和javascript以及相关资源可以存放在Assets文件夹内

来看一张官方给出的apk的打包流程图:

对图中的编译打包流程进行一个总结:

1、打包资源文件,生成R.java文件

打包资源的工具:aapt,The Android Asset Packaing Tool

生成文件:R.javaresource.arsc

在这个过程中,项目中的AndroidManifest.xml、XML布局文件、res文件夹里的资源文件、assets文件夹里的文件都会被打包,然后生成相应的R.java文件。

res和assets文件夹里的文件会原封不动的打包进apk(生成resources.arsc),而AndroidManifest、布局文件等xml文件会被aapt编译成二进制文件。

2、处理aidl文件,生成相应的java文件

处理aidl的工具:aidl,Android Interface Definition Language

生成文件:.java文件

aidl工具解析接口定义文件然后生成相应的Java代码接口供程序调用。如果在项目没有使用到aidl文件,则可以跳过这一步。

3、编译项目源代码,生成class文件

编译java代码的工具:java编译器(javac)

生成文件:.class文件

将项目src目录下的所有源码文件、项目中的库文件(.jar文件)、以及上两个步骤中生成的R.java文件和.java文件一起编译成.class文件。

4、转换所有的class文件(包括第三方的class文件),生成classes.dex文件

工具:dx工具

生成文件:.dex文件

所有.class文件都会被转化成可供Android系统Dalvik虚拟机执行的classes.dex文件。

5、将已编译的资源文件以及其他资源文件以及dex文件,一起打包生成APK文件

工具:apkbuilder

生成文件:未签名的.apk文件

所有没有编译的资源,如res、assets目录下的资源(该类文件是一些原始文件,APP打包时并不会对其进行编译,而是直接打包到APP中,对于这一类资源文件的访问,应用层代码需要通过文件名对其进行访问);编译过的资源和.dex文件都会被apkbuilder工具打包到最终的.apk文件中。

6、对APK文件进行签名,得到签名后的apk文件

工具:Jarsigner

生成文件:签名后的apk文件

一旦APK文件生成,它必须被签名才能被安装在设备上。在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试,在Eclipse或者Android Studio中直接run以后跑在手机上的就是使用的debug.keystore,另一种就是用于发布正式版本的keystore。

7、对签名后的APK文件进行对齐处理

工具:zipalign

生成文件:对齐后的apk文件

如果发布的apk是正式版的话,就必须对APK进行对齐处理,对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用就是减少运行时内存的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一场雪ycx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值