HelloWorld.apk的文件结构

0.什么是apk? apk是AndroidPackage的缩写,即Android应用安装包(apk)。

新建一个安卓工程HelloWorld(本文采用的SDK版本为android 4.4),该工程的源代码结构如图1所示:

图1 HelloWorld源代码的结构

编译运行该工程,我们会在HelloWorld文件夹的bin目录下面得到一个HelloWrold.apk,这个就是我们所要的apk文件。

1. apk是怎样练成的

我们在进行安卓应用开发的时候,只需要右击项目 -> Run as -> 1Android Application就可以生成一个apk。看起来这一切都非常简单,但是实际上生成apk的过程是比较复杂的。对于安卓应用开发者来说,我们不需要在意apk的生成过程,但是对于逆向人员来说,了解apk的编译和生成过程是很有必要的,因为这样能够帮助我们更好地了解apk的体系架构。一个apk的生成需要经历几个步骤,中间需要用到很多工具,具体流程如图2所示:

图2 apk的编译和生成过程(图片来源:Android工程的编译过程)

2.一个apk的文件结构

apk文件实质上是一个.zip格式的压缩包,所以我们可以将HelloWorld.apk修改为HelloWorld.zip。然后用WinRAR或者其他压缩软件打开HelloWorld.zip,我们会看到以下文件结构,如图3所示:

图3 HelloWorld.apk的文件结构

将HelloWorld.zip解压后,我们会得到5个文件(文件夹),如图4所示:

图4 HelloWorld.zip解压缩后得到的文件

下面,我们分别来看一下这5个文件(文件夹)的内容。

2.1 AndroidManifest.xml

这里的AndroidManifest.xml就是源代码中的AndroidManifest.xml编译后所得到的文件。AndroidManifest.xml是安卓应用程序的全局配置文件,该文件保存了apk的包名,版本信息,sdk版本,Activity ,Service, Boardcast Receiver, Content Provider等应用组件的配置信息。还有程序所需要的权限也是在AndroidManifest.xml这个文件中声明的。关于AndroidManifest.xml的详细信息,请参考这篇文章:AndroidManifest.xml配置文件详解

2.2 classes.dex

虽然Android开发的源语言是java,但是Android应用程序却不在标准的java虚拟机上运行。Google为Android平台专门设计了一套用于运行Android程序的虚拟机,这就是Dalvik虚拟机(Dalvik Virtual Machine)。而classes.dex就是运行在Dalvik虚拟机上的可执行文件。从图2中可以看出,我们编写的java源代码经过java编译器编译后会生成.class文件;而Android SDK自带的dx工具(dx.bat在\sdk安装目录\sdk\build-tools\android-4.4这条路径下,dx.jar在\sdk安装目录\sdk\build-tools\android-4.4\lib这条路径下)会将这些.class文件转换为classes.dex。值得一提的是,在Android5.0中,Dalvik虚拟机已经被ART虚拟机(Android Runtime)所取代。有兴趣的童靴可以看这篇文章: Android ART运行时无缝替换Dalvik虚拟机的过程分析。

虽然在Android5.0中ART虚拟机已经取代了Dalvik虚拟机,,但是使用Android5.0 SDK生成的apk与低版本SDK生成的apk相比,二者的文件结构变化不大。采用Android5.0 SDK生成的apk中也有classes.dex这个文件。

2.3 resources.arsc

2.4 res文件夹

apk中的res文件夹由drawable文件夹,layout文件夹,menu文件夹这3个子文件夹组成。其中,drawable文件夹用于存放apk的图片资源,layout文件夹用于存放布局文件,menu文件夹用于存放菜单文件。与原工程项目中的res文件夹相比,apk中的res文件夹少了values这个文件夹。(至于为什么少了values这个文件夹,我也不知道,还请路过的大牛指点一下)

2.5 META-INF文件夹

META-INF文件夹存放着apk的签名信息。如果你还不了解安卓签名机制,请看这篇文章:[014] Android应用程序签名详解 打开META-INF文件夹,可以看到3个文件:CERT.RSA,CERT.SF,MANIFEST.MF。其中CERT.RSA包含了公钥信息和发布机构信息;MANIFEST.MF中保存了除自身以外所有其他文件的SHA-1并进行base64编码后的值(注意:对于xml等文本格式的资源文件,系统先将这些文本文件编译成二进制文件,再获取二进制文件的SHA-1值并进行base64编码);CERT.SF的生成过程分两步:(1)读取MANIFEST.MF文件的SHA-1,然后将该SHA-1值base64编码后保存为SHA1-Digest-Manifest,所以与MANIFEST.MF文件相比,CERT.SF会多出一个SHA1-Digest-Manifest值,(2)然后再逐个读取MANIFEST.MF中每个资源文件的Name和SHA1-Digest值再添加2个空行后进行SHA-1,将该SHA-1值进行base64编码后依次写到CERT.SF中。是否听得迷迷糊糊,下面小弟就用HelloWorld.apk举个栗子,手动模拟MANIFEST.MF文件生成classes.dex的SHA1-Digest的过程: (1)通过HashTab插件(该插件下载地址见文章末尾)可以查看到classes.dex文件的SHA-1,如图5所示:

获致幸福的不二法门是珍视你所拥有的遗忘你所没有的。

HelloWorld.apk的文件结构

相关文章:

你感兴趣的文章:

标签云: