Systrace学习笔记
使用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,用于对系统服务进行创建、启动和生命周期管理;
- 启动各种系统服务;
SystemServer进程的核心是SystemServer类,它是Android系统启动后的第一个Java进程。SystemServer类负责启动系统的各种服务,它通过Binder机制提供各种服务接口
SystemServer 由于提供大量的基础服务,所以进程间的通信非常繁忙,且大部分通信都是通过 Binder 。
public final class SystemServer {
private static final String TAG = "SystemServer";
private static final boolean DEBUG_LISTENER = false;
private static final boolean DEBUG_PRIORITY = false;
private static final String ANSI_RED_BACKGROUND = "\u001B[31;40m";
private static final String ANSI_RESET = "\u001B[0m";
...
public static void main(String[] args) {
...
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "InitBeforeStartServices");
SystemServer systemServer = null;
try {
//创建systemServer实例
systemServer = new SystemServer();
//启动系统服务
systemServer.run();
} catch (Throwable ex) {
Log.e("System", "******************************************");
Log.e("System", "************ Failure starting system services", ex