Android Studio 3.0+ 无源码调试debuggable=false apk
一、准备一台支持debug程序的设备(以下任一)
- 把设备root掉
- 修改测试机的 /default.prop 文件的ro.debuggable=1,目测这一步也可能需要root。可以使用这个命令查看你的设备是否支持debug所有app: adb shell “getprop ro.debuggable”,显示1就是可以,显示0就是不可以
- 使用模拟器
- 修改apk的Manifest application 属性 android:debuggable=“true”,可以用apktool
解出Manifest 然后修改,接着重新打包回去。
二、将需要debug的apk导入Android Studio
-
选择Profile or debug APK,然后选中你的想要debug的apk,点“OK”导入(首次打开Android Studio或者“File”-“Close Project” 关闭所有打开的项目就会进入到这个界面)
-
导入apk,之后可以看到大概如下的结构:
-
给你想要debug的代码位置打断点
-
点击“Run”-"Edit Configurations"进去设置debug端口
-
点击“+”-“add Remote”,创建一个新的remote调试
-
配置好名字与调试监听的端口即可
三、使用DDMS连接设备调试
- 点击“Tools”-“Android”-“Android Device Monitor”,打开设备监视器
- 打开之后,正常如下图所示,可以看到你的设备,若是看不到,重启一下你的模拟器或者重新插一下你的手机
- 选中你想要调试的进程,即apk
- 点击Android Studio的debug按钮
- 显示如下就是正常连接到设备了,接下来你就可以跟平时调试一样调试这个apk了
- 看,我们已经看到了debug出来的堆栈数据
四、使用ADB连接设备调试(网上常见的做法,亲测不可用,不知问题点在哪)
- 打开设备中需要调试的apk,在cmd中运行命令 :
adb shell "dumpsys activity top | grep --color=always ACTIVITY"
,就可以看到需要调试apk的包名、主acitivity以及进程号
- 使用命令以debug模式启动apk:
adb shell am start -D -n 包名/主activity名
,然后你的设备可以看到类似以下界面
- 再一次运行第一步的命令,获取新的进程号:
adb shell "dumpsys activity top | grep --color=always ACTIVITY"
或者运行命令:adb shell "ps | grep 包名"
亦可
- 运行命令:
adb forward tcp:debug端口 jdwp:apk进程号
,建立调试通道
- 然后跟DDMS调试一样,点击“Run”–"Debug"即可
【备注】其实,上面那些命令行的操作,现在可以直接在Android Studio中选择即可,后面数字就是进程号
【拓展】
上面第3、4步,也可以直接通过点击Android Studio菜单栏的Run-Attach Debugger To Android Process,来连接要调试的进程
五、相关的命令行
-
显示设备当前的在前台的Activity以及进程号:
adb shell "dumpsys activity top | grep --color=always ACTIVITY"
-
显示指定包名的进程号:
adb shell "ps | grep 包名"
-
ADB建立调试通道:
adb forward tcp:debug端口 jdwp:apk进程号
-
查看与包名相关JDWP命令:
adb shell "ps -t | grep -A 8 包名"
-
查看所有JDWP进程命令:
adb shell "ps -t | grep -B 6 JDWP"
-
显示建立的调试通道:
adb forward --list
-
关闭ADB建立的调试通道:
adb forward --remove-all
-
以调试模式启动指定的应用:
adb shell am start -D -n 包名/主activity名
-
设置指定应用以调试模式启动:
adb shell am set-debug-app -w 包名
其中:
set-debug-app
: 用于设置待 Debug 的App。
-w
: 表示设置为 wait 状态,在进程被启动的时候,等待 Debugger 进行调试。
这样,当我们再次运行 指定的 App 的时候,就会出现上面的 Waiting For Debugger 窗口,一直处于堵塞状态,直到我们使用 Attach debugger to Android Process 的方式将其挂载上。
而这种方式是一次性的,再次运行就会恢复之前的状态。但是就像前面说的,经常需要重复多次的 Debug 才能定位问题并且解决问题,那么多次调试则在所难免,如果每次都需要执行这个命令,明显更麻烦了,有点得不偿失。
其实 set-debug-app 还提供了一个 —persistent 的参数,设置一个需要持续调试的 App。
完整的命令如下:adb shell am set-debug-app -w --persistent 包名
当使用 --persistent
标记之后,这个 App 就会一直被处于调试模式来运行,所以每次启动就会弹出 Waiting For Debugger 的窗口等待我们,哪怕我们卸载重新安装,也不会改变。当然如果我们安装一个 Release 签名的同名 App ,必然不会处于Debug模式。
如果添加--persistent
参数之后,调试完成之后,还需要使用 clear-debug-app
来清理被标记为 debug 的 App。
完整的命令如下:
adb shell am clear-debug-app