6.1 手机APK程序编译攻略

我们在媒体和网站经常会看到App和APK。笔者也曾经有些混淆,以为App就是APK,其实不然。“App”是“Application”的缩写,意为应用程序。目前所说的App就是指安装在手机上的软件。当前的主流手机操作系统有Symbian、Linux、Research in Motion、Windows Mobile、iPhone、Android等。

“APK”是“Android Package”的缩写,即Android安装包(apk)。APK是类似Symbian Sis或Sisx的文件格式,将APK文件直接传到Android模拟器或Android手机中运行即可安装。APK文件和SIS文件一样,把Android SDK编译的工程打包成一个安装程序文件,格式为APK。APK文件其实是ZIP格式,但后缀名被修改为“.apk”。通过UnZip解压后,可以看到DEX文件。“DEX”是“DalvikVM Executes”的缩写,即Android Dalvik执行程序,它并非Java ME的字节码,而是Dalvik字节码。Android在运行一个程序时首先需要UnZip,之后的操作类似于Symbian,和Windows Mobile中的PE文件有一些区别。

6.1.1 准备工作

测试环境:Windows Server 2003、Windows 7

软件环境:ApkTool、dex2jar、JD-GUI

1.ApkTool

ApkTool是Google提供的apk编译工具,能够反编译和回编译apk,同时安装反编译系统apk所需要的framework-res框架,清理上次反编译的文件夹等,需要Java的支持。ApkTool可以获取资源文件,提取图片文件和布局文件进行使用查看。ApkTool的最新版本为2.03,下载地址为http://ibotpeaches.github.io/APKTool/install/、https:// bitbucket.org/iBotPeaches/ APKTool/downloads,其常用命令如下。

(1)反编译命令

该命令用于反编译apk文件,一般用法如下。

APKTool d <file.apk> <dir> 

“<file.apk>”表示要反编译的apk文件的路径,这里最好使用绝对路径,如“c:\MusicPlayer.apk”。“<dir>”表示反编译后文件的存储位置,如“C:\MusicPlayer”。

如果给定的<dir>已经存在,那么输入该命令后会给出提示,且命令无法执行。这时需要重新修改命令,加入“-f”指令,示例如下。

APKTool d –f <file.apk> <dir> 

这样就会强行覆盖已经存在的文件。

(2)编译apk

该命令用于编译修改好的文件,一般用法如下。

APKTool b <dir> 

这里的“<dir>”就是反编译时输入的“<dir>”(如“C:\MusicPlayer”)。输入这行命令后,如果一切正常,我们会发现C:\MusicPlayer目录下多了2个文件夹,分别是“build”和“dist”,其中分别存储着编译过程中逐个编译的文件及最终打包的apk文件。

(3)安装命令

install-framework命令用于为ApkTool安装特定的framework-res.apk文件,以便反编译一些与ROM相互依赖的apk文件。

2.dex2jar

dex2jar是一个能操作Android的dalvik(dex)文件格式和Java的class文件的工具集合。dex2jar可以将dex文件转换成Java的class文件,即将apk反编译成Java源码(将classes.dex转化成jar文件)。

dex2jar的下载地址为https://sourceforge.net/projects/dex2jar/,最新版本为dex2jar 2.0。

3.JD-GUI

JD-GUI用于查看APK中classes.dex转化出的jar文件,即源码文件,对代码文件进行查看。官方网站下载地址:https://github.com/java-decompiler/jd-gui/releases。

6.1.2 使用ApkTool反编译apk

下面讲解如何使用ApkTool反编译apk。

01 反编译APK程序文件

将下载的ApkTool安装文件解压,获取aapt.exe、APKTool.bat和APKTool.jar共3个文件,最新版本的APKTool_2.0.3.jar需要将文件重新命名为APKTool.jar,将需要反编译的APK文件放到该目录下,运行“cmd”命令,打开命令行提示窗口,定位到ApkTool的文件夹。输入命令“APKTool.bat d -f 1.0.0.apk test”进行反编译,如图6-1所示,“1.0.0.apk”指的是要反编译的APK文件的全名,“test”为反编译后存储资源文件的目录名称,即“APKTool.bat d -f [apk文件] [输出文件夹]”。在“test”文件夹中会生成apk反编译的各种文件,如图6-2所示。

0235-1

图6-1 使用ApkTool反编译apk

0236-1

图6-2 反编译后生成的文件

02 重新生成apk文件

对apk进行反编译后,可以修改其中的代码,使其符合个人的需求。然后,输入“APKTool.bat b test”命令,重新将其进行编译。编译完成后会在“test”文件下创建“build”和“dist”文件夹,“dist”文件夹中存放着打包后的apk文件,如图6-3和图6-4所示。

0236-2

图6-3 编译apk文件

0236-3

图6-4 重新生成apk文件

6.1.3 使用dex2jar反编译apk

下面讲解如何使用dex2jar反编译apk。

01 重命名并解压apk文件

将需要反编译的APK后缀名改为“.rar”或者“.zip”,解压后即可得到其中的classes.dex文件。classes.dex是Java文件编译再通过dx工具打包而成的,将获取的classes.dex文件放到之前解压的工具dex2jar的文件夹内。在“dex2jar”文件夹下新建一个cmd.bat文件,内容为“cmd.exe”,打开该文件即可进入命令提示行窗口。在其中输入“dex2jar.bat classes.dex”命令进行反编译,如图6-5所示,将classes.dex文件反编译成classes_dex2jar.jar文件。

0237-1

图6-5 使用dex2jar反编译apk文件

02 使用JD-GUI程序查看源代码

使用jd-gui.exe程序打开“dex2jar”目录下生成的classes_dex2jar.jar文件,即可看到源码,效果如图6-6所示。

0237-2

图6-6 查看Java源码

6.1.4 使用smali反编译apk

smali最早的下载地址为http://code.google.com/p/smali/downloads/list,目前Google已将其下架,用户可以到https://github.com/JesusFreke/smali下载,其最新版本为2.0.5。

1.反编译apk程序

首先把baksmali-2.0.5.jar和smali-2.0.5.jar文件放到Android SDK安装路径下的“tools”文件夹里,用WinRAR解压apk,提取classes.dex文件并将其放入“tools”文件夹,然后在命令行界面打开“tools”目录,输入如下Java命令。

java -jar baksmali-2.0.5.jar -o classout/ classes.dex  

使用以上命令的前提是path路径中有Java安装目录下的“bin”文件夹路径,这样才可以在任意路径下使用Java命令,此外要在“classout/”后面加一个空格。把c:\classes.dex文件反编译为smali文件,输出到c:\classout目录下。

2.编译apk

编译apk的命令如下。

java -jar smali-2.0.5.jar c:\classout/ -o c:\classes.dex  

把c:\classout目录下的smali文件编译为c:\classes.dex。