动态调试Smali
安装Smalidea插件
建议下载三个东西,smalidea装入Android Studio以高亮Smali代码,baksmali.jar来反编译dex文件,smali.jar来重新打包
安装Smalidea插件的过程
Preferences -> Plugins -> Install Plugin From Disk
之后重启Android Studio加载插件,现在可以高亮和断点Smali代码了
关于为什么直接用smali.jar和baksmali.jar,而不用apktool,这是因为我看过蒸米大大的一篇文章,apktool其实是对一些工具的封装,而且更新经常滞后,如果反编译遇到错误给出的报错也不如直接用baksmali更详细,更能够帮助定位错误
强制调试
在Android上即使获得了root权限,也不能直接修改ro.debuggable属性,但由于在root时我用了magisk框架,能够通过一条命令很方便的修改
OnePlus7:/ # magisk resetprop ro.debuggable 1
OnePlus7:/ # getprop ro.debuggable
1
OnePlus7:/ #stop;start; #必须通过这种方式重启
这样无论apk是否开启了调试模式,都能够对它进行调试,不需要重新打包了
导入Smali
将apk反编译回smali需要几步:
- unzip xxx.apk
- 找到class.dex文件
- baksmali d class.dex
- 将out文件夹导入到Android Studio即可
开始调试
这个记录是基于Android Studio3.4做的,在这个版本中已经没有DDMS了。其实按照很多教程的做法,只是少做了一步端口转发,我们并不是真的需要这个工具,没有必要去纠结
File -> New -> Import Project
导入后将文件夹右键设置为项目根目录
添加debug配置选项,新增Remote类型的调试,这里端口默认5005即可
接下来启动apk
adb shell am start -D -n com.oneplus.filemanager/com.oneplus.filemanager.HomePageActivity
这里-D参数是打开调试,之后接的是apk包名和MainActivity
此时应用会阻塞,等待调试器连接
接下来要做的是建立调试器与应用的连接,在设置debug配置时我们选择attach 5005端口,要将5005端口和应用进程联系起来
先看一下应用的pid
anakin@Alpha-Cat ~/Documents/ adb shell "ps -ef | grep filemanager"
system 12300 6258 0 23:10:33 ? 00:00:00 com.oneplus.filemanager
shell 12362 936 8 23:10:43 ? 00:00:00 sh -c ps -ef | grep filemanager
shell 12365 12362 10 23:10:43 ? 00:00:00 grep filemanager
使用端口转发命令
adb forward tcp:5005 jdwp:12300
之后使用debug即可
期间遇到的一些问题:
- 之前查资料时试用了
adb shell am set-debug-app -w --persistent
的方式,将应用一直定成debug模式,不建议采用,可能有未知bug。使用adb shell am clear-debug-app
可清除 如果调试之后无法再次进入调试,可以尝试以下步骤:
- 彻底重启Android Studio
- 彻底重启手机(记得重新开ro.debuggable
- adb kill-server; adb start-server
- 换个端口转发