Android中App的启动通常有两种启动方式,分别为:
了解以上两种启动方式之后如果我们要对app的启动速度进行优化,那么我们就需要对冷启动时Application的初始化进行优化,也要对主Activity的初始化进行优化,才能实现我们的启动优化的效果。而在app启动的过程中,从用户点击桌面图标到界面显示的这个过程中的中间过程是由系统控制的,我们能够控制的只有自己app的Application和主Activity。
在应用开发中往往影响app启动速度的问题主要集中在以下两个方面:
在对app启动时间进行优化之前我们需要知道怎样去测量一个app的启动时间,才能帮助我们从数据上和视觉上实现最好的优化效果。
在启动app的时候Logcat会打印出ActivityManager的Log出来,其中有一行用于显示app启动时间的Log,我们需要知道显示时间时只需要执行如下命令,打印相关信息:
adb logcat -s ActivityManager
如果是在Linux环境下的话更可以通过如下命令过滤信息:
adb logcat -s ActivityManager |grep Displayed
在点击需要测量的app图标,启动它,在终端会显示如下结果:
09-19 22:03:59.258 1833 1951 I ActivityManager: Displayed com.example.alexluo.myapplication/.MainActivity: +97ms
该方法用于向系统报告app已经启动完成绘制,需要系统统计启动时间,在开发中出于优化的目的,通常会先加载View,再延迟加载View需要的数据,我们可以通过这个方法来测量延迟加载数据所消耗的时间。
下面是模拟代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
reportFullyDrawn();
}
},300);
}
}
启动app时我们在终端打印ActivityManager的Log显示如下
09-19 22:17:30.746 1833 1951 I ActivityManager: Displayed com.example.administrator.myapplication2/.MainActivity: +78ms
09-19 22:17:30.986 1833 9676 I ActivityManager: Fully drawn com.example.administrator.myapplication2/.MainActivity: +318ms
在示例代码中从Displayed显示时间为78ms,Fully drawn时间为318ms,我们延迟了300毫秒执行reportFullyDrawn方法,可以大概推算出剩下的18ms为Handler消息处理和系统接收并处理reportFullyDrawn方法的时间
Android Studio自带Method Tracing工具,可以使用该工具来分析和记录方法的执行时间,以此来分析性能问题
在需要检测的代码前后分别添加如下代码:
Debug.startMethodTracing();
Debug.stopMethodTracing();
例如:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Debug.startMethodTracing();
testAppStart();
Debug.stopMethodTracing();
}
private void testAppStart(){
try{
Thread.sleep(3000);
}catch (InterruptedException e){
}
}
}
在上面的代码中我们模拟一个耗时方法,Thread睡眠3000毫秒,然后在Activity的onCreate中调用该方法,并用Debug的Method Tracing来跟踪执行时间。
在app启动的时候点击Android Studio Monitor中的被红色圈住的按钮。
然后会生成一个trace文件,如下图所示:
该文件具体记录了方法的执行时间,可以通过该方法判断是哪个地方执行耗时。
如上图所示,可以查找到我们定义的testAppStart方法的执行时间,下面是常用菜单的介绍:
底部栏时间栏:
菜单名 | 说明 |
---|---|
Name | 执行方法名 |
Invocation Count | 调用次数 |
Inclusive Time(us) | 该方法及其内部调用的方法执行时间 |
Exclusive Time(us) | 该方法执行时间,不包括内部子方法执行时间 |
顶部图表栏:
该工具从4.1开始有,从4.3开始可以通过代码插入分析代码执行过程,Systrace可以统计和生成系统运行时的具体报告,
包括绘图系统,输入系统,资源加载等系统模块的执行过程
设置窗口:
然后就可以生成trace文件,并用Chrome浏览器打开,如下图所示:
例如:
需要测试的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
Trace.beginSection("traceTest");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Trace.endSection();
}
最后生成的trace文件,通过放大后针对我们的代码段的trace结果如图所示:
被录制好的视频会显示执行时间,我们导出视频之后可以通过一些逐帧动视频查看工具统计启动时间,
可以通过adb命令启动屏幕录制:
adb shell screenrecord --bugreport /sdcard/app_start.mp4