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
,所以我就只记录这种了:DDMS
在SDK目录下的tools文件夹里面,双击monitor.bat
就可以打开
然后检测完了之后会在输出文件夹里面生成一个
html
,这个html
只能通过谷歌浏览器打开,打开后是这样的
这里有几个比较重要的点:
3.1、线程状态
上面这一条多色的细横线就是线程状态,总共有灰、蓝、绿、红、橙五种颜色,具体含义谷歌文档里面写得很清楚,这里就不再赘述。看图中的
activityResume
有一大段灰色的线程状态,这是不正常的,因为我在onResume
里面读了一个200M
的SharedPreference
文件,导致getString
的时候wait
了
3.2、帧状态
每两个
F
代表着一个渲染帧,因为渲染帧是16.6ms
为1
帧,所以显示为红色
或黄色
都是超过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
执行太久导致后续的消息被处理不及时