Application.onCreate()也会影响白屏
在 Android 中,Application.onCreate() 是整个应用启动过程中的最早阶段之一,主要用于初始化全局状态(如 SDK 初始化、日志框架配置等)。但此方法运行在主线程上,任何耗时操作都会直接影响冷启动时间,进而导致白屏、卡顿甚至 ANR。
一、常见的耗时操作类型
类型 | 示例 | 说明 |
---|---|---|
I/O 操作 | 文件读写、SharedPreferences.getX()、数据库查询 | 文件系统和数据库访问都较慢 |
网络请求 | 获取配置信息、广告、AB 实验开关等 | 会直接阻塞主线程(若未异步处理) |
大型 SDK 初始化 | 各类第三方 SDK 初始化(如广告、监控、安全) | 有些 SDK 内部存在同步操作 |
反射操作 | 动态加载类、构造对象 | 反射在低端机上尤其慢 |
资源加载 | 加载大型图片、so 库、字体文件 | 解压或内存分配开销大 |
CPU 计算密集 | 解密、加密、Hash计算等 | 占用 CPU 导致主线程卡顿 |
阻塞操作 | Thread.sleep、CountDownLatch.await 等 | 会直接卡住主线程 |
二、实际例子(不推荐的做法)
override fun onCreate() {
super.onCreate()
// ❌ 同步读取文件
val config = File(filesDir, "config.json").readText()
// ❌ 初始化大型 SDK(内部可能网络请求)
Analytics.init(this)
// ❌ 阻塞主线程
Thread.sleep(1000)
}
三、优化建议
优化方向 | 说明 |
---|---|
✅ 延迟初始化 | 使用懒加载、按需初始化(如首次使用才 init) |
✅ 后台初始化 | 将不影响主流程的初始化移到子线程(使用 Coroutine、HandlerThread、Executor) |
✅ 拆分任务 | 拆解为多个阶段,启动后逐步完成 |
✅ 使用 App Startup、Jetpack 启动器 | 统一管理初始化流程,并可配置依赖关系和执行线程 |
✅ Profile 启动阶段耗时 | 使用 Android Studio Profiler 分析 onCreate() 中的调用栈耗时 |
✅ 优化 SDK 初始化 | 检查 SDK 文档是否支持异步初始化或懒加载配置 |
四、实践建议
使用如下结构,规避耗时阻塞:
override fun onCreate() {
super.onCreate()
initEssential() // 必需初始化,轻量级
GlobalScope.launch(Dispatchers.Default) {
initInBackground() // 非关键耗时操作
}
}
private fun initEssential() {
// 日志、崩溃收集等轻量操作
}
private fun initInBackground() {
// 启动后在后台初始化大 SDK、预加载数据
}