Android调试技巧

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值