原创文章,转载请注明出处,多谢!
如果cpu频率、调度 和 compiler filter都一一排除了,没问题。那接下来就看是否有具体方法耗时。
一、常用的分析手段:
1.systrace
这里可按systrace中各个阶段来逐段对比分析,当然这里也分冷热启。
冷启动可以拆分如下若干阶段:
deliver input / fork process / bind application / activity start / doFrame / drawFrame / SF invalidate&refresh
热启动就主要考虑绘制和渲染了。
看是否差距集中在一个某个阶段内,如果是特定区域的差异那么就来针对具体方法耗时进行分析。
找到有差异的阶段可以通过加trace,来缩小范围和细化具体方法。
各层加trace的方式:
APP:
Trace.beginSection("");
Trace.endSection();
注:抓systrace的时候需要指定对应的app进程。
系统java层:
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "inflate”);
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
注:前面的tag参数对应的抓systrace的开关选项。
Native:
#define ATRACE_TAG ATRACE_TAG_ALWAYS
#include // for c++
#include // for c
ATRACE_CALL();
or
ATRACE_BEGIN("");
ATRACE_END();
2. TraceView or AS profile cpu
对于app的问题,可以借助traceView 或者 as profile cpu检查 CPU Activity 和函数跟踪来帮助定位耗时方法,不断缩小范围来定位问题。
3. 反编译
对于三方app,没有源码,可以通过oatdump反编译来分析:
adb shell oatdump --oat-file=/data/app/包名/oat/arm64/base.odex > demo.txt
字节码命令说明
二、实战举例:高德地图耗时分析
1.发现问题
在cpu频率、调度 和 compiler filter都一一排除了的前提下,通过systrace来分析具体启动各阶段耗时情况。
Android N:
Android O: