android 查找资源 原理,Android App打包原理分析

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

你简单的介绍下Android打包原理吧。

哦…..

当被问到这个”无聊至极”的问题的时候,其实我内心是拒绝的。不就先生成.class文件,再通过Android的什么东西生成.dex文件么,再融合无法编译的资源和编译好的资源文件生成.apk么。

那你详细讲一下吧?

你这是搞事情哦!!!

Apk文件结构

不是要说App打包原理么?先别急,先看一下apk文件的结构在来说打包原理,可以理解的更清晰哟~

无图言X,不废话先上图:

红色标注部分的文件和文件夹都是Android爱普基本具备的,剩下的则是一些第三方库或代码生成的。对了,这个图片里的文件是怎么来的,再多嘴一句,其实就是apk文件修改后缀名为zip后,解压得到的,再其实你可以将apk看成一个特殊的压缩包。(Ps:无混淆,无加固,只为了解构建的过程。)

AndroidManifest.xml

这个文件可以意为清单文件或者全局配置文件。里面有很多应用的配置信息,权限、版本号、四大组件的注册也在其中。

assets文件夹

这个文件用于存储需要保持原始文件的资源文件,原始的意思就是打包之前里面东西什么样,打包之后还是那样。一般都是放一些音频,网页,字体等文件。

dex文件

.dex文件是Android系统运行在Dalvik Virtual Machine上的可执行文件,也是Android爱普的核心。项目的Java源码通过javac生成class文件,在通过dx工具生成为classes.dex文件。

lib文件夹

该目录存放着爱普需要的native库文件。比如so库以及底层实现的图片处理、音视频处理、数据库加密的库。该文件夹下常见多一个层次,根据不同的cpu型号划分为x86,ARM,ARM-v7a等。

META-INF文件夹

该目录主要作用就是用于保证APK的完整性和安全性。主要有三个文件:

MANIFEST.MF:保存了整个apk文件中所有文件的文件名+SHA-1后的base64编码值。象征着apk的完整性。

CERT.RSA:保存了公匙和加密方式的信息。

CERT.SF:这个文件与MANIFEST.MF的结构一样,只是其编码会被私匙加密。每次安装时,通过该文件夹中的文件,就可以完成验证的过程。如果apk包被改变了,而篡改者没有私匙生成的CERT.SF,则无法完成校验。

res文件夹

这个就很清楚了,这是资源文件夹。什么anim,drawable,layout,values等等等等~

resource.arsc文件

该文件是所有文件中结构最复杂的。

它记录了资源文件,资源文件位置和资源id的映射关系。并且将所有的string都存放在了string pool中,节省了在查找资源时,字符串处理的开销。

Android打包流程

在了解了 apk 文件的结构后,我们开始分析 Android 的打包流程。

资源

Android 打包流程的第一步,是处理资源文件。

在这个步骤中,起主要作用的是 aapt。

刚刚提及的 AndroidManifest.xml, res 文件夹,resource.arsc 文件的生成都与其有关,简单来说,aapt 解析项目代码中的 AndroidManifest.xml,收集项目中 res 文件夹的资源文件及 xml 文件,对其做压缩以及编译的处理。在此过程中,分配了资源 id 并生成了 R.java 文件 以及 arsc 文件。

代码

上一步得到了 R.java 文件后,将其与项目代码一起编译得到 .class文件,然后打包为 jar 包。这个过程中,还会有混淆代码这一步骤。之后,再通过 dx 工具,将生成的 jar 包与第三方库的 jar 包一起编译为 dex 文件。这个过程中,如果是 5.0 以前的系统且超过了 65535 方法数的限制,需要人为的分 dex,5.0 以后则由 dx 工具包办。

到这一步,实际上 apk 所需要的主要内容已经大致齐全了。只需要把上面生成的 AndroidManifest.xml,classes.dex,res文件夹,resource.arsc 打包进 apk,并且将项目工程中的 assets 以及 lib 目录一并放入,就有了一个未经签名的 Android 安装包了。

签名

接下来还缺简单但是却关键的最后一步,那便是 apk 包的签名,这一步在之前对 META-INF 的介绍中,实际已有提及。只需要按步骤生成 MANIFEST.MF, CERT.RSA,CERT.SF 并放入META-INF 文件夹即可。

以上便是 Android 打包的基本流程,宏观来看实际并不复杂,但是其中的一些步骤展开来讲,却是很有内容的,比如 appt 对资源处理的那个部分,R.java 是如何生成的,resource.arsc 又是如何生成的,Android 是怎样完成对资源的获取的,这些我都不会,哈哈。以后慢慢补吧~

总结aapt(Android Asset Packaging Tool)给你的Activity提供所需的资源文件,如 AndroidManifest.xml,XML文件,并编译它们。同时产生R.java文件,使你可以在java代码中引用这些资源。

aidl工具把.aidl接口转换成Java接口。

你所有的Java代码,包括 R.java和 .aidl文件,由Java编译器和编译输出.class文件。

dex工具把.class文件转换成Dalvik字节文件,第三方的类和.class也被转换成.dex文件

所有无法编译的资源(比如图片),编译好的资源文件和.dex都被送到apkbuilder工具中,生成最后的.apk

生成.apk时必须制定是debug还是release,release还要提供相应的key

如果选择release版本,还需要使用zipalign工具对apk对齐。齐处理即使得所有资源文件距离文件起始偏移为4字节的整数倍,这样通过内存映射访问apk文件时处理速度更快。

你可能感兴趣的:(android,查找资源,原理)