开机启动流程
冷/热/暖启动
冷启动
程序从头开始,系统没有为该程序创建进程。一般厂家:程序安装后的第一次启动; 应用程序被系统完全终止后再打开
热启动
此时程序仍然主流在内存中,只是被系统从后台带到前台,因此程序可以避免重复初始化,加载布局和渲染。
需要注意的是,如果程序的某些内存被系统清除,比如调用了onTrimMemory方法,则需要重新创建这些对象以响应热启动事件。
暖启动
它包含热启动和冷启动一系列的操作子集,比热启动的消耗稍微多一点。它于热启动最大区别在于,它必须通过调用onCreate方法开始重新创建活动,也可以传递给onCreate方法中保存的实例状态中获得某些对象的恢复。
黑白屏解决方案
启动App时,默认会先加载空白窗体 (一般为白色或黑色),我们可以通过修改Theme背景色为透明色,或者将背景改为闪屏页来解决。
详见 https://www.cnblogs.com/hwb04160011/p/8041429.html
App启动时间检测
adb shell am start -W com.ethanco.mytest0822/.MainActivity
执行结果如下
ThisTime:最后一个Activity启动时间
TotalTime:一系列Activity启动时间
WaitTime:总启动时间,包含系统在冷启动时,需要加载App信息到内存的时间
一般,我们看TotalTime即可,WaitTime中的系统时间一般我们改变不了
TotalTime就是如果有多个页面,比如SplashActivity和MainActivity,那么都会统计进去
代码执行时间统计
@Override
public void onCreate() {
super.onCreate();
File file = new File(Environment.getExternalStorageDirectory(), "app.trace");
Debug.startMethodTracing(file.getAbsolutePath());
doSomeThing(); //业务逻辑代码
test();
Debug.stopMethodTracing();
}
private void doSomeThing() {
SystemClock.sleep(2000);
a();
test();
}
private void a(){
SystemClock.sleep(200);
}
private void test(){
SystemClock.sleep(500);
}
需要注意的是,App需要先申请存储权限,否则会错Unable to open trace file '/storage/emulated/0/app.trace
错误
接着,我们运行程序后,通过adb pull /storage/emulated/0/app.trace
,将文件导入到电脑中,接着将该文件,拖入Android Studio
可以看到,具体每个方法的耗时,这样,我们就可以根据耗时来定位启动慢的问题
,然后正对性的来优化启动速度,减少代码执行时间,能放到异步线程的尽量放到异步线程。