AndroidAPP 启动速度优化;冷启动和热启动解析
所以,总结一下,应用的启动流程例如以下:
Application 的构造器方法——>attachBaseContext()——>onCreate()——>Activity 的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>測量布局绘制显示在界面上。
測量应用启动的时间
在上面这个启动流程中,不论什么一个地方有耗时操作都会拖慢我们应用的启动速度,而应用启动时间是用毫秒度量的。对于毫秒级别的快慢度量我们还是须要去精确的測量到究竟应用启动花了多少时间。而依据这个时间来做衡量。
什么才是应用的启动时间
从点击应用的启动图标開始创建出一个新的进程直到我们看到了界面的第一帧,这段时间就是应用的启动时间。
我们要測量的也就是这段时间。測量这段时间能够通过 adb shell 命令的方式进行測量,这样的方法測量的最为精确。命令为:
adb shell am start -W [packageName]/[packageName.MainActivity]
运行成功后将返回三个測量到的时间:?1、ThisTime:一般和 TotalTime 时间一样。除非在应用启动时开了一个透明的 Activity 预先处理一些事再显示出主 Activity,这样将比 TotalTime 小。?2、TotalTime:应用的启动时间。包含创建进程+Application 初始化+Activity 初始化到界面显示。
3、WaitTime:一般比 TotalTime 大点,包含系统影响的耗时。
以下是測量一个应用冷启动和热启动的时间:?冷启动:?
热启动:?
能够看到在进程已经存在的情况下。仅仅须要又一次初始化 MainActivity。这样的启动比較快。只是大多数情况下应用的启动都是冷启动。由于用户都会在任务列表中手动关闭遗留的应用进程。
降低应用启动时的耗时
针对冷启动时候的一些耗时,如上測得这个应用算是中型的 app,在冷启动的时候耗时已经快 700ms 了,假设项目再大点在 Application 中配置了很多其它的初始化操作,这样将可能达到 1s,这样每次启动都明显感觉延迟。所以在进行应用初始化的时候採取以下策略:?1、在 Application 的构造器方法、attachBaseContext()、onCrea
te()方法中不要进行耗时操作的初始化,一些数据预取放在异步线程中,能够採取 Callable 实现。?2、对于 sp 的初始化,由于 sp 的特性在初始化时候会对数据所有读出来存在内存中,所以这个初始化放在主线程中不合适,反而会延迟应用的启动速度,对于这个还是须要放在异步线程中处理。
3、对于 MainActivity,由于在获取到第一帧前。须要对 contentView 进行測量布局绘制操作,尽量降低布局的层次。考虑 StubView 的延迟载入策略。当然在 onCreate、onStart、onResume 方法中避免做耗时操作。
遵循上面三种策略可明显提高 app 启动速度。
优化应用启动时的体验
对于应用的启动时间,仅仅能是尽量的避免一些耗时的、非必要的操作在主线程中,这样相对能够缩减一部分启动的耗时,另外一方面在等待第一帧显示的时间里,能够增加一些配置以增加体验,比方增加 Activity 的 background,这个背景会在显示第一帧前提前显示在界面上。
1、先为主界面单独写一个主题 style,设置一张待显示的图片,这里我设置了一个颜色,然后在 manifest 中设置给 MainActivity:
<style name="AppTheme.Launcher"><item name="android:windowBackground">@drawable/bule</item></style>//...<activityandroid:name=".MainActivity"android:label="@string/app_name"android:theme="@style/AppTheme.Launcher"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>
2、然后在 MainActivity 中载入布局前把 AppTheme 又一次设置给 MainActivity:
@Overrideprotected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
评论