【调试】记录调试的工具和方法

本文介绍了多种Android调试工具的使用,包括Log.getStartTraceString查看方法调用栈,Looper.dump获取内部信息,systrace进行性能分析,traceview检测代码性能,ddms提供全面调试支持,DeviceFileExplore查看设备文件,adb进行设备管理,XRef查看类引用,Choreographer.postFrameCallback监控帧率,以及Looper.getMainLooper().setMessageLogging检查消息处理。这些工具能帮助开发者深入理解应用运行状态,定位并优化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Log.getStartTraceString

这是平常用来看方法调用栈的,例如说我要看onDraw过程中涉及了哪些方法的调用(主要看Framework层的方法),就可以在onDraw里面打个Log,具体可以看Log.getStartTraceString


2、Looper.dump

这是看Looper源码时候发现的,它可以帮助你打印出当前MessageQueue里面的所有信息

        new Handler().sendEmptyMessage(996);
        new Handler().sendEmptyMessageDelayed(965,3000);
        Looper.myLooper().dump(new Printer() {
            @Override
            public void println(String x) {
                LogUtil.d("测试噢噢噢噢",x);
            }
        },"这是dump测试");

在这里插入图片描述

3、systrace

这是个Android SDK自带的一个很强悍的工具,可以帮助你做性能分析
它可以通过DDMS打开也可以通过python打开,但我更习惯DDMS,所以我就只记录这种了:DDMSSDK目录下的tools文件夹里面,双击monitor.bat就可以打开

在这里插入图片描述
在这里插入图片描述

然后检测完了之后会在输出文件夹里面生成一个html,这个html只能通过谷歌浏览器打开,打开后是这样的

在这里插入图片描述

这里有几个比较重要的点:

3.1、线程状态

在这里插入图片描述

上面这一条多色的细横线就是线程状态,总共有灰、蓝、绿、红、橙五种颜色,具体含义谷歌文档里面写得很清楚,这里就不再赘述。看图中的activityResume有一大段灰色的线程状态,这是不正常的,因为我在onResume里面读了一个200MSharedPreference文件,导致getString的时候wait

3.2、帧状态

在这里插入图片描述

每两个F代表着一个渲染帧,因为渲染帧是16.6ms1帧,所以显示为红色黄色都是超过16.6ms的,也就是我们常说的掉帧

3.3、CPU状态

在这里插入图片描述

这个可以看某个时间段CPU在做哪些事情


4、traceview

通过使用Debug.startMethodTracing("App")Debug.stopMethodTracing()包围需要检测的代码块,在检测完代码块后会在手机内生成文件,我们可以通过DeviceFile Explore找到:/sdcard/Android/data/包名/files/XXX.trace(但这东西是真的卡…也可以直接使用profile,但是我华为测试机profile会闪退所以用得也不多)


5、ddms

算是最齐全的调试工具了,但主要用到的是内存情况分配跟踪器网络状况


6、DeviceFile Explore

Android Studio右侧侧边栏上,可以用来看真机的设备文件,平常主要是用来看SharedPreference或者IO写入的文件


7、adb

有了Devicefile explore之后,就比较少用adb shell指令了


8、XRef

平常用来看Android源码的神器,比较重要的路径有:http://androidxref.com/9.0.0_r3/xref/frameworks/base/Android.bp,这里主要列举了所有AIDL的位置,如果要看Android最新的代码,可以通过http://aospxref.com/或者谷歌官网的https://cs.android.com/android/platform/superproject


9、Choreographer.postFrameCallback

Choreographer是一个监听底层VSync信号,然后安排下一帧工作的类。所以我们可以通过Choreographer.getInstance().postFrameCallback去检测绘制所需的时间,从而知道是否掉帧


10、Looper.getMainLooper().setMessageLogging

这是在Looper源码里面的,因为卡顿还有一个原因就是Looper.loop消息处理分发不及时,或许是某条消息的dispatchMessage执行太久导致后续的消息被处理不及时

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值