Android Studio 3.0+ 无源码调试apk

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

  1. 选择Profile or debug APK,然后选中你的想要debug的apk,点“OK”导入(首次打开Android Studio或者“File”-“Close Project” 关闭所有打开的项目就会进入到这个界面)

  2. 导入apk,之后可以看到大概如下的结构:
    在这里插入图片描述

  3. 给你想要debug的代码位置打断点
    在这里插入图片描述

  4. 点击“Run”-"Edit Configurations"进去设置debug端口
    在这里插入图片描述

  5. 点击“+”-“add Remote”,创建一个新的remote调试
    在这里插入图片描述

  6. 配置好名字与调试监听的端口即可
    在这里插入图片描述

三、使用DDMS连接设备调试

  1. 点击“Tools”-“Android”-“Android Device Monitor”,打开设备监视器
    在这里插入图片描述
  2. 打开之后,正常如下图所示,可以看到你的设备,若是看不到,重启一下你的模拟器或者重新插一下你的手机
    在这里插入图片描述
  3. 选中你想要调试的进程,即apk
    在这里插入图片描述
  4. 点击Android Studio的debug按钮
    在这里插入图片描述
  5. 显示如下就是正常连接到设备了,接下来你就可以跟平时调试一样调试这个apk了
    在这里插入图片描述
  6. 看,我们已经看到了debug出来的堆栈数据
    在这里插入图片描述

四、使用ADB连接设备调试(网上常见的做法,亲测不可用,不知问题点在哪)

  1. 打开设备中需要调试的apk,在cmd中运行命令 :adb shell "dumpsys activity top | grep --color=always ACTIVITY",就可以看到需要调试apk的包名、主acitivity以及进程号
    在这里插入图片描述
  2. 使用命令以debug模式启动apk:adb shell am start -D -n 包名/主activity名,然后你的设备可以看到类似以下界面
    在这里插入图片描述
    在这里插入图片描述
  3. 再一次运行第一步的命令,获取新的进程号:adb shell "dumpsys activity top | grep --color=always ACTIVITY" 或者运行命令: adb shell "ps | grep 包名"亦可
    在这里插入图片描述
    在这里插入图片描述
  4. 运行命令:adb forward tcp:debug端口 jdwp:apk进程号 ,建立调试通道
    在这里插入图片描述
  5. 然后跟DDMS调试一样,点击“Run”–"Debug"即可
    【备注】其实,上面那些命令行的操作,现在可以直接在Android Studio中选择即可,后面数字就是进程号
    在这里插入图片描述
    【拓展】
    上面第3、4步,也可以直接通过点击Android Studio菜单栏的Run-Attach Debugger To Android Process,来连接要调试的进程
    在这里插入图片描述

五、相关的命令行

  1. 显示设备当前的在前台的Activity以及进程号:adb shell "dumpsys activity top | grep --color=always ACTIVITY"
    在这里插入图片描述

  2. 显示指定包名的进程号: adb shell "ps | grep 包名"
    在这里插入图片描述

  3. ADB建立调试通道:adb forward tcp:debug端口 jdwp:apk进程号
    在这里插入图片描述

  4. 查看与包名相关JDWP命令:adb shell "ps -t | grep -A 8 包名"
    在这里插入图片描述

  5. 查看所有JDWP进程命令:adb shell "ps -t | grep -B 6 JDWP"
    在这里插入图片描述

  6. 显示建立的调试通道:adb forward --list
    在这里插入图片描述

  7. 关闭ADB建立的调试通道:adb forward --remove-all

  8. 以调试模式启动指定的应用:adb shell am start -D -n 包名/主activity名
    在这里插入图片描述

  9. 设置指定应用以调试模式启动: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
发布了36 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43278826/article/details/83541600