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、预加载数据
}

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器