1、定位activity
有时候看到页面但是不知道页面相关的代码在哪,可以用下面两种方法快速定位
1、layout inspector
Layout inspector中会已窗口的形式展示当前的activity
2、adb 可以通过adb打印当前显示的activity也有两种方式 1、 adb -d shell dumpsys activity activities | grep mResumedActivity 打印的log如下:
hanking@C02CP0QNMD6V Noted-Android % adb -d shell dumpsys activity activities | grep mResumedActivity
mResumedActivity: ActivityRecord{6938a87 u0 com.noted.noted/.view.activity.NoteAddActivity t6513}
2、adb shell dumpsys activity top | grep ACTIVITY
打印的log如下:
hanking@C02CP0QNMD6V Noted-Android % adb shell dumpsys activity top | grep ACTIVITY
ACTIVITY com.huawei.android.launcher/.unihome.UniHomeLauncher 6903383 pid=2496
ACTIVITY com.noted.noted/.view.activity.NoteAddActivity 6938a87 pid=4180
2、定位view
1、view可以点击
找到Android 中系统的View这个类,并且在这个类的接口OnclickListener中抽象方法onClick加一个断点 加完断点后,点击view,会自动定位到当前view的点击方法中
2、view无法点击
找到View这个类,并且在这onTouchEvent()方法前面加断点调试的时候会自动定位到当前触摸的view的onTouchEvent中
3、输出方法的调用栈
在该方法中加如下log
Log.d(TAG, Log.getStackTraceString(new Throwable()));
打印如下:
2021-01-12 18:01:32.438 7902-7902/com.noted.noted D/MainActivity: java.lang.Throwable
at com.noted.noted.MainActivity.onCreate(MainActivity.kt:88)
at android.app.Activity.performCreate(Activity.java:8085)
at android.app.Activity.performCreate(Activity.java:8073)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3870)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8349)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
4、查看h5页面的链接
有时候要去看h5打开的页面链接是什么,这个时候去加log或者debug比较麻烦可以通过chrome来直接查看在浏览器中输入chrome://inspect/ 就可以检测当前页面:
5、Debug高级技巧
1、崩溃后日志被覆盖 先看下Android studio中的日志面板
有时候崩溃了,日志很快被覆盖掉,可以通过这个restart按钮来重新打印日志。
2、debug打印log 有时候想临时打印日志,如果添加log就要改代码然后重新运行比较麻烦,这个时候通过debug也可以打印出log,
这里是在普通的断点上面修改去掉suspend,然后加上evalute and log,log里面可以添加需要的内容。 查看log的时候要通过
3、异常断点
有时候会遇到程序崩溃但是又没有打印相关的崩溃日志,或者想要快速点位到崩溃的代码位置,这时候就可以通过异常断点来实现。 异常断点的功能,就是在程序崩溃的时候断点到崩溃的位置。异常断点的设置也很简单
在Android开发中一般勾选java excption breakpoints就可以了,这样在程序崩溃的时候就会自动定位到崩溃的代码位置。 如果你项目里面用到了dart也可以勾选上dart exception breakpoints。
4、field值观察点 如果要观察某个field变量值的变化情况,比如哪里赋值,哪里修改值等,可以通过这个断点
这里面可以选择field值初始化,field值获取,field值更改,看自己的需要来确定,默认是选择了field 值更改 5、drop frame 有时候debug太快错过了断点位置,一般这个时候会重新开始去debug,但是有了drop frame之后
就可以通过上图中的标志返回到上一步然后再次进入断点位置。 6、断点分组 debug时候经常会碰到debug进了之前打的断点里面,习惯性打完断点不删除,然后断点越来越多,这个时候就可以用断点分组的功能,可以把断点进行分组,不需要的断点可以整组的删除,很方便。
右键断点然后就可以根据上图来创建新分组或者移动到已有的分组。 6、adb打开开发者选项中的选项
# 此命令可操作布局边界的显示隐藏
adb shell setprop debug.layout "true|false"
# 此命令可操作过度绘制的显示隐藏
adb shell getprop debug.hwui.overdraw "show|false"
# 此命令可操作点按操作反馈的显示隐藏
adb shell content insert --uri content://settings/system --bind name:s:show_touches --bind value:i:'1|0'
# 此命令可操作显示触摸位置的显示隐藏
adb shell content insert --uri content://settings/system --bind name:s:pointer_location --bind value:i:'1|0'
7、adb一键连接Charles代理 平常使用Charles代理时, 通常需要进入WiFi管理页面, 设置代理的服务器IP地址和端口号, 对于不常用的手机型号, 找到WiFi设置页可能都要花上一分钟, 再加上手输IP和端口号的时间, 整个连接体验还是比较差的 其实Android是有设置全局代理的能力的, 通过一个ADB命令即可连接代理, 再通过获取本机IP, 保存设置代理的端口, 便可体验上一键即可连接Charles的快感 具体设置代码如下
# 设置代理
adb shell settings put global http_proxy "$Ip:$Port"
# 清除代理
adb shell settings put global http_proxy :0
adb shell settings delete global http_proxy
adb shell settings delete global global_http_proxy_host
adb shell settings delete global global_http_proxy_port
release包断点调试
其实能否加断点跟apk的构建类型无关,之所以印象中的release都没法断点调试,是因为release构建时没有加上
debugable。
android {
buildTypes {
release {
debuggable true
}
}
}
同时,禁用Proguard的obfuscate功能,保留行号和sourcefile等源码信息。
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
-dontobfuscate
加上之后打出来的release包就能加断点调试了。
参考
1、https://developer.android.com/studio/debug
|