标签:
学习看雪的文章: http://bbs.pediy.com/showthread.php?t=189610,算是学习笔记,整理一下,万一忘记了可以到博客来查一下。
1. 首先使用apktool反编译apk文件
apktool d -d xxxxx.apk (-d一定要加, 否则Eclipse中无法设置断点,也就无法调试了)
2. 在输出的文件夹中,用文本编辑工具打开AndroidManifest.xml 搜索以下关键字
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
找到含有以上信息的activity节点,记录其android:name属性的值,该值则为其应用的主类,并修改为包名.主类, 并且增加可调试属性
android:debuggable=”true”
修改后
3. 在主activity的OnCreate方法中插入调试等待的smali代码
a=0;// invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
4. 使用apktool重新编译APK,签名,安装到手机上运行
我在编译的时间又报错了,使用这个方法就可以解决了: http://www.cnblogs.com/dacainiao/p/5036774.html
手机上运行:
这时你会看到程序运行后停留在白屏界面,这时不要动设备和退出程序,因为程序现在是运行到刚才添加的WAITFORDEBUGGER代码这里,这行代码的意思是一直挂起中,等待调试器。
下面开始设置实时调试的环境:
5. 启动ECLIPSE,构建JAVA项目
1) File -> New -> Project -> Java Project -> Next
2) Project Name随便起,Use default location选项去掉,Location选择刚才反编译的文件夹,然后Next
3) 选中smali文件夹,然后Finish
6. 在ECLIPSE中找到 主activity的OnCreate方法,在WAITFORDEBUGGER后面 添加断点
如果你的ECLIPSE中显示的不是上面的样子(a=0; // ..........),说明你在刚才反编译的时间没有加 -d,是设置不了断点的
7. 打开DDMS,如果在第4步中运行了修改后的程序,在DDMS的设备列表中会显示可以调试的程序(端口: 8614)。(如果xxx被占用,可以先吧Eclipse关闭掉,打开DDMS后再开Eclipse)
8. 现在要做的就是把代码与调试程序关联即可。 回到ECLIPSE,配置远程调试
1) 菜单Run -> Debug -> Debug Configurations
2) 双击Remote Java Application,Host处默认localhost就行,Port填第7步得到的8614,然后Apply -> Debug。
9. 这时ECLIPSE自动切换至DEBUG视图,并看到程序已经运行并中断在下一行可执行的代码了,相关的变量可以直接查看了。
标签:
原文地址:http://www.cnblogs.com/dacainiao/p/5036967.html