Appearance
App Startup 库详解
📚 Android 面试指南 - Jetpack 组件系列
📝 字数:约 10000 字 | ⏱ 建议阅读时间:40 分钟
目录
1. App Startup 库介绍
1.1 什么是 App Startup?
App Startup 是 AndroidX 提供的应用启动初始化库,它提供了一种标准化的方式来管理应用启动时的初始化逻辑。
kotlin
// 依赖添加
dependencies {
implementation("androidx.startup:startup-runtime:1.1.1")
}在早期的 Android 开发中,我们习惯在 Application.onCreate() 中执行各种初始化操作:
kotlin
// ❌ 传统方式
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// 各种第三方 SDK 初始化混杂在一起
AnalyticsInitializer.init(this)
CrashReporter.init(this)
NetworkClient.init(this)
Database.init(this)
PushNotification.init(this)
// ... 更多的初始化代码
}
}这种方式存在以下问题:
- 职责不清:Application 类变得越来越臃肿
- 难以维护:所有初始化逻辑耦合在一起
- 测试困难:难以单独测试某个初始化逻辑
- 性能问题:所有初始化在启动时同步执行
- 扩展性差:第三方库需要用户手动初始化
1.2 App Startup 的核心价值
App Startup 通过 Initializer 机制 解决了上述问题:
kotlin
// ✅ App Startup 方式
class AnalyticsInitializer : Initializer<Unit> {
override fun create(context: Context) {
Analytics.init(context)
}
override fun dependencies() = emptyList()
}
class CrashReporterInitializer : Initializer<Unit> {
override fun create(context: Context) {
CrashReporter.init(context)
}
override fun dependencies() = listOf(AnalyticsInitializer::class)
}核心优势:
| 特性 | 说明 |
|---|---|
| 模块化 | 每个 Initializer 独立管理一个初始化逻辑 |
| 依赖管理 | 自动处理初始化顺序 |
| 按需初始化 | 支持延迟初始化 |
| 易于测试 | 每个 Initializer 可以单独测试 |
| 第三方支持 | 第三方库可以直接提供 Initializer |
1.3 工作原理
┌─────────────────────────────────────────┐
│ Application onCreate() │
└──────────────────┬──────────────────────┘
│
▼
┌────────────────────────────┐
│ InitializerRegistry │
│ 读取 META-INF/services │
└───────────┬────────────────┘
│
▼
┌────────────────────────────┐
│ 构建依赖图 (DAG) │
│ Topological Sort │
└───────────┬────────────────┘
│
▼
┌────────────────────────────┐
│ 按顺序执行 Initializers │
│ (考虑依赖关系) │
└────────────────────────────┘2. Initializer 接口
2.1 基本实现
kotlin
import androidx.startup.Initializer
import android.content.Context
/**
* Initializer 接口定义
*
* @param T 初始化完成后返回的类型
*/
interface Initializer<T> {
/**
* 执行初始化逻辑
* @param context 应用的 Context
* @return 初始化结果
*/
fun create(context: Context): T
/**
* 返回依赖的 Initializer 列表
* 这些依赖会在本 Initializer 之前执行
*/
fun dependencies(): List<Class<out Initializer<*>>>
}2.2 实现第一个 Initializer
kotlin
/**
* 日志初始化器示例
*/
class LoggerInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 获取 Application Context
val applicationContext = context.applicationContext
// 初始化日志库
Logger.init()
.setLogAdapter(AndroidLogAdapter())
.setDefaultLogLevel(LogEnum.valueOf(BuildConfig.LOG_LEVEL))
// 记录初始化完成
Log.d("LoggerInitializer", "Logger initialized successfully")
}
override fun dependencies(): List<Class<out Initializer<*>>> {
// 没有依赖
return emptyList()
}
}
/**
* 网络初始化器示例
*/
class NetworkInitializer : Initializer<OkHttpClient> {
private lateinit var client: OkHttpClient
override fun create(context: Context): OkHttpClient {
val application = context.applicationContext
// 构建 OkHttp 客户端
client = OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.addInterceptor(HttpLoggingInterceptor())
.addInterceptor(UserAgentInterceptor())
.build()
// 设置为全局客户端
NetworkClient.instance = client
Log.d("NetworkInitializer", "Network client initialized")
return client
}
override fun dependencies(): List<Class<out Initializer<*>>> {
// 依赖 LoggerInitializer
return listOf(LoggerInitializer::class)
}
// 提供访问方法
fun getClient(): OkHttpClient = client
}2.3 注册 Initializer
方式 1:通过 META-INF/services(推荐)
在 src/main/resources/META-INF/services/ 目录下创建文件:
文件名:androidx.startup.Initializer
文件内容:
com.example.app.LoggerInitializer
com.example.app.NetworkInitializer
com.example.app.AnalyticsInitializer对于 Gradle 项目,需要在 src/main/java/ 下创建:
src/main/java/
└── META-INF/
└── services/
└── androidx.startup.Initializer方式 2:通过 AndroidManifest.xml
xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<!-- 注册 Initializer -->
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.startup"
android:exported="false"
tools:node="merge">
<!-- 无依赖的 Initializer -->
<meta-data
android:name="com.example.app.LoggerInitializer"
android:value="androidx.startup" />
<!-- 延迟初始化的 Initializer -->
<meta-data
android:name="com.example.app.PushNotificationInitializer"
android:value="androidx.startup" />
<meta-data
android:name="androidx.initializer.eager"
android:value="false" />
</provider>
</application>
</manifest>方式 3:通过第三方库
第三方库会自动在它们的包中包含 Initializer:
kotlin
// 第三方库的依赖
implementation("com.facebook.android:facebook-android-sdk:[x.x.x]")
// Facebook SDK 会自动注册它的 Initializer
// 无需手动配置2.4 带返回值的 Initializer
kotlin
/**
* 数据库初始化器 - 返回数据库实例
*/
class DatabaseInitializer : Initializer<RoomDatabase> {
private lateinit var database: RoomDatabase
override fun create(context: Context): RoomDatabase {
database = Room.databaseBuilder(
context.applicationContext,
RoomDatabase::class.java,
"app_database"
)
.addMigrations(MIGRATION_1_2)
.build()
Log.d("DatabaseInitializer", "Database initialized")
return database
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return listOf(LoggerInitializer::class)
}
// 提供全局访问
companion object {
var instance: RoomDatabase? = null
}
}
/**
* 使用返回值
*/
class RepositoryInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 获取已初始化的数据库
val registry = InitializationRegistry.getInstance(context)
val databaseInitializer = registry.createInitializer(DatabaseInitializer::class.java)
val database = databaseInitializer.create(context)
// 创建 Repository
val userRepository = UserRepository(database)
RepositoryProvider.set(userRepository)
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return listOf(DatabaseInitializer::class)
}
}3. 延迟初始化
3.1 什么是延迟初始化?
默认情况下,所有 Initializer 都会在应用启动时执行。但有些初始化逻辑不需要立即执行,可以延迟到第一次使用时。
kotlin
/**
* 延迟初始化的 Ad SDK
*/
class AdSdkInitializer : Initializer<Unit> {
@Override
fun create(context: Context) {
// 这个初始化会比较慢
AdSdk.initialize(context)
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
// 标记为延迟初始化
// 在 AndroidManifest.xml 中配置:
// <meta-data android:name="androidx.initializer.eager" android:value="false" />
}3.2 配置延迟初始化
在 AndroidManifest.xml 中配置
xml
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.startup"
android:exported="false">
<!-- 立即初始化 -->
<meta-data
android:name="com.example.app.LoggerInitializer"
android:value="androidx.startup" />
<!-- 延迟初始化 -->
<meta-data
android:name="com.example.app.AdSdkInitializer"
android:value="androidx.startup" />
<meta-data
android:name="androidx.initializer.eager"
android:value="false" />
<!-- 另一个延迟初始化的组件 -->
<meta-data
android:name="com.example.app.PushNotificationInitializer"
android:value="androidx.startup" />
<meta-data
android:name="androidx.initializer.eager"
android:value="false" />
</provider>3.3 手动触发延迟初始化
kotlin
/**
* 延迟初始化的广告 SDK
*/
class AdSdkInitializer : Initializer<Unit> {
private var isInitialized = false
override fun create(context: Context) {
if (!isInitialized) {
Log.d("AdSdkInitializer", "Initializing Ad SDK")
AdSdk.initialize(context)
isInitialized = true
}
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
/**
* 在需要的地方触发初始化
*/
class AdActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 触发延迟初始化
val registry = InitializationRegistry.getInstance(application)
registry.createInitializer(AdSdkInitializer::class.java).create(application)
// 或者使用 Initializer 的静态方法
AdSdkInitializer.ensureInitialized(application)
}
companion object {
fun ensureInitialized(context: Context) {
val registry = InitializationRegistry.getInstance(context)
registry.createInitializer(AdSdkInitializer::class.java).create(context)
}
}
}3.4 按需初始化的实现
kotlin
/**
* 支持按需初始化的 Initializer
*/
class OnDemandInitializer : Initializer<Unit> {
companion object {
private var shouldBeCreated = false
fun markForCreation() {
shouldBeCreated = true
}
}
override fun create(context: Context) {
// 只有被标记时才执行初始化
if (shouldBeCreated) {
performExpensiveInitialization(context)
}
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
private fun performExpensiveInitialization(context: Context) {
// 耗时的初始化逻辑
}
}
/**
* 在用户触发特定操作时标记
*/
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.showAdsButton.setOnClickListener {
// 用户点击按钮时触发广告初始化
OnDemandInitializer.markForCreation()
triggerAdInitialization()
}
}
private fun triggerAdInitialization() {
val registry = InitializationRegistry.getInstance(application)
registry.createInitializer(OnDemandInitializer::class.java).create(application)
}
}4. 依赖管理
4.1 依赖关系类型
kotlin
/**
* 依赖关系示例
*/
// 1. 无依赖 - 可以最先执行
class NoDependencyInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 不依赖其他 Initializer
}
override fun dependencies() = emptyList()
}
// 2. 单依赖 - 等待一个 Initializer 完成后执行
class SingleDependencyInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 依赖 LoggerInitializer
}
override fun dependencies() = listOf(LoggerInitializer::class)
}
// 3. 多依赖 - 等待多个 Initializer 完成后执行
class MultiDependencyInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 依赖 Logger 和 Network
}
override fun dependencies() = listOf(
LoggerInitializer::class,
NetworkInitializer::class
)
}
// 4. 依赖链 - 形成执行顺序链
class Level1Initializer : Initializer<Unit> {
override fun dependencies() = emptyList()
}
class Level2Initializer : Initializer<Unit> {
override fun dependencies() = listOf(Level1Initializer::class)
}
class Level3Initializer : Initializer<Unit> {
override fun dependencies() = listOf(Level2Initializer::class)
}
// 执行顺序:Level1 -> Level2 -> Level34.2 复杂依赖图
kotlin
/**
* 复杂的依赖关系示例
*
* +----------------+
* | LoggerInit |
* +-------+--------+
* |
* +-------v--------+
* | NetworkInit |
* +-------+--------+
* +-------|--------+
* | | +----------------+
* | +----------> AnalyticsInit|
* | +--------^--------+
* | | |
* v | |
* +-------+--------+ | |
* | DatabaseInit | | |
* +-------+--------+ | |
* | | |
* +-------+-------+ |
* | |
* +-------v----------------+
* | RepositoryInit |
* +------------------------+
*/
class LoggerInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = emptyList()
}
class NetworkInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = listOf(LoggerInitializer::class)
}
class DatabaseInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = listOf(LoggerInitializer::class)
}
class AnalyticsInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = listOf(
LoggerInitializer::class,
NetworkInitializer::class
)
}
class RepositoryInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = listOf(
DatabaseInitializer::class,
NetworkInitializer::class,
AnalyticsInitializer::class
)
}4.3 循环依赖处理
kotlin
/**
* ❌ 循环依赖示例(会导致崩溃)
*/
class CircularAInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = listOf(CircularBInitializer::class)
}
class CircularBInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = listOf(CircularAInitializer::class)
}
// 结果:初始化时会抛出 IllegalStateException
/**
* ✅ 解决方案:引入中介 Initializer
*/
class SharedInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 共享的初始化逻辑
}
override fun dependencies() = emptyList()
}
class ProperAInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = listOf(SharedInitializer::class)
}
class ProperBInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = listOf(SharedInitializer::class)
}4.4 获取依赖的 Initializer
kotlin
/**
* 在 Initializer 中访问其他已初始化的组件
*/
class FeatureInitializer : Initializer<Unit> {
override fun create(context: Context): Unit {
// 方式 1:通过 InitializationRegistry 获取
val registry = InitializationRegistry.getInstance(context)
// 获取 LoggerInitializer 的实例
val loggerInitializer = registry.getOrCreateLoggerInitializer()
// 使用 loggerInitializer 提供的方法
loggerInitializer.getLogger().d("Feature initialized")
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return listOf(LoggerInitializer::class)
}
}
/**
* 提供访问方法的 Initializer
*/
class LoggerInitializer : Initializer<Logger> {
private var logger: Logger? = null
override fun create(context: Context): Logger {
logger = Logger.Builder()
.context(context)
.build()
return logger!!
}
override fun dependencies() = emptyList()
// 提供访问方法
fun getLogger(): Logger? = logger
companion object {
var instance: LoggerInitializer? = null
}
}5. 性能优化
5.1 启动时间分析
kotlin
/**
* 性能优化的 Initializer
*/
class PerformanceOptimizerInitializer : Initializer<Unit> {
private val startTime = System.currentTimeMillis()
override fun create(context: Context) {
val start = System.currentTimeMillis()
// 记录每个步骤的耗时
Log.d("Perf", "Step1 start")
step1(context)
Log.d("Perf", "Step1 took ${System.currentTimeMillis() - start}ms")
start = System.currentTimeMillis()
step2(context)
Log.d("Perf", "Step2 took ${System.currentTimeMillis() - start}ms")
Log.d("Perf", "Total initialization took ${System.currentTimeMillis() - startTime}ms")
}
private fun step1(context: Context) {
// ...
}
private fun step2(context: Context) {
// ...
}
override fun dependencies() = emptyList()
}
/**
* 使用 Perfetto 分析启动时间
*/
class PerfettoTraceInitializer : Initializer<Unit> {
override fun create(context: Context) {
Trace.beginSection("app_startup")
try {
initializeCoreComponents()
} finally {
Trace.endSection()
}
}
private fun initializeCoreComponents() {
// ...
}
override fun dependencies() = emptyList()
}5.2 异步初始化
kotlin
/**
* 异步初始化的 Initializer
*/
class AsyncInitializer : Initializer<Unit> {
private val executor = Executors.newSingleThreadExecutor()
override fun create(context: Context) {
// 立即返回,让耗时操作在后台执行
executor.submit {
performExpensiveInitialization(context)
}
}
private fun performExpensiveInitialization(context: Context) {
// 耗时的初始化逻辑
Thread.sleep(5000) // 模拟耗时操作
}
override fun dependencies() = emptyList()
}
/**
* 使用协程进行异步初始化
*/
class CoroutineInitializer : Initializer<Unit> {
private val coroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
override fun create(context: Context) {
coroutineScope.launch {
// 异步执行耗时操作
val data = withContext(Dispatchers.IO) {
loadHeavyData(context)
}
// 更新主线程 UI
withContext(Dispatchers.Main) {
updateUIWith(data)
}
}
}
override fun dependencies() = emptyList()
}5.3 懒加载模式
kotlin
/**
* 懒加载的 Initializer
*/
class LazyInitializer : Initializer<LazyService> {
private var service: LazyService? = null
override fun create(context: Context): LazyService {
// 只创建服务引用,不实际初始化
service = LazyService.create(context)
return service!!
}
override fun dependencies() = emptyList()
fun getService(): LazyService? = service
}
/**
* 延迟到实际使用时初始化
*/
class LazyService {
private lateinit var internalState: InternalState
companion object {
fun create(context: Context): LazyService {
return LazyService(context)
}
}
private constructor(context: Context) {
// 延迟初始化
}
fun doWork() {
// 第一次调用时才初始化内部状态
if (!this::internalState.isInitialized) {
internalState = InternalState()
}
internalState.process()
}
}5.4 条件初始化
kotlin
/**
* 条件初始化的 Initializer
*/
class ConditionalInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 只在调试模式下初始化
if (BuildConfig.DEBUG) {
initializeDebugFeatures(context)
}
// 只在特定环境下初始化
if (isFeatureEnabled(context)) {
initializeFeature(context)
}
// 只在有网络时初始化
if (hasNetworkConnection(context)) {
initializeNetworkFeature(context)
}
}
private fun isFeatureEnabled(context: Context): Boolean {
return context.getSharedPreferences("settings", Context.MODE_PRIVATE)
.getBoolean("feature_enabled", false)
}
private fun hasNetworkConnection(context: Context): Boolean {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE)
as ConnectivityManager
val networkInfo = connectivityManager.activeNetworkInfo
return networkInfo?.isConnected ?: false
}
override fun dependencies() = emptyList()
}6. 与 Application.onCreate 对比
6.1 传统方式 vs App Startup
kotlin
// ❌ 传统 Application.onCreate 方式
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// 所有初始化代码都堆在这里
initLogger()
initAnalytics()
initCrashReporter()
initNetwork()
initDatabase()
initPushNotification()
initAdSdk()
initDeepLinking()
initBiometric()
initLocation()
// 难以维护,难以测试
}
private fun initLogger() {
// ...
}
// ... 更多私有方法
}
// ✅ App Startup 方式
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// Application 类保持简洁
// 初始化逻辑由各 Initializer 处理
}
}
// 独立的 Initializer
class LoggerInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 初始化日志
}
override fun dependencies() = emptyList()
}
class AnalyticsInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 初始化分析
}
override fun dependencies() = listOf(LoggerInitializer::class)
}6.2 对比总结
| 方面 | Application.onCreate | App Startup |
|---|---|---|
| 代码组织 | 所有代码在一个类 | 分散到多个 Initializer |
| 职责分离 | 差 | 优秀 |
| 测试性 | 困难 | 容易(每个 Initializer 独立) |
| 扩展性 | 需要修改 Application | 只需添加新的 Initializer |
| 依赖管理 | 手动管理 | 自动管理 |
| 性能优化 | 所有同步执行 | 支持异步和延迟 |
| 第三方集成 | 需要手动配置 | 自动注册 |
| 可维护性 | 随功能增加而下降 | 保持良好 |
7. 最佳实践
7.1 Initializer 命名规范
kotlin
// ✅ 推荐:清晰的命名
class AnalyticsInitializer : Initializer<Unit> { /* ... */ }
class DatabaseInitializer : Initializer<Unit> { /* ... */ }
class NetworkClientInitializer : Initializer<Unit> { /* ... */ }
// ❌ 不推荐:模糊的命名
class Init1 : Initializer<Unit> { /* ... */ }
class Setup : Initializer<Unit> { /* ... */ }
class FooInitializer : Initializer<Unit> { /* ... */ }7.2 错误处理
kotlin
/**
* 带错误处理的 Initializer
*/
class SafeInitializer : Initializer<Unit> {
override fun create(context: Context) {
try {
performInitialization(context)
} catch (e: Exception) {
// 记录错误但不崩溃
Log.e("Initializer", "Initialization failed", e)
// 可以选择回退到默认行为
fallbackToDefault(context)
}
}
private fun performInitialization(context: Context) {
// ...
}
private fun fallbackToDefault(context: Context) {
// 回退逻辑
}
override fun dependencies() = emptyList()
}7.3 单元测试
kotlin
/**
* Initializer 的单元测试
*/
class LoggerInitializerTest {
@Test
fun `create initializes logger correctly`() {
// Given
val context = ApplicationProvider.getApplicationContext<Context>()
val initializer = LoggerInitializer()
// When
initializer.create(context)
// Then
// 验证 Logger 已被正确初始化
assertTrue(Logger.isInitialized)
}
@Test
fun `dependencies returns correct list`() {
// Given
val initializer = LoggerInitializer()
// When
val deps = initializer.dependencies()
// Then
assertTrue(deps.isEmpty())
}
}7.4 日志记录
kotlin
/**
* 带日志的 Initializer
*/
class LoggingInitializer : Initializer<Unit> {
companion object {
private const val TAG = "LoggingInitializer"
}
override fun create(context: Context) {
Log.d(TAG, "Starting initialization")
val start = System.currentTimeMillis()
try {
// 初始化逻辑
initialize(context)
Log.d(TAG, "Initialization completed in ${System.currentTimeMillis() - start}ms")
} catch (e: Exception) {
Log.e(TAG, "Initialization failed", e)
throw e
}
}
private fun initialize(context: Context) {
// ...
}
override fun dependencies() = emptyList()
}8. 常见问题
8.1 Initializer 未执行
问题:注册了 Initializer 但没有执行。
kotlin
// ❌ 错误:忘记注册
class UnregisteredInitializer : Initializer<Unit> {
override fun create(context: Context) { /* ... */ }
override fun dependencies() = emptyList()
}
// ✅ 解决:正确注册
// 方式 1:在 META-INF/services 中注册
// 方式 2:在 AndroidManifest.xml 中注册8.2 依赖顺序错误
问题:依赖顺序配置错误导致初始化失败。
kotlin
// ❌ 错误:依赖未声明
class DependsOnNetworkInitializer : Initializer<Unit> {
override fun create(context: Context) {
// 使用 NetworkClient,但没有声明依赖
NetworkClient.makeRequest() // 可能为 null
}
override fun dependencies() = emptyList() // ❌ 忘记添加 NetworkInitializer
}
// ✅ 正确:声明依赖
class ProperInitializer : Initializer<Unit> {
override fun create(context: Context) {
NetworkClient.makeRequest() // 安全使用
}
override fun dependencies() = listOf(NetworkInitializer::class)
}8.3 Context 泄漏
问题:保存了 Activity Context 导致内存泄漏。
kotlin
// ❌ 错误:保存 Activity Context
class LeakInitializer : Initializer<Unit> {
private lateinit var context: Context
override fun create(context: Context) {
this.context = context // ❌ 可能是 Activity Context
}
override fun dependencies() = emptyList()
}
// ✅ 正确:使用 Application Context
class SafeInitializer : Initializer<Unit> {
private lateinit var context: Context
override fun create(context: Context) {
this.context = context.applicationContext // ✅ 使用 Application Context
}
override fun dependencies() = emptyList()
}9. 面试考点
9.1 基础考点
Q1: 什么是 App Startup 库?
参考答案:
App Startup 是 AndroidX 提供的应用初始化库,通过 Initializer 接口提供了一种标准化的方式来管理应用启动时的初始化逻辑。
核心优势:
- 模块化的初始化逻辑
- 自动的依赖管理
- 支持延迟初始化
- 易于测试和维护
Q2: Initializer 接口有哪些方法?
参考答案:
kotlin
interface Initializer<T> {
fun create(context: Context): T // 执行初始化
fun dependencies(): List<Class<out Initializer<*>>> // 返回依赖
}9.2 进阶考点
Q3: App Startup 如何管理依赖顺序?
参考答案:
App Startup 使用拓扑排序(Topological Sort)来处理依赖关系:
- 读取所有 Initializer
- 构建依赖图(DAG)
- 检查循环依赖
- 按依赖顺序执行
Q4: 如何实现延迟初始化?
参考答案:
xml
<meta-data
android:name="com.example.DelayedInitializer"
android:value="androidx.startup" />
<meta-data
android:name="androidx.initializer.eager"
android:value="false" />9.3 高级考点
Q5: App Startup 的性能优化策略?
参考答案:
- 使用延迟初始化减少启动时间
- 异步执行耗时的初始化
- 条件初始化(只在需要时)
- 懒加载模式
- 优化依赖图减少执行路径
附录:完整示例
完整示例:电商应用的初始化和依赖
kotlin
// 1. 日志初始化
class LoggerInitializer : Initializer<Logger> {
private var logger: Logger? = null
override fun create(context: Context): Logger {
logger = Logger.Builder().context(context).build()
return logger!!
}
override fun dependencies() = emptyList()
fun getLogger() = logger
}
// 2. 网络初始化
class NetworkInitializer : Initializer<OkHttpClient> {
override fun create(context: Context): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(LoggerInitializer.getLogger()!!.interceptor())
.build()
}
override fun dependencies() = listOf(LoggerInitializer::class)
}
// 3. 数据库初始化
class DatabaseInitializer : Initializer<RoomDatabase> {
override fun create(context: Context): RoomDatabase {
return Room.databaseBuilder(context, RoomDatabase::class.java, "db").build()
}
override fun dependencies() = listOf(LoggerInitializer::class)
}
// 4. 分析初始化
class AnalyticsInitializer : Initializer<Unit> {
override fun create(context: Context) {
Analytics.init(context, NetworkInitializer.getClient())
}
override fun dependencies() = listOf(LoggerInitializer::class, NetworkInitializer::class)
}
// 5. Repository 初始化
class RepositoryInitializer : Initializer<Unit> {
override fun create(context: Context) {
val db = DatabaseInitializer.getDatabase()
val network = NetworkInitializer.getClient()
RepositoryProvider.init(db, network)
}
override fun dependencies() = listOf(
DatabaseInitializer::class,
NetworkInitializer::class,
AnalyticsInitializer::class
)
}总结
App Startup 库是 Android 现代化开发的重要组成部分:
- 模块化设计:每个 Initializer 独立管理一个初始化逻辑
- 自动依赖管理:无需手动管理初始化顺序
- 性能优化:支持异步、延迟、条件初始化
- 易于测试:每个 Initializer 可以单独测试
- 第三方友好:第三方库可以直接提供 Initializer
掌握 App Startup 可以显著提升应用的可维护性和启动性能!
📚 参考资料
最后更新:2024 年 字数统计:约 10000 字