7、启动优化:冷启动流程、Application 懒初始化、SDK 异步初始化;

1 阅读3分钟

启动优化:冷启动流程、Application 懒初始化、SDK 异步初始化;

1、App 冷启动完整流程是什么?

答案

  1. 点击桌面图标,Launcher 通知 AMS
  2. AMS 检测 App 进程不存在,通知 Zygote新建进程
  3. 进程创建,初始化 ActivityThread,执行 main ()
  4. 初始化 Application(attachBaseContext → onCreate)
  5. 初始化主线程 Looper、创建目标 Activity
  6. 执行 Activity 生命周期:onCreate→onStart→onResume
  7. 加载布局、测量绘制、渲染屏幕,页面显示

2、冷启动、温启动、热启动区别

答案

  • 冷启动:进程不存在,新建进程 + 初始化 Application + 初始化 Activity,最慢
  • 温启动:进程还在,Activity 被系统回收,只需重建 Activity,不用重建 Application
  • 热启动:进程和 Activity 都存活,只是后台切前台,只走 onStart→onResume,最快

3、冷启动慢的主要原因有哪些?

答案

  1. Application onCreate 主线程初始化大量第三方 SDK
  2. Application/Activity 主线程做网络、IO、数据库、复杂计算
  3. 布局嵌套深、冗余 View 多,inflate 耗时
  4. 主线程阻塞、同步锁、频繁 GC
  5. 首屏请求接口阻塞 UI 渲染

4、Application 为什么不能在主线程堆耗时初始化?

答案

Application 在冷启动最前期执行,阻塞主线程会直接拉长冷启动时间,容易造成启动白屏、卡顿、甚至 ANR。

5、什么是 Application 懒初始化?

答案

不把所有 SDK 都在 Application onCreate 一次性初始化;

用到哪个再初始化哪个,非必要 SDK 延后、按需加载,减少启动耗时。

6、SDK 异步初始化怎么做?

答案

  1. 把非刚需 SDK 放到子线程 / 线程池 / 协程异步初始化
  2. 主线程只初始化必须立刻用的核心 SDK
  3. 利用 IdleHandler,等主线程空闲再初始化非关键 SDK
  4. 业务页面懒加载,进入对应页面再初始化对应 SDK

7、有哪些具体冷启动优化手段?

答案

  1. Application 精简:非必要 SDK异步、懒加载
  2. 主线程只做 UI 初始化,耗时全丢子线程
  3. 布局优化:减少嵌套、ConstraintLayout、ViewStub 懒加载
  4. 主题适配解决启动黑白屏
  5. 首屏骨架屏,先占位再异步拿数据
  6. 用 IdleHandler 在主线程空闲时做次要初始化
  7. 减少主线程锁、减少大对象创建、降低 GC 频率

8、IdleHandler 作用和使用场景

答案

主线程消息队列空闲、没有 UI 任务时再执行;

适合放非刚需 SDK 初始化、埋点、预加载,不影响启动和 UI 响应。

9、怎么排查冷启动耗时瓶颈?

答案

  1. 查看 Logcat 启动时间日志
  2. Android Studio Profiler 看主线程耗时
  3. 手动埋点打印各阶段耗时
  4. 分析 ANR 日志、主线程卡顿堆栈,定位耗时代码

极简总结

冷启动要经历创建进程→Application 初始化→Activity 生命周期→布局绘制;

启动慢主要是 Application 主线程堆 SDK 和耗时操作;

优化核心:SDK 异步初始化、Application 懒加载、主线程减负、布局精简、空闲时机延后非必要初始化