浅谈Android中的反编译

写在前面:

众所周知,Android最终可运行在手机上的是以.apk结尾文件,实际上它是一个文件压缩包,也就是说我们可以解压得到其中的文件,但是解压后只能得到其中的图片资源,而一些其他的资源布局和JAVA源代码是无法看到的。但是有的时候我们需要用到反编译的,比如我们看到一很不错的APP想学习一下其中的代码,这时候就可以需要用到反编译的知识了。

反编译所需要的工具:

1、apktool.rar压缩包:它的作用主要是初步实现反编译,用于获取到一些资源文件,例如布局文件的代码,自定义属性、动画属性等一些XML资源文件。

2、dex2jar.zip压缩包:它的作用主要是获取到源码文件,而此时获取到的源码文件还不能直接查看,因为它是一个jar包。

3、jd-gui.zip压缩包:它的作用主要是查看源码文件,可直接查看到源码文件。它可以打开一个jar包文件,并且查看到其中的源码。

反编译的基本步骤:

>

一、利用apktool.rar获取到XML资源文件的代码

1、首先,解压apktool.rar压缩包,并且打开命令行窗口(Windows+R),输入cmd,然后定位到解压后的文件所在的位置:cd C:\Users\zhongqihong\Desktop\Android反编译\apktool,然后按回车。

2、然后,在C:\Users\zhongqihong\Desktop\Android反编译\apktool>,并且把我们需要反编译以.apk文件结尾的应用程序包,放入到解压后的文件夹apktool中。

Android反编译 查看 theme 安卓反编译分析_jar包

3、接着在定位好的文件命令对话窗口中,输入C:\Users\zhongqihong\Desktop\Android反编译\apktool>apktool.bat d -f weishike.apk

Android反编译 查看 theme 安卓反编译分析_Android_02

4、最后、将会产生一个weishike文件夹,里面就有初步反编译的到的资源文件

5、补充:如果你想将反编译完的文件重新打包成apk,那你可以:输入apktool.bat b weishike(你编译出来文件夹)便可,效果如下:

Android反编译 查看 theme 安卓反编译分析_反编译_03

6、之后在之前的weishike文件下便可以发现多了2个文件夹:

build

dist(里面存放着打包出来的APK文件)

Android反编译 查看 theme 安卓反编译分析_Android反编译 查看 theme_04

二、利用dex2jar.zip获取到java源代码

1、先解压weishike.apk文件,然后可以从中得到一个classes.dex文件,将其拷出,放入到刚解压的dex2jar文件夹中

Android反编译 查看 theme 安卓反编译分析_Android_05

2、然后、并且打开命令行窗口(Windows+R),输入cmd,然后定位到解压后的文件所在的位置:cd C:\Users\zhongqihong\Desktop\Android反编译\dex2jar-0.0.9.15,然后按回车。

Android反编译 查看 theme 安卓反编译分析_反编译_06

4、最后、就会在同目录下产生一个新的jar包,该jar包中就含有我们反编译所需的源代码。

Android反编译 查看 theme 安卓反编译分析_android_07

三、利用jd-gui.zip查看java源代码

1、解压jd-gui-0.3.5.windows.zip,然后双击打开jd-gui.exe

Android反编译 查看 theme 安卓反编译分析_jar包_08

2、并把新产生的jar包,放入jd-gui-0.3.5.windows文件夹中,然后在exe应用程序中打开该jar包就可以查看源码了

Android反编译 查看 theme 安卓反编译分析_android_09

四、android反编译的一般流程图

Android反编译 查看 theme 安卓反编译分析_反编译_10

写在最后

注意,有时候我们知道如何去反编译,所以我们必须懂得如何去防止别人进行反编译:

解决方法:
2.3版本以上在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”可以对代码进行混淆,反编译后是很难看懂的。

2.3之前的SDK版本也没关系,把上面的proguard.cfg文件复制一份放到项目中,然后进行相同的操作即可。
Android - proguard混淆器使用,有引用第三方jar包的时候报错:

You may need to specify additional library jars (using ‘-libraryjars’)


处理方法:在proguard.cfg文件顶部加入

-dontwarn com.motorola.** 
 -keep class com.motorola.* { ;}


说明:-dontwarn和-keep结合参数使用来保持第三方库中的类而不乱,-dontwarn com.motorola.意思是保持com.motorola.这个包里面的所有类和所有方法而不混淆
-keep class com.motorola.* { ;}意思是ProGuard不要警告找不到com.motorola.**这个包里面的类的相关引用。对应包名改成你对应的jar包顶层package