Android 性能优化—— 启动优化提升60%

浅谈 Android启动优化

Posted by Lance on September 6, 2018

前言

第一篇正式的博客哦~

目录:

  • 应用启动速度
  • 视觉优化
    • 启动主题优化
      • 默认情况
      • 透明主题优化
      • 设置闪屏图片主题
  • 代码优化
    • 冷启动耗时统计
      • adb 命令统计
      • 系统日志统计
    • 代码优化
      • Application 优化
      • 闪屏页业务优化
      • 广告页优化
  • 优化效果
  • 启动窗口
  • 总结

正文

应用启动速度

一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序。 本文将从两个方向优化应用的启动速度 :

  • 视觉体验优化
  • 代码逻辑优化

视觉优化

谷歌开发文档

应用程序启动有三种状态,每种状态都会影响应用程序对用户可见所需的时间:冷启动,热启动和温启动。

在冷启动时,应用程序从头开始。在其他状态下,系统需要将正在运行的应用程序从后台运行到前台。我们建议您始终根据冷启动的假设进行优化。这样做也可以改善热启动和温启动的性能。

在冷启动开始时,系统有三个任务。这些任务是:

  1. 加载并启动应用程序。

  2. 启动后立即显示应用程序空白的启动窗口。

  3. 创建应用程序进程。

一旦系统创建应用程序进程,应用程序进程就会负责下一阶段。这些阶段是:

  1. 创建app对象.
  2. 启动主线程(main thread).
  3. 创建应用入口的Activity对象.
  4. 填充加载布局Views
  5. 在屏幕上执行View的绘制过程.measure -> layout -> draw

应用程序进程完成第一次绘制后,系统进程会交换当前显示的背景窗口,将其替换为主活动。此时,用户可以开始使用该应用程序。


因为App应用进程的创建过程是由手机的软硬件决定的,所以我们只能在这个创建过程中视觉优化。


启动主题优化

冷启动阶段 :

  1. 加载并启动应用程序。

  2. 启动后立即显示应用程序空白的启动窗口。

  3. 创建应用程序进程。

所谓的主题优化,就是应用程序在冷启动的时候(1~2阶段),设置启动窗口的主题。

因为现在 App 应用启动都会先进入一个闪屏页(LaunchActivity)的来展示应用信息。

  • 默认情况

如果我们对App没有做处理(设置了默认主题),并且在 Application 初始化了其它第三方的服务(假设需要加载2000ms),那么冷启动过程就会如下图 :


系统默认会在启动应用程序的时候 启动空白窗口 ,直到 App 应用程序的入口 Activity 创建成功,视图绘制完毕。( 大概onWindowFocusChanged方法回调的时候 )

  • 透明主题优化

为了解决启动窗口白屏问题,许多开发者使用透明主题来解决这个问题,但是治标不治本。

虽然解决了上面这个问题,但是仍然有些不足。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>


(无白屏,不过从点击到App仍然存在视觉延迟~)

  • 设置闪屏图片主题

为了更顺滑无缝衔接我们的闪屏页,可以在启动 Activity 的 Theme中设置闪屏页图片,这样启动窗口的图片就会是闪屏页图片,而不是白屏。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
	<item name="android:windowBackground">@mipmap/launch</item>   //闪屏页图片
	<item name="android:windowFullscreen">true</item>
	<item name="android:windowContentOverlay">@null</item>
</style>


这样设置的话,就会在冷启动的时候,展示闪屏页的图片,等App进程初始化加载入口 Activity (也是闪屏页) 就可以无缝衔接。

其实这种方式并没有真正的加速应用进程的启动速度,而只是通过用户视觉效果带来的优化体验。


参考: