【性能优化】安卓性能优化之CPU优化

CPU优化及常用工具

原理与文章参考
常用ADB
含义 命令 备注
查看CPU状态 adb shell top -H -d 1 -p pid -O cpu -O cpu 查看对应在那个核心 ;修改采样间隔为1s
导出当前进程所有线程状态到tombstoned adb shell run-as kill -3 实际上是以一个异常状态导出了,利用了墓碑机制
查看进程的所有线程 adb shell "ps -T grep pid"
查看进程占用cpu情况 adb shell dumpsys cpuinfo grep [进程名]
查看进程内线程占用cpu的情况 adb shell top -n 1 -d 0.5 grep proc_ id
获取设备cpu信息 adb shell cat /proc/cpuinfo 或者查看 /sys/devices/system/cpu 目录下的文件夹
常用原理、监控手段
原理
  1. 普通手机默认60帧刷新率,相当于每帧16.6ms
  2. 利用系统预留接口 对每个帧率/handler消息等 进行统计
监控手段
  1. 设置looperPrinter
  2. 字节码插桩检测慢函数(martix dokit)
  3. 编舞者获取frame帧率
  4. jetpack JankStats,获取丢帧信息
多线程并发解决耗时

线程池/数量参考

  1. CPU密集:线程数设置为CPU核心数 + 1
  2. IO密集:线程数设置为CPU核心数 * 2
UI相关
  • 利用<font style="color:rgb(77, 77, 77);">IdelHandler</font>对一些常用view进行预绘制
  • 通过排查布局,减少过度绘制
常见场景
  • 过度绘制
  • 频繁IO
  • 主线程耗时任务
排查CPU占用过高
常用系统/开源分析工具
AndroidStudio Profiler
  • 抓取CPU火焰图,卡顿/ANR 主要监测主线程,是否会出现耗时操作
Systrace
  • 官方指令参考
  • 官方推荐指令 $ python systrace.py -o mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res
  • 要求环境

python2.7 安装
python six 模块,命令 : pip install six
“No module named win32con” 问题,安装相关: pip install pypiwin32

  • 拉取到信息后用perfetto 打开即可 但是这个主要是针对系统的 对应用开发帮助不大,分析自己应用可以用btrace
Btrace
Perfetto

TraceView和 Profile

新版路径:Sdk\tools\monitor.bat

  • Incl Cpu Time:方法在CPU中执行所有时间(包含其调用的方法所消耗的时间)
  • Excl Cpu Time: 方法在CPU中执行的时间(不包含其调用的方法所消耗的时间)
  • Incl Real Time:方法运行消耗的所有时间(包含子方法)
  • Excl Real Time:方法运行消耗的时间(不包含子方法)
  • Calls + Recur Calls/Total :方法调用、递归次数(重要指标,防止死循环)
  • Cpu Time/Call :该方法平均占用 CPU 的时间(重要指标,可以看出单个方法占用CPU的平均时间,但是要防止在个别调用处出现长时间占用,然后被平均了)
  • Real Time/Call :平均执行时间,包括切换、阻塞的时间(重要指标,可以看出单个方法执行的平均时间值,但是要防止在个别调用处出现长时间调用,然后被平均了)
  • TraceView优势

可以精确埋点

Debug.startMethodTracing("sample");
   ...
Debug.stopMethodTracing();

ANR相关

ANR原理及常见场景
  • 原理

ANR(Application Not Responding)的监测原理本质上是消息机制,设定一个delay消息,超时未被移除则触发ANR。具体逻辑处理都在system server端,包括发送超时消息,移除超时消息,处理超时消息以及ANR弹框展示等;对于app而言,触发ANR的条件是主线程阻塞。

  • 常见场景
  1. Service ANR:前台20s,后台200s;startForeground超时10s
  2. Broadcast ANR:前台10s,后台60s
  3. Input ANR:按键或触摸事件在5s内无响应
  4. ContentProvider ANR:10s,少见
ANR/卡顿检测
  • 通过设置Looper的printer可以检测耗时
  • WatchDog机制,子线程发送消息自增,休眠后检查
  • 参考
  • ANR日志导出
// 安卓21以下有权限可以获取到 anr 日志
private FileObserver fileObserver = null;
void initialize(....){
   
			// 实例化FileObserver ,监控路径"/data/anr/",监听文件被写入
			fileObserver = new FileObserver("/data/anr/", CLOSE_WRITE) {
   
            public void onEvent(int event, String path) {
   
                try {
   
                    if (path != null) {
   
                        String filepath = "/data/anr/" + path;
                        // 写入的文件是否有关键字 “trace”
                        if (filepath.contains("trace")) {
   
                        	// 处理anr异常
                            handleAnr(filepath);
                        }
                    }
                } catch (Exception e) {
   
                    XCrash.getLogger().e(Util.TAG, "AnrHandler fileObserver onEvent failed", e);
                }
            }
        };

        try {
   
        	// 启动FileObserver 监控
            fileObserver.startWatching();
        } catch (Exception e) {
   
            fileObserver = null;
            XCrash.getLogger().e(Util.TAG, "AnrHandler fileObserver startWatching failed", e);
        }
}

private void handleAnr(String filepath) {
   
	...
	// 读取anr文件 /data/anr/trace*.txt。返回文件内容
	String trace = getTrace(filepath, anrTime.getTime());
	//删除其他的anr异常日志文件
        if (!FileManager.getInstance().maintainAnr()) {
   
            return;
        }
        //获取  tombstone 的文件头
        String emergency = null;
        try {
   
            emergency = getEmergency(anrTime, trace);
        } catch (Exception e) {
   
            XCrash.getLogger().e(Util.TAG,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值