You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android应用初始化Kotlin类时崩溃:CollectionsKt.first报错

解决Android中Kotlin类初始化崩溃(BuiltInsLoader相关)

我之前处理过好几起类似的崩溃,核心原因大多和Kotlin反射模块与标准库的加载、兼容性或者混淆优化有关。先把你提供的崩溃堆栈整理出来:

完整崩溃调用栈片段:

kotlin.collections.CollectionsKt___CollectionsKt.first (CollectionsKt___CollectionsKt.java:166)
kotlin.reflect.jvm.internal.impl.builtins.BuiltInsLoader$Companion.<init>(BuiltInsLoader.java:38)
kotlin.reflect.jvm.internal.impl.builtins.BuiltInsLoader.<init>(BuiltInsLoader.java)
kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.createB...

下面是针对性的排查和解决方案:

可能的原因及对应修复方法

1. 混淆/R8优化导致必要方法被移除

这种情况最常见——R8或ProGuard会把Kotlin反射和内置库的关键方法/类误删,导致BuiltInsLoader初始化时找不到CollectionsKt.first方法。

修复:
在你的proguard-rules.pro中添加以下规则,保留Kotlin反射和标准库的核心类:

# 保留Kotlin反射内部实现类
-keep class kotlin.reflect.jvm.internal.impl.** { *; }
# 保留Kotlin标准库的集合方法
-keep class kotlin.collections.CollectionsKt___CollectionsKt { *; }
# 避免不必要的警告
-dontwarn kotlin.reflect.jvm.internal.impl.**

如果用的是R8 full mode,还需要确保没有把Kotlin内置库的相关类标记为可移除。

2. Kotlin版本与AGP/依赖不兼容

项目中如果存在Kotlin版本不一致(比如不同模块用了不同版本的kotlin-stdlibkotlin-reflect),或者Kotlin版本和Android Gradle Plugin(AGP)版本不匹配,会导致反射模块和标准库的API不兼容。

修复:

  • 统一项目的Kotlin版本:在根目录的build.gradle(或build.gradle.kts)中定义统一的版本变量,所有模块都引用这个变量:
    buildscript {
        ext {
            kotlin_version = "1.9.20" // 选择和AGP兼容的版本,比如AGP 8.1+对应Kotlin 1.9.x
        }
    }
    
  • 检查依赖冲突:执行./gradlew app:dependencies(替换app为你的模块名),查看是否有不同版本的kotlin-reflectkotlin-stdlib,通过exclude排除冲突的旧版本。

3. 类加载顺序异常

如果你的应用使用了自定义类加载器,或者在ApplicationattachBaseContext阶段就初始化了依赖Kotlin反射的类,可能会导致Kotlin标准库的类还没加载完成,BuiltInsLoader初始化时调用first方法就会崩溃。

修复:

  • 延迟初始化:把依赖Kotlin反射的类初始化逻辑移到Application.onCreate()方法之后,确保所有核心库都已加载。
  • 自定义类加载器调整:如果用了自定义类加载器,确保优先加载Kotlin标准库的kotlin.collectionskotlin.reflect相关类。

4. Gradle缓存问题

有时候旧的缓存会导致类加载异常,清理缓存后重新构建就能解决。

修复:
执行以下命令清理Gradle缓存并重新构建:

./gradlew clean build --refresh-dependencies

内容的提问来源于stack exchange,提问作者Prem

火山引擎 最新活动