概述
TraceView是Android平台配备一个很好的性能分析工具,它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到方法。关于它的介绍,配置,使用相信网上有大篇幅的文章介绍,我就不赘言了。
既然是启动的优化 那么我们就直接对启动的部分进行性能的检测
第一步:在Application中埋点,指定输出xx.trace文件
@Override
public void onCreate() {
super.onCreate();
Debug.startMethodTracing("App");
QMUISwipeBackActivityManager.init(this);
initX5();
mInstance = this;
mContext = getApplicationContext();
mMainThread = Thread.currentThread();
mMainThreadId = android.os.Process.myTid();
mHandler = new Handler();
RePlugin.App.onCreate();
RePlugin.enableDebugger(this, true);
RxTool.init(this);
if (isDebug(this)) {
ARouter.openLog();
ARouter.openDebug();
}
ARouter.init(this);
UMConfigure.init(this, "xxxx", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "xxxx");
/**
* 参数: boolean 默认为false,如需查看LOG设置为true
*/
UMConfigure.setLogEnabled(true);
/**
* 参数:boolean 默认为false(不加密)
*/
UMConfigure.setEncryptEnabled(true);
UMShareAPI.get(this);
UMengPushManager.getInstance().initUmPush();
//地图初始化,解决第一次进采集界面没有定位数据
LocationCityManager locationCityManager = new LocationCityManager(this);
locationCityManager.initLocation();
//未知异常捕获,日志记录 邮件通知研发人员
// UniException.getInstance().init();
//initDB
LitePal.initialize(this);
//初始化录音工具
IdealRecorder.getInstance().init(this);
Debug.startMethodTracing();
}
在onCreat方法启动的时候调用
Debug.startMethodTracing("App"); 指定在sdcard/Android/data/包名/file/App.trace 文件的生成
在启动结束的时候关闭
Debug.startMethodTracing();
启动app后在Device File Explore 视图找到App.trace文件,然后点击开就可以看到
这里可以看出App启动过程有36个线程(Call Chart)黄色代表系统线程 绿色app自带的线程 蓝色代表java执行的线程
根据这些线程的消耗CPU的情况,代码执行的耗时,已经函数的调用和被调用情况,我们可以分析出启动慢,卡顿等的耗时原因,已经优化方向。
接下来我们区分两个指标:cputime和walltime
很多人会认为walltime代码执行时间就是用来考量性能决定优化方向的指标,其实不然,我认为cputime才是真正的衡量指标,cputime代码消耗cpu的时间即cpu占用时间。
原因:假设优先调用一个函数出现了死锁的情况,函数由于死锁无法分配到cpu而处于等待的状态,这个时候函数的walltime就会变得特别长,但是cputime却是非常短,因为函数A非常简单,甚至乎不怎么消耗cpu。
假设我们发现启动速度过慢,但是cpu的使用率又非常低,每一个线程占用cpu的时间很短的时候,这个时候我们就可以考虑开辟多线程来解决问题。
缺点
traceView的缺点就是即使我们在主线程埋点,但是它依然会捕获所有的线程,因此会使得app的速度变慢,对性能消耗非差大,反而产生误导,将优化的方向偏离。
其他工具:systrace