跳转到正文
YGJoon
返回

Android Kotlin App Startup 优化策略

编辑文章

启动阶段划分

阶段描述
冷启动App 进程首次创建
热启动App 前后台切换
温启动进程存在但 Activity 销毁

本文聚焦冷启动优化。

指标采集

class StartupTracer : Initializer<Unit> {
    override fun create(context: Context) {
        val start = SystemClock.elapsedRealtime()
        ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onStart(owner: LifecycleOwner) {
                val cost = SystemClock.elapsedRealtime() - start
                Timber.i("App cold start: ${cost}ms")
            }
        })
    }

    override fun dependencies(): List<Class<out Initializer<*>>> = emptyList()
}

App Startup 库

AndroidManifest.xml

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.startup"
    android:exported="false">
    <meta-data
        android:name="com.example.startup.StartupTracer"
        android:value="androidx.startup" />
</provider>

延迟初始化策略

模块优化策略
日志 SDK初始化在后台线程,使用懒加载
图片库首屏只加载必要配置,延迟解码器注册
Analytics使用 WorkManager 延迟上传
Room DB异步预加载或按需打开
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        CoroutineScope(SupervisorJob() + Dispatchers.Default).launch {
            initAnalytics()
            initLog()
        }
    }
}

布局与资源优化

SplashScreen API

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        installSplashScreen().apply {
            setKeepOnScreenCondition { viewModel.uiState.value is UiState.Loading }
        }
        super.onCreate(savedInstanceState)
    }
}

多模块与初始化顺序

class CrashReporterInitializer : Initializer<Unit> {
    override fun create(context: Context) {
        val start = SystemClock.elapsedRealtime()
        CrashReporter.init(context)
        Timber.d("CrashReporter init ${SystemClock.elapsedRealtime() - start}ms")
    }

    override fun dependencies(): List<Class<out Initializer<*>>> = listOf(LoggingInitializer::class.java)
}

工具与监控

常见问题

问题原因解决方案
冷启动白屏Theme 未配置 WindowBackground设置 windowSplashScreenBackground
Application onCreate 耗时过长同步初始化过多拆分异步任务、懒加载
初始化顺序问题依赖未显式声明使用 Initializer.dependencies() 指定依赖

总结

  1. 利用 App Startup 库管理初始化顺序,结合协程延迟非关键任务。
  2. 通过 SplashScreen + 主题优化改善视觉体验。
  3. 建立启动指标监控与优化流程,持续追踪首屏性能。

编辑文章
分享这篇文章:

上一篇
Android Kotlin Channel 与并发通信模式
下一篇
Flutter 鸿蒙化概述篇:从愿景到落地