反编译工具下载
http://download.csdn.net/detail/u011109881/8068441
以上图片来自传智播客张泽华视频 我传的资源解压即可 无需安装
1.反编译图片
非常简单 仅需修改apk文件为zip文件 然后解压 就可以得到各种图片了 但会发现其他资源都是乱码
2apktool的使用 反编译布局文件(使用apktool获取 资源文件 xml文件等)
将apk文件移动到apktool工具所在目录,打开cmd命令行,cd到当前目录 执行命令 apktool d 你要反编译的apk文件名
会发现当前目录多了一个文件夹 现在的布局文件不再是乱码
找界面技巧 将刚才生成的的文件夹以Existing Android Code Into Workspace的方式导入 就可在res下layout图形化工具预览界面(有的没有界面)
3.dex2jar的使用:把dex文件转成jar文件
将apk改名为zip文件 取得其中的dex文件 复制到dex2jar工具所在目录 cmd来到dex2jar工具所在目录
执行如下命令
(dex2jar-0.0.9.9版可用 另外一个版本报错)
会发现多了classes_dex2jar.jar,即class所在压缩包 ,若改名为zip 即可查看包结构
4jd-gui.exe的使用 把class文件转化成Java文件
将上一步编译的jar文件放到jd-gui.exe所在目录 拖到jd-gui.exe上打开就可查看代码
Androidfby反编译工具更简单 一步到位 大家看readme.txt中的链接吧 此处不再赘述
--------------------------------------------------------------------------
20170713更新
使用原来的工具反编译时遇到2个问题
问题一
apkTool版本过低
I: Baksmaling...
I: Loading resource table...
Exception in thread "main" brut.androlib.AndrolibException: Could not decode ars
c file
at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.Java:56)
at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibRes
ources.java:491)
at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.jav
a:74)
at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.jav
a:66)
at brut.androlib.Androlib.getResTable(Androlib.java:50)
at brut.androlib.ApkDecoder.getResTable(ApkDecoder.java:189)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:114)
at brut.apktool.Main.cmdDecode(Main.java:146)
at brut.apktool.Main.main(Main.java:77)
Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000
at brut.util.ExtDataInput.skipCheckInt(ExtDataInput.java:48)
at brut.androlib.res.decoder.StringBlock.read(StringBlock.java:44)
at brut.androlib.res.decoder.ARSCDecoder.readPackage(ARSCDecoder.java:10
2)
at brut.androlib.res.decoder.ARSCDecoder.readTable(ARSCDecoder.java:83)
at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:49)
... 8 more
原因 apktool.jar的版本太低,如果使用高版本不会出现异常
解决方案:
1.登陆http://ibotpeaches.github.io/Apktool/ 下载最新版本的apktool.jar
2.找到apk2java\apktool1.4.1下的apktool.jar,移除它,替换为刚下载的apktool.jar
参考资料:http://blog.csdn.net/chengkaizone/article/details/47255493
问题二
java.lang.UnsupportedClassVersionError 版本不一致出错
java.lang.UnsupportedClassVersionError: org/apache/lucene/store/Directory : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Exception in thread "main"
看报错信息,是因为使用的jar包版本不对。这个51.0是什么呢?
JDK不同的版本,编译出的class文件是不同的。通过查看分析class文件前几个字节,可以找到对应的关系,详细的参考官方,细微的版本之间可能有差异:
JDK 1.7 = 51 (0x33 hex),
JDK 1.6 = 50 (0x32 hex),
JDK 1.5 = 49 (0x31 hex),
JDK 1.4 = 48 (0x30 hex),
JDK 1.3 = 47 (0x2F hex),
JDK 1.2 = 46 (0x2E hex),
JDK 1.1 = 45 (0x2D hex).
解决方案:
缺啥下啥:下载对应的JDK(注意32位和64位),装完JDK,这个错误就没有了,也不需要配置环境变量
参考资料
http://www.cnblogs.com/xing901022/p/4172410.html
20170713更新完
--------------------------------------------------