android 应用启动时间统计方法

 

一、代码埋点:

二、TraceCompat

三、使用python命令生成报告

四、adb shell am start -w 包名/类名

五、自定义统计时长


一、代码埋点:

开始收集,传入自定义文件名:Debug.startMethodTracing("app_trace");使用方式(非常耗时)

结束收集:Debug.stopMethodTracing();

默认文件生成:/sdcard/Android/data/com.xxx.xx/files/app_trace.trace

使用Android Studio打开该文件

 

区域1用于选择时间范围,滑动可以选择查看时间范围内线程运行

区域2可以查看到有多少线程和执行时间,点击每个线程区域3可显示每个线程对应的执行方法;

区域3可以查看堆栈信息

Call Chart:查看方法时间段和时间消耗,从上往下依次为调用顺序,系统api一般为橙色,应用自身方法为绿色,第三方api一般是蓝色;

Flame Chart:Call Chart的倒序调用;

 

Top Down:该区域可以看每个方法内部调用了哪些方法,对查看调用堆栈十分滴方便,此处注意几个概念;

Total:方法执行总耗时;Self:方法内部除了调用的子方法总耗时;Children:调用的子方法总耗时;Total = Self + Children

Wall Clock Time:该方法在线程内部执行总耗时;

Thread Time:该方法CPU消耗执总耗时;

Bottom Up:显示一个方法的被调用列表,和Top Down相反;

二、TraceCompat

  • TraceCompat.beginSection(“xxx”);// 手动埋点起始点
  • TraceCompat.endSection();// 手动埋点结束点
  • python systrace.py -b 32768 -t 5 -a packageName -o trace.html sched gfx view wm am app

优势:

  • 轻量级,开销小
  • 直观反映cpu利用率
  • 根据问题给出建议(比如绘制慢或GC频繁)

三、使用python命令生成报告

cd到Android/sdk/platform-tools/systrace

执行python命令,python环境没有配置好的话可使用Home Brew install一下

python systrace.py -b 32768 -t 10 -a 包名 -o browser.html sched gfx view wm am app

具体参数可参考:https://developer.android.google.cn/studio/profile/systrace/command-line

执行命令后,启动应用,待生成报告后打开报告

 

A键左移,D键右移,S键缩小,W键扩大

区域1为CPU区域,可查看系统分配CPU情况,我们优化方向就是尽可能不让CPU空闲率过高;

区域2为应用进程所有线程的方法消耗时间分配,可以方便的查询到耗时过长的方法;

四、adb shell am start -w 包名/类名

 

返回的结果,就是标准的应用程序的启动时间

  • ThisTime:最后一个Activity启动耗时;
  • TotalTime:启动时经历的所有Activity启动耗时;
  • WaiteTime:AMS启动所有Activity的总时间

http://static.open-open.com/lib/uploadImg/20151231/20151231215915_677.png

  • startTime记录的刚准备调用startActivityAndWait()的时间点
  • endTime记录的是startActivityAndWait()函数调用返回的时间点
  • WaitTime = startActivityAndWait()调用耗时。

五、自定义统计时长

import android.os.SystemClock;
import android.os.Trace;
import android.util.ArrayMap;
import android.util.Log;
import android.util.MutableLong;public class TraceHelper {private static final boolean ENABLED = IS_DEBUG_DEVICE;private static final boolean SYSTEM_TRACE = false;private static final ArrayMap sUpTimes = ENABLED ? new ArrayMap<>() : null;public static void beginSection(String sectionName) {if (ENABLED) {MutableLong time = sUpTimes.get(sectionName);if (time == null) {time = new MutableLong(IS_DEBUG_DEVICE ? 0 : -1);sUpTimes.put(sectionName, time);}if (time.value >= 0) {if (SYSTEM_TRACE) {Trace.beginSection(sectionName);}time.value = SystemClock.uptimeMillis();}}}public static void partitionSection(String sectionName, String partition) {if (ENABLED) {MutableLong time = sUpTimes.get(sectionName);if (time != null && time.value >= 0) {if (SYSTEM_TRACE) {Trace.endSection();Trace.beginSection(sectionName);}long now = SystemClock.uptimeMillis();Log.d(sectionName, partition + " : " + (now - time.value));time.value = now;}}}public static void endSection(String sectionName) {if (ENABLED) {endSection(sectionName, "End");}}public static void endSection(String sectionName, String msg) {if (ENABLED) {MutableLong time = sUpTimes.get(sectionName);if (time != null && time.value >= 0) {if (SYSTEM_TRACE) {Trace.endSection();}Log.d(sectionName, msg + " : " + (SystemClock.uptimeMillis() - time.value));}}}
}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部