本文主要是介绍Systrace学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Systrace学习笔记
- 1.Systrace快捷键
- 2.线程状态
- 3.CPU info
- 4.图形化
- 4.1 Frames帧
- 4.2 用户活动
- 4.3 CPU活动
- 4.4 系统事件
- 5. SystemServer
- 5.1 SystemServer简介
- 5.2 窗口动画
- 5.3 AMS(ActivityManagerService)
- 5.4 WMS(WindowMagerService)
- 6.Input
使用Systrace前提:
- Python 2.7.x 环境;
- 安卓SDK : systrace 命令在 Android SDK 工具软件包中提供,并且可以在 android-sdk/platform-tools/systrace/ 中找到(旧版带systrace.py)
- chrome://tracing/ :浏览器打开systrace.html
Systrace 适用于 Android 4.3(API 级别 18)及更高版本的所有平台版本,但建议将 Perfetto 用于运行 Android 10 及更高版本的设备
1.Systrace快捷键
W:放大
S:缩小
A:左移
D:右移
M:高亮
1 :将当前正在使用中的选择模型更改为“选择”模式。
2 :将当前正在使用中的选择模型更改为“平移”模式。
3 :将当前正在使用中的选择模型更改为“缩放”模式。
4 :将当前正在使用中的选择模型更改为“计时”模式。
G :在当前所选任务的开头显示网格。
左键:在当前选定的时间轴上选择上一个事件。
右键:在当前选定的时间轴上选择下一个事件。
2.线程状态
- 绿色 Running:线程正在完成与某个进程相关的工作或正在响应中断
- 蓝色 Runnable:可以运行,等待CPU调度,同一时刻可能有多个线程处于Runnable,这些线程的 task_struct 结构被放入对应 cpu 的Runnable队列中(一个线程最多只能出现在一个 cpu 的可执行队列中)。调度器的任务就是从各个 cpu 的Runnable队列中分别选择一个线程在该cpu 上运行
- 白色 Sleep:线程没有可执行的任务,可能是因为线程在遇到互斥锁定时被阻塞
- 橙色 Uninterruptible Sleep - IO Block:线程在遇到 I/O 操作时被阻止或正在等待磁盘操作完成,IO操作慢
- 紫色 Uninterruptible Sleep:线程在另一内核操作时被阻塞,一般是陷入内核态(内存管理)
3.CPU info
CPU按照核心数和架构分类:
1.非大小核架构:八核/四核/两核同构,频率相同,功耗相同
2.大小核架构:小核主频低功耗低,大核主频高功耗高
八核心:CPU0-3是小核心,CPU4-7是大核心
ohter:4小核心+2大核心;6小核心+2大核心
3. 大中小核架构:大核心1~2个,主频功耗高,用来处理繁重高负载任务
绑核
将任务绑定到一个或一组核心上运行来满足实际需求
负载高-------------------大核心组
任务避免频繁切换----绑定某一个核心
任务要求低-------------绑定小核心组
4.图形化
横坐标是以时间为单位,纵坐标是以进程-线程的方式来划分,同一进程的线程为一组放在一起,可收缩/展开,如下图:
4.1 Frames帧
在每个app进程,都有一个Frames行,正常情况以绿色的圆点表示。当圆点颜色为黄色或者红色时,意味着这一帧超过16.6ms(即发现丢帧),这时需要通过放大这一帧进一步分析问题。
对于Android 5.0(API level 21)或者更高的设备,该问题主要聚焦在UI Thread和Render Thread这两个线程当中。对于更早的版本,则所有工作在UI Thread。
4.2 用户活动
4.3 CPU活动
4.4 系统事件
描绘 SurfaceFlinger 进程(包括 VSync 事件和界面线程交换工作)的其他直方图
5. SystemServer
5.1 SystemServer简介
Android系统在启动的时候有两个重要的进程:Zygote进程 和 由zygote进程fork出来的system_server进程
system_server 进程主要是用于创建系统服务,AMS、WMS、PMS 都是由它创建的。 具体来说,SystemServer 进程被创建后,主要做了以下工作:
- 启动 Binder 线程池,这样就可以与其他进程进行通信;
- 创建 SystemServiceManager,用于对系统服务进行创建、启动和生命周期管理;
- 启动各种系统服务;
5.2 窗口动画
应用启动流程:点击App时,首先Launcher会启动一个StartingWindow,等App中启动页面的第一帧绘制好了,就会马上从Launcher切换回App的窗口动画。
Android 9.0之前App启动动画在SystemServer里
Android 9.0之后App启动动画由Laucher和App自身第一帧组成
5.3 AMS(ActivityManagerService)
5.4 WMS(WindowMagerService)
6.Input
- InputReader 负责从 EventHub 里面把 Input 事件读取出来,然后交给 InputDispatcher 进行事件分发
- InputDispatcher 在拿到 InputReader 获取的事件之后,对事件进行包装和分发 (也就是发给对应的)
- OutboundQueue 里面放的是即将要被派发给对应 AppConnection 的事件
- WaitQueue 里面记录的是已经派发给 AppConnection 但是 App 还在处理没有返回处理成功的事件
- PendingInputEventQueue 里面记录的是 App 需要处理的 Input 事件,这里可以看到已经到了应用进程
- deliverInputEvent 标识 App UI Thread 被 Input 事件唤醒
- InputResponse 标识 Input 事件区域,这里可以看到一个 Input_Down 事件 + 若干个 Input_Move 事件 + 一个 Input_Up 事件的处理阶段都被算到了这里
- App 响应 Input 事件 : 这里是滑动然后松手,也就是我们熟悉的桌面滑动的操作,桌面随着手指的滑动更新画面,松手后触发 Fling 继续滑动,从 Systrace 就可以看到整个事件的流程
这篇关于Systrace学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!