您的位置:首页 > 移动开发 > Android开发

android反编译apk方法以及一些相关问题解决方案

2014-06-20 00:00 609 查看
摘要: 在android开发经常遇到好的APK,却无法学习,反编译可以解决。在网上发现一边很好的反编译贴,与大家共享学习。

反编译方法:
前提:操作系统需配置了jdk
一、找到apk中的class.dex:
把apk文件改名为.zip,然后解压缩其中的class.dex文件,它就是java文件编译再通过dx工具打包成的。
二、得到java源文件
工具准备:
1、把dex文件反编译为jar文件的工具。(dex2jar) http://code.google.com/p/dex2jar/downloads/list 2、把jar反编译为java的工具。(JD-GUI) http://java.decompiler.free.fr/?q=jdgui 反编译步骤:
1.在cmd下进入dex2jar.bat所在路径,然后输入“dex2jar.bat XXX”,XXX指的是你要反编译的apk中的classes.dex文件所在路径及名称,比如:我的dex2jar.bat在D:\Android\apk_decode\dex2jar-0.0.7-SNAPSHOT路径下, classes.dex在D:\Android下,所以: 你进入dex2jar.bat路径下后,输入dex2jar.bat D:\Android\classes.dex,这样会生成一个jar文件。
2.用rar解压出jar文件中的class文件,然后用jad或DJ Java Decompiler反编译工具将.class文件反编译成.java文件
3、运行JD-GUI工具(它是绿色无须安装的),打开上面的jar文件,在File下有个Save JAR Source,它可以生成src源代码。
三、上面操作只能得到class文件,下面利用Google提供的apktool得到xml文件
1. 下载apktool,可以去Google的官方下载,地址:http://code.google.com/p/android-apktool/得,apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip两个包都要下。解压apktool-install-windows.zip到任意文件夹,然后解压apktool-1.0.0.tar.bz2得到apktool.jar,放到apktool-install-windows解压后的目录下。
2. Win+R 运行CMD,用cd命令转到apktool-install-windows所在文件夹,输入apktool看看。会列出一些帮助的话就成功了(解释d为加压 第一个路径为你的apk所在的位置。第二个是要输出的位置)
apktool d e:\a.apk(apk路径)ABC(文件夹名称)
这时当前目录下生成 ABC文件夹,里面就是反编译出的东西了

常见问题:

一,找不到R文件时:
一般放在res\values\public.xml里
比如,反编译的类里setContentView(2130903174); 2130903174是十进制的,转化成十六进制就能够在public.xml中找到文件名了。
个人推荐使用:WIN7中点击“开始”--”程序“--“附件”--“计算器”,按 “查看”再选“程序员”,就可以方便的进行各进制的转换了(如:你要转换10进制90000000为16进制,点“十进制”,输入90000000,再点一下“16进制”,就会看到55D4A80,转换就完成了。其他同理)。

二,连接不上ADB时:
报错信息:
ADB server didn't ACK * failed to start daemon *
ADB server didn't ACK
* failed to start daemon *
在cmd中进入adb的路径,输入命令:adb kill-server,执行完毕后再输入命令adb start-server,重启eclipse即可
--------------------------------------------------------------------------
上述方法无效时:
当输入adb start-server不能够重启adb时,反而抛出如下信息:
adb server is out of date.
ADB server didn't ACK
* failed to start daemon *
出现这种问题的原因有可能是adb需要的端口被占用。
在cmd中查看adb需要的端口,输入命令:adb nodaemon server,显示结果:can't bind "tcp:5037"
下面就找找5037端口是被哪个进程占用了,输入命令:netstat -ano | findstr "5037",显示结果:
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 5892
TCP 127.0.0.1:5037 127.0.0.1:1218 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:1220 TIME_WAIT 0
所以需要关闭PID为5892的进程。命令tasklist可以查看所有的进程,找到关闭即可。
另外,根据以上方法发占用5892端口的任务是db_adb.exe,这个是金山毒霸连接手机杀毒的任务,在任务管理器中没有办法关闭,在右下角的任务列表中右键单击金山毒霸的图标,关闭手机链接,就能够kill这个任务了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: