Android 应用启动优化
Android 应用的启动时间长短是衡量应用性能的指标之一,是用户对应用的第一印象,其重要性不言而喻。
启动状态
应用启动状态主要有3种,一般来说冷启动耗时较长,启动优化主要是优化冷启动时间,这样做也可以提升温启动和热启动的性能。
-
冷启动
冷启动是指应用从头开始启动:系统进程在冷启动后才创建应用进程。发生冷启动的情况包括应用
自设备启动后或系统终止应用后首次启动。
-
热启动
在热启动中,系统的所有工作就是将 Activity 带到前台。只要应用的所有 Activity 仍驻留在内存
中,应用就不必重复执行对象初始化、布局加载和绘制。例如按Home键
-
温启动
温启动包含了在冷启动期间发生的部分操作;同时,它的开销要比热启动高。有许多潜在状态可视
为温启动。例如
-
用户在退出应用后又重新启动应用。进程可能未被销毁,继续运行,但应用需要执行onCreate() 从头开始重新创建 Activity。
-
系统将应用从内存中释放,然后用户又重新启动它。进程和 Activity 需要重启,但传递到onCreate() 的已保存的实例 state bundle 对于完成此任务有一定助益。
-
应用启动流程
启动流程图.png- 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
- system_server进程接收到请求后,向zygote进程发送创建进程的请求;
- Zygote进程fork出新的子进程,即App进程;
- App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
- system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
- App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
- 主线程在收到Message后,通过反射机制创建目标Activity,并回调Activity.onCreate()等方法。
- 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。
启动时间
启动时间跟手机性能有关,主流旗舰机型启动时间保持在 2S 内为佳
启动耗时统计
启动耗时统计有两种途径
-
系统日志统计
在 Android 4.4(API 级别 19)及更高版本中,logcat 包含一个输出行,其中包含名为 Displayed 的值。此值代表从启动进程到在屏幕上完成对应 Activity 的绘制所用的时间。
-
adb命令统计
adb shell am start -S -W [packageName]/[activityName]
我们一般关注TotalTime(表示新应用启动的耗时,包括新进程的启动和Activity的启动,但不包括前一个应用Activity pause的耗时),
启动状态LaunchState有4种情况:
- LaunchState: COLD (冷启动)
- LaunchState: HOT (热启动)
- LaunchState: WARM (温启动)
- LaunchState: UNKNOWN (0) (应用在前台时,调用adb命令)
问题诊断
-
使用DebugAPI及profiler 工具
Android Studio 3.2+ 提供了 profiler 工具(我目前已升级到4.1+ 版本),可查看xxx.trace文件
1.在application中添加startMethodTracing
public MyApplication() { //相对sd卡路径,会在sd卡中生成一个app.trace文件(需要sdcard读写权限)。将手机中的trace文件保存至电脑,随后拖入Android Studio即可。 //跟踪方式 Debug.startMethodTracing("app"); //采样方式,间隔1s //Debug.startMethodTracingSampling("app",8*1024*1024,1000); }
2.在启动页的activity中添加stopMethodTracing
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Debug.stopMethodTracing(); }
3.从sd卡保存到电脑并使用Android Studio查看
4.优先查看耗时较长的方法并分析代码,遵循性能优化方法,例如:
- 合理的使用异步初始化、延迟初始化、懒加载机制
- 避免启动时耗时操作
- 简化布局
启动黑白屏问题
当系统加载并启动 App 时,需要耗费相应的时间,这样会造成用户会感觉到当点击 App 图标时会有 “延迟” 现象,为了解决这一问题,Google 的做法是在 App 创建的过程中,先展示一个空白页面,让用户体会到点击图标之后立马就有响应。
如果application或activity启动的过程太慢,导致系统的BackgroundWindow没有及时被替换,就会出现启动时白屏或黑屏的情况(取决于Theme主题是Dark还是Light)。
消除启动时的黑/白屏问题,大部分App都采用自己在Theme中设置背景图的方式来解决。
1.定义主题
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/bg</item>
</style>
2.启动页使用主题
<activity android:name=".activity.SplashActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
3.启动页还原为应用主题
@Override
protected void onCreate(Bundle savedInstanceState) {
//替换为原来的主题,在onCreate之前调用
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
}
网友评论