1 APK反编译
Android应用编译出来的APK文件可以很容易的反编译出Java源码。反编译的过程需要用到两个软件,dex2jar和JD-GUI。dex2jar是将APK中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。这两个软件的下载地址如下:
http://dex2jar.googlecode.com/files/dex-translator-0.0.9.3.zip
http://java.decompiler.free.fr/jd-gui/downloads/jd-gui-0.3.3.windows.zip
首先,将APK文件的后缀名改为zip,解压得到其中的classes.dex文件,即Dalvik Executable格式,它是由dx工具将Java字节码文件(.class)转换成Dalvik虚拟机的可执行文件(.dex)。解压下载的dex-translator-0.0.9.3.zip文件,将APK文件中的classes.dex复制到dex2jar.bat所在的目录。在命令行下定位到dex2jar.bat所在目录,运行命令:
dex2jar.bat classes.dex
接着,解压下载的jd-gui-0.3.3.windows.zip文件,运行jd-gui.exe,打开上面生成的classes_dex2jar.jar文件,就可以看到Java源码了。与反编译之前的源码相比,可以发现其中的差别并不大。
2 代码混淆
Google从Android SDK2.3开始在android-sdk\tools\lib\目录下面添加了一个proguard.cfg文件。ProGuard是一个Java代码混淆工具,通过ProGuard混淆之后的代码,别人即使反编译APK文件,也只会看到一些让人较难读懂的代码,从而起到保护代码的作用。
让proguard.cfg起作用的方法很简单,在eclipse中打开Android项目,在包浏览器中打开project.properties文件,在文件末尾中加上一句“proguard.config=proguard.cfg”就可以了。
3 注意事项
Android的编译环境中已默认集成了ProGuard,但在调试模式下不会启用代码混淆,那是因为混淆后的代码会使得调试变得更加复杂。当使用Keytool工具对Android项目进行数字签名时,才会启用代码混淆。使用ADT的GUI界面可以制作签名文件来给APK签名,在eclipse的包浏览器中,鼠标右键单击项目的根节点,在弹出的菜单中选择“Android Tools”→“Export Signed Application Package…”。
使用ProGuard需要注意,安装的Android SDK目录中不能有空格,也不能有中文字符,否则容易造成如下错误。
如果Android项目的SDK版本低于2.3,那么就把android-sdk\tools\lib\目录下面的proguard.cfg文件拷贝至Android项目的根目录。并且修改android-sdk\tools\proguard\bin下的proguard.bat文件,如果没有对该文件做修改,容易造成如下错误。
用写字板打开proguard.bat文件,把
call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %*
修改为
call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %1 %2 %3 %4 %5 %6 %7 %8 %9
即可避免上述错误。