3.冷启动优化

冷启动优化

traceview 检查耗时的方法

App 进程的创建等环节我们是无法主动控制的。应用开发唯一能做的就是减少在 Application 和第一个 Activity 中的工作量,从而缩短冷启动的时间

Application 会执行多次,要只在主 app 的 Application 执行,加速启动
if (AppUtils. inMainProcess (getApplication ()))

核心目标:减少首屏压力,让重要内容先出来

  • 分步加载
    大的任务拆成小步骤,逐步完成
  • 异步加载
    把耗时操作放到子线程执行
  • 延迟加载
    👉 _非必要的数据延后加载_(首屏不需要的先别做)
  • 优先级控制
    体积大、优先级低的任务靠后执行
    unknown_filename.4|600
    unknown_filename.5|600
    unknown_filename.6|600

非必要资源延迟初始化:用到的时候在加载

1
2
3
<style name="LaunchTheme" parent="AppTheme">
<item name="android:windowBackground">@drawable/splash_bg</item>
</style>

方案

  • 避免在启动时做密集耗时的初始化
  • 避免 I/O 操作、网络操作、布局嵌套等考虑异步
  • 初始化三方组件,不阻塞主线程,比如:图片选择库、日志上传模块、统计、推送、语音库等等
  • 使用 Activity 的 windowBackground 主题属性来为启动的 Activity 提供一个简单的 drawable,让用户产生一种速度加快的感觉。

热启动和冷启动

  • 冷启动 :在启动应用前,系统还没有 App 的任何进程。冷启动流程就是 app 启动流程全过程,包括创建 app 进程、加载资源、启动主线程等等。这种启动耗时最长。
  • 热启动 :app 进程处于后台,系统只是把它从后台带到前台,展示给用户。相比冷启动,热启动过程时间更短。但启动时,系统依然会展示一个空白背景,直到第一个 Activity 的内容呈现为止。

IntentService

  • 使用 intentservice,普通服务后台任务运行完,即使它不执行任何操作,服务也会一直运行,这些是十分消耗内存的。
  • IntentService 子线程分担部分初始化工作。开启 IntentSerVice 线程,将部分逻辑和耗时的初始化操作放到这里处理,可以减少 application 初始化时间
1
2
adb shell am start -W packagename/MainActivity
adb shell am start -S -R 10 -W packagename/.MainActivity

adb shell am start -S -R 10 -W com.miui.home/.settings.MiuiHomeSettingActivity

unknown_filename.36

BoostMultiDex

Dex 压缩
当 Dex 非常多的时候会增加应用的安装时间,对于十个以上的 Dex,首次生成 ODEX 的时间可能就会达到分钟级别。

过多的 dex 文件编译会严重影响冷启动时间(解决方案 BoostMultiDex

Android 低版本(4. X 及以下,SDK < 21)的设备,采用的 Java 运行环境是 Dalvik 虚拟机。它相比于高版本,最大的问题就是在安装或者升级更新之后,首次冷启动的耗时漫长。这常常需要花费几十秒甚至几分钟,用户不得不面对一片黑屏,熬过这段时间才能正常使用 APP。

BoostMultiDex是一个用于 Android 低版本设备(4. X 及以下,SDK < 21)快速加载多 DEX 的解决方案,由抖音/Tiktok Android 技术团队出品。

相比于 Android 官方原始 MultiDex 方案,它能够减少80%以上的黑屏等待时间,挽救低版本 Android 用户的升级安装体验。并且,不同于目前业界所有优化方案,BoostMultiDex 方案是从 Android Dalvik 虚拟机底层机制入手,从根本上解决了安装 APK 后首次执行 MultiDex 耗时过长问题。


3.冷启动优化
http://peiniwan.github.io/2025/12/69d6bc2a702f.html
作者
六月的雨
发布于
2025年12月16日
许可协议