使用Instant Run运行Kotlin项目时出现IllegalAccessError异常求助
解决Instant Run引发的java.lang.IllegalAccessError问题
我之前也碰到过这个问题,本质是旧版Android Studio的Instant Run机制和Kotlin的字节码生成逻辑不兼容——尤其是当你使用带默认参数的数据类时,Instant Run生成的临时dex文件里的类无法正常访问Kotlin内部的DefaultConstructorMarker标记类,就会抛出这个权限错误。下面给你几个可行的解决方案,按优先级排序:
1. 临时禁用Instant Run(最快见效)
这是最直接的临时解决办法,适合紧急调试的时候用:
- 打开Android Studio,依次进入 File → Settings → Build, Execution, Deployment → Instant Run
- 取消勾选「Enable Instant Run to hot swap code/resource changes on deploy」选项
- 点击OK后,clean项目(菜单栏选Build → Clean Project),再重新运行
缺点是失去了Instant Run的热重载便利,但能彻底规避这个兼容性问题。
2. 升级工具链版本(长期根治)
你的Android Studio 3.0.1、Gradle 4.1和Kotlin 1.2.10都是比较旧的版本,后续官方修复了很多Kotlin和Instant Run的兼容问题,建议升级到更稳定的版本:
修改根目录build.gradle:
buildscript { ext.kotlin_version = '1.3.72' // 选择和Gradle插件兼容的Kotlin版本 repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' // 升级到3.2.x稳定版 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } }
修改模块build.gradle的依赖:
确保Kotlin依赖对应新版本:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
升级后clean项目再重新构建,新版本的工具链对Kotlin的字节码处理更完善,能从根源解决这个问题。
3. 调整代码写法(不用改工具版本的临时适配)
如果暂时不想升级工具,可以通过调整代码绕过这个问题:
问题出在使用默认参数的Person构造函数和listOf的初始化组合,你可以显式指定所有参数,或者换一种集合初始化方式:
// 显式传入null作为age参数,避免触发默认参数的字节码逻辑 val persons: List<Person> = listOf(Person("Person1", null), Person("Person2", 27)) // 或者换用mutableListOf+apply的方式初始化 val persons = mutableListOf<Person>().apply { add(Person("Person1", null)) add(Person("Person2", 27)) }
这样能避免Instant Run对Kotlin默认参数生成的特殊字节码的错误处理,临时解决报错。
内容的提问来源于stack exchange,提问作者alla
相关产品推荐
相关产品推荐

