安装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需要几步:

  1. unzip xxx.apk
  2. 找到class.dex文件
  3. baksmali d class.dex
  4. 将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即可

期间遇到的一些问题:

  1. 之前查资料时试用了adb shell am set-debug-app -w --persistent的方式,将应用一直定成debug模式,不建议采用,可能有未知bug。使用adb shell am clear-debug-app可清除
  2. 如果调试之后无法再次进入调试,可以尝试以下步骤:

    • 彻底重启Android Studio
    • 彻底重启手机(记得重新开ro.debuggable
    • adb kill-server; adb start-server
    • 换个端口转发

标签: none

添加新评论