有些时候,我们想知道他人项目中的某个小功能怎么写的。我们需反编译他人的项目,然后仔细研究其代码逻辑,这是逆向工程范畴的东西。
我们先来了解大体思路。
首先,把 layout——>可以看到 layout 文件
其次,把 manifest ——>可以看到 manifest 文件
最后,把 .class 文件——> java 文件
这里介绍三个工具:
apktool-v2.0.0RC2:这个把 layout 和 manifest 文件,反编译成可以看到
dex2jar-0.0.9.8:这个可以把 .class 文件反编译成 java 文件
jd-gui-0.3.3.windows:这个可以把反编译的 java 文件,直接拖进入查看源码
工具如下图:
首先,我们查看一般的apk
解压并打开文件。
如下图,分别打开res 中的 layout 文件
,AndroidManifest.xml 文件
和classes.dex 文件
,发现都是二进制乱码,不能查看源码。
接下来,将介绍反编译的步骤。
layout 文件和 manifest 文件的反编译
步骤一
将app-release.apk
文件,放到apktool-v2.0.0RC2
的根目录下。然后在命令行下,到其根目录中。
步骤二
在其命令行下,编写apktool d app-release.apk
,点击回车键。将反编译 layout
文件和manifest
文件,直到结束。
结束之后,将在apktool-v2.0.0RC2
的根目录下。出现app-release
的文件夹,打开可以看到有layout
文件夹和manifest
文件,将两者打开,可以看到其源码。
至此,layout
文件和manifest
文件反编译成功。
classes.dex 文件的反编译
之前,我们把app-release.apk
解压了,看到里面有一个classes.dex
文件。没错,接下来将把其编译成java
文件。
步骤三
先把classes.dex
文件放到dex2jar-0.0.9.8
的根目录下。我们将在命令行中,使用dex2jar.bat
进行批处理。
步骤四
在命令行中,到dex2jar-0.0.9.8
的根目录下。
步骤五
在命令行中,输入dex2jar classes.dex
,之后看到下图中红色框中的done
出现,则反编译完成。
此时,dex2jar-0.0.9.8
的根目录下,将出现刚才编译好的jar
包:classes_dex2jar.jar
文件。
步骤六
打开jd-gui-0.3.3.windows
目录下的,jd-gui.exe
可执行程序。
步骤七
把刚才编译的classes_dex2jar.jar
文件,直接拖拽进去,就可以看到源码了。
看这个mainactivity
,里面的源码也太清楚了吧。这是因为我们打包时,没加混淆的原因。混淆的目的是为了增加反编译的难度,把里面的变量和代码都给模糊处理了。这样一来,阅读反编译后的源码,难度就大大增加了。
接下来,我们介绍混淆处理。
项目的混淆打包处理
步骤八
将项目的,app
目录下的build.gradle
中的buildTypes
里面的minifyEnabled false
改为minifyEnabled true
。然后进行打包编译。
步骤九
之后,按上面的步骤对其进行反编译操作,发现layout
文件和manifest
文件还是和之前一样,没进行混淆。然而,classes.dex
文件则进行了充分的混淆。如下图:
反编译工具下载
反编译工具下载地址,如下所示:
http://download.youkuaiyun.com/download/jession_ding/10179973