来源:IT之家作者:文轩
应用程序是安卓系统重要的组成部分,我们可以通过很多方式在安卓系统上安装应用程序,就像Windows系统的appx和塞班系统的sis一样,安卓系统的应用程序也有其专属的安装包格式——apk。
apk的全称是AndroidPackage,翻译成中文就是"安卓安装包"。既然apk是"包",那就说明里面包着很多东西,这就让我很好奇了,里面到底有些什么啊?
apk其实就是一个压缩文件,把它的文件扩展名改成zip格式之后可以直接解压,今天,IT之家就拆开一个安卓应用的安装包,带大家看看里面到底都有些什么。
我们今天开刀的小白鼠是微软最近上架的待办事项应用——Microsoft To-Do。
▲因为apk是个压缩文件,所以直接把它的扩展名改为zip即可。
将安装包解压后,我们可以看到里面的一些文件夹和文件:
应用程序所有的代码、资源和配置文件都在里面,我们来一个一个看。
一、/assets
通常这个文件夹里存放的是一些静态文件,比如说明文档或者字体文件,我们以Microsoft To-Do的安装包为例,它的/assets目录下有个名为fonts的子目录,打开它,我们可以看到三个ttf格式的字体文件。
当然了,不同类型应用的安装包,它/assets里面包含的资源也是不同的,比如有些浏览器应用的/assets目录下有很多html格式的文件,这些文件用旗鱼浏览器可以直接打开:
二、/META-INF
通常这个文件夹里存放的是安装包的签名证书和安装包中所有文件哈希值的计算结果。
应用程序的安装包在打包的时候,每个文件都会经过校验计算,计算结果就存放在/META-INF里,
我们可以直接使用文本编辑器来打开后缀名为MF和SF的记录这些文件校验计算结果的文件:
在我们安装一个应用的时候,系统会首先根据/META-INF里的文件校验结果来核实安装包中文件的正确性和完整性,目的是确保安全,避免用户安装到遭受过病毒感染的或者被恶意篡改过的应用程序。
这个文件夹下的RSA格式的文件是开发者对该应用程序进行签名的签名证书文件,玩过塞班系统的同学应该对这个词并不陌生,这也是为了保证应用程序和系统的安全,签名文件不是纯文本格式,不过当我们用文本编辑器打开它时,可以在乱码中零散地看到Microsoft Corporation字样。
三、/res
res是resource的缩写,里面存放的是应用程序的资源文件,比如图片素材和布局文件,这个文件夹下有很多子目录,
其中,以anim开头的文件夹,通常里面存放的是应用程序的动画效果资源;
以color开头的文件夹,通常里面存放的是应用程序的各种颜色值;
以drawable开头的文件夹,通常里面存放的是应用程序的图片或图形资源;
有些以drawable开头的文件夹在结尾会跟着诸如hdpi、xhdpi这样表示解析度的字符,目的是适配不同分辨率的屏幕。
我们来进入一个以drawable开头的文件夹,可以看到里面有png和webp格式的图片,其中,webp格式的图片可以用旗鱼浏览器打开:
以layout开头的文件夹,通常里面存放的是应用程序的界面布局文件;
以mipmap开头的文件夹,Microsoft To-Do在里面存放了应用图标。
四、/AndroidManifest.xml
AndroidManifest.xml是一个单独的文件,里面包含很多信息,比如应用程序的包名、数据权限、接口权限、版本信息、安装参数等等,另外,它还可以声明应用程序的每一个组件及其属性,声明应用程序所申请的权限、进程,声明显示模式等等,AndroidMainfest.xml里面包含的信息太多了,单独为它开一篇文章都不为过。这是一个非常重要的文件,它的名称是固定的,不能随意修改。
五、/classes.dex
这是可在安卓的Dalvik虚拟机中直接运行的字节码,是由JAVA的源代码经过复杂的编译形成的,和传统的.class文件相比,dex文件的运行效率更高。
六、/lib
虽然Microsoft To-Do的安装包中不包含这个文件夹,不过它在其他安卓应用程序安装包中的出镜率还是挺高的,通常这个文件夹中会存放一些应用程序依赖的库,一般以.so结尾。
有人可能会问了,你带我们把apk拆开了,可是里面的东西有好多都看不了啊,打开以后是乱码,有什么用啊?不要着急,请接着往下看。
七、安卓应用的反编译
是的,安卓应用安装包里的很多文件中的内容我们是不能直接看到的,比如Microsoft To-Do应用,它里面的xml文件和dex文件用文本编辑器打开以后显示的是乱码,如果你想愉快地看到这些文件的真身,那就需要对它的安装包进行反编译。
要对安卓应用进行反编译,我们需要做一下准备:
环境准备:
安装JAVA:官网地址
如何判断你的JAVA是否安装成功了呢?很简单,打开命令提示符,输入命令:
java
回车,如果显示如下:
那就说明JAVA安装成功了。
工具准备:
apktool:下载地址
dex2jar:下载地址
jd-gui:下载地址
在开始之前我们先来说说这三个工具是干啥的。
apktool的作用是把apk中那些直接打开之后显示为乱码的xml文件翻译成明文;
dex2jar的作用是将classes.dex转化为.jar文件;
jd-gui的作用是查看.jar文件中的源代码。
我们开始吧。
首先,我们新建一个文件夹(任何位置都可以,小编把文件夹建在了桌面上),然后把我们下载好的三个工具扔进去;
解压那两个zip格式的压缩包到当前文件夹;
接着把你要处理的apk文件扔到这个文件夹中的某个地方,小编的做法是在这个文件夹里再建了一个名为apk的文件夹,把apk文件扔到了apk文件夹里:
准备工作至此完成,我们开始翻译xml。
打开命令提示符,cd进你刚刚新建的存放着那三个工具的目录,以小编的电脑为例,则是输入命令:
cd C:\Users\Lenovo\Desktop\apktools
接着,输入命令:
java -jar apktool_2.0.1.jar d -f [apk文件所在位置.apk] -o MMTS
然后回车。
以小编的为例,则是输入:
java -jar apktool_2.0.1.jar d -f C:\Users\Lenovo\Desktop\apktools\apk\todo.apk -o MMTS
如果一切顺利的话,将显示如下:
这时,你来到你那三个工具所在的文件夹,你会看到里面新增了一个文件夹,名为MMTS,打开它,你就会看到你想要的东西:
我们来尝试打开一个xml文件:
很好,这次终于不是乱码了。
接着我们来反编译应用程序的java源代码。
我们来到存放那三个工具的文件夹,打开里面的dex2jar-2.0文件夹,把apk包中的classes.dex扔进去。
打开命令提示符,cd进dex2jar-2.0所在目录;
输入命令:
d2j-dex2jar classes.dex
回车。
如果一切顺利的话,将显示如下:
这时,我们回到dex2jar-2.0文件夹,可以看到一个新生成的名为classes-dex2jar.jar的文件,这就是我们需要的文件。
我们来到存放那三个工具的文件夹,打开里面的jd-gui-windows-1.4.0文件夹,双击jd-gui.exe来运行jd-gui。
依次点击File-Open file,选择我们刚刚得到的classes-dex2jar.jar,打开它,你就能看到应用程序的JAVA源代码了。
需要注意的是,有些应用,它的class是被混淆过的(比如Microsoft To-Do,如下图):
里面的类文件名称和方法名称都采取了a、b、c…这样的命名方式。
这样做为了防止反编译,不过就算这样,我们通过反编译得到的源代码也不是不能看。
好的,今天我们分析了安卓应用程序安装包的结构和里面的文件和文件夹的作用,甚至还通过反编译看到了源代码,如果你是安卓应用开发的初学者,想拆开一个apk安装包来研究和参考,那么希望这篇文章可以对你有所帮助。