You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:39:12