启动优化:冷启动流程、Application 懒初始化、SDK 异步初始化;
1、App 冷启动完整流程是什么?
答案
- 点击桌面图标,Launcher 通知 AMS
- AMS 检测 App 进程不存在,通知 Zygote新建进程
- 进程创建,初始化 ActivityThread,执行 main ()
- 初始化 Application(attachBaseContext → onCreate)
- 初始化主线程 Looper、创建目标 Activity
- 执行 Activity 生命周期:onCreate→onStart→onResume
- 加载布局、测量绘制、渲染屏幕,页面显示
2、冷启动、温启动、热启动区别
答案
- 冷启动:进程不存在,新建进程 + 初始化 Application + 初始化 Activity,最慢
- 温启动:进程还在,Activity 被系统回收,只需重建 Activity,不用重建 Application
- 热启动:进程和 Activity 都存活,只是后台切前台,只走 onStart→onResume,最快
3、冷启动慢的主要原因有哪些?
答案
- Application onCreate 主线程初始化大量第三方 SDK
- Application/Activity 主线程做网络、IO、数据库、复杂计算
- 布局嵌套深、冗余 View 多,inflate 耗时
- 主线程阻塞、同步锁、频繁 GC
- 首屏请求接口阻塞 UI 渲染
4、Application 为什么不能在主线程堆耗时初始化?
答案
Application 在冷启动最前期执行,阻塞主线程会直接拉长冷启动时间,容易造成启动白屏、卡顿、甚至 ANR。
5、什么是 Application 懒初始化?
答案
不把所有 SDK 都在 Application onCreate 一次性初始化;
用到哪个再初始化哪个,非必要 SDK 延后、按需加载,减少启动耗时。
6、SDK 异步初始化怎么做?
答案
- 把非刚需 SDK 放到子线程 / 线程池 / 协程异步初始化
- 主线程只初始化必须立刻用的核心 SDK
- 利用 IdleHandler,等主线程空闲再初始化非关键 SDK
- 业务页面懒加载,进入对应页面再初始化对应 SDK
7、有哪些具体冷启动优化手段?
答案
- Application 精简:非必要 SDK异步、懒加载
- 主线程只做 UI 初始化,耗时全丢子线程
- 布局优化:减少嵌套、ConstraintLayout、ViewStub 懒加载
- 主题适配解决启动黑白屏
- 首屏骨架屏,先占位再异步拿数据
- 用 IdleHandler 在主线程空闲时做次要初始化
- 减少主线程锁、减少大对象创建、降低 GC 频率
8、IdleHandler 作用和使用场景
答案
等主线程消息队列空闲、没有 UI 任务时再执行;
适合放非刚需 SDK 初始化、埋点、预加载,不影响启动和 UI 响应。
9、怎么排查冷启动耗时瓶颈?
答案
- 查看 Logcat 启动时间日志
- Android Studio Profiler 看主线程耗时
- 手动埋点打印各阶段耗时
- 分析 ANR 日志、主线程卡顿堆栈,定位耗时代码
极简总结
冷启动要经历创建进程→Application 初始化→Activity 生命周期→布局绘制;
启动慢主要是 Application 主线程堆 SDK 和耗时操作;
优化核心:SDK 异步初始化、Application 懒加载、主线程减负、布局精简、空闲时机延后非必要初始化。