升级Android Gradle Plugin 3.1.0后Nexus5设备Kotlin反射崩溃问题
我之前碰到过完全一样的情况——升级Android Gradle Plugin到3.1.0后,原本正常的项目在API 19(Android 4.4.x)设备上突然抛出KotlinReflectionNotSupportedError,折腾了一阵才找到根源,给你几个针对性的解决方案:
1. 确保Kotlin反射库与标准库版本完全一致
这是最容易忽略但最关键的一点:kotlin-reflect的版本必须和你项目中kotlin-stdlib的版本完全匹配。AGP升级后如果没同步Kotlin版本,很容易出现版本错位。
比如你的build.gradle里应该这样统一版本:
ext.kotlin_version = "1.3.72" // 换成你实际使用的Kotlin版本 dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" }
2. 调整AGP打包配置,避免反射库资源被丢弃
AGP 3.1.0对旧Android版本的类打包逻辑做了调整,可能导致kotlin-reflect的元数据文件被忽略。在模块级的build.gradle里添加以下配置:
android { // ...其他已有配置 packagingOptions { pickFirst 'META-INF/kotlinx-reflect.kotlin_module' pickFirst 'META-INF/kotlin-stdlib.kotlin_module' } }
这个配置确保打包时优先选择这些元数据文件,避免因重复或缺失导致类加载失败。
3. 更新混淆/代码收缩规则
如果你的项目开启了混淆(ProGuard)或者R8代码收缩,AGP 3.1.0的收缩逻辑可能误删了反射库的必要类。在你的混淆规则文件(比如proguard-rules.pro)里添加:
-keep class kotlin.reflect.** { *; } -keep class kotlin.Metadata { *; } -dontwarn kotlin.reflect.** -dontwarn kotlin.Metadata
这会保留Kotlin反射相关的核心类,防止被混淆或移除。
4. 检查多Dex配置(如果启用了多Dex)
Android 4.4.3默认使用Dalvik虚拟机,多Dex的类加载逻辑更敏感。如果你的项目开启了多Dex,确保kotlin-reflect的类被包含在主Dex中:
在模块级build.gradle里添加:
android { defaultConfig { // ... multiDexEnabled true } } dependencies { implementation 'com.android.support:multidex:1.0.3' // 或对应的AndroidX版本 }
同时,如果你有自定义的主Dex规则文件,要把kotlin.reflect.**添加到主Dex列表中。
为什么升级AGP后才出现这个问题?
AGP 3.1.0引入了一些针对旧版本Android的打包优化,同时调整了类资源的处理逻辑,导致原本能正常加载的kotlin-reflect库在Dalvik虚拟机上无法被正确找到。之前的AGP版本对这些规则的限制更宽松,所以没暴露问题。
内容的提问来源于stack exchange,提问作者Marcin Bak

