【发布时间】:2025-11-22 10:10:01
【问题描述】:
我有一个非常奇怪的错误,因为它仅在从生成的.apk 安装应用程序后发生。当我尝试通过 IDE 运行应用程序时,它运行良好。
java.lang.IllegalAccessError: Method 'int <package>.BaseActivity$Companion.getANIMATION_SLIDE_FROM_RIGHT()' is inaccessible to class '<package>.MyActivity' (declaration of '<package>.MyActivity' appears in /data/app/<package>-mg7eYmJ8hX5WvkNWNZWMVg==/base.apk!classes3.dex)
如您所见,有一个名为 BaseActivity 的类,如下所示:
open class BaseActivity : AppCompatActivity() {
companion object {
@JvmStatic
protected val ANIMATION_DEFAULT = 0
@JvmStatic
protected val ANIMATION_SLIDE_FROM_RIGHT = 1
@JvmStatic
protected val ANIMATION_SLIDE_FROM_BOTTOM = 2
}
protected open var animationKind = ANIMATION_DEFAULT
// Some other stuff
}
现在每个活动都扩展了这个类,并且经常像这样覆盖animationKind:
class MyActivity: BaseActivity() {
override var animationKind = ANIMATION_SLIDE_FROM_RIGHT
// Some other stuff
}
问题是ANIMATION_SLIDE_FROM_RIGHT 无法访问MyActivity。我要重复一遍,它只发生在手动生成的.apk 上。有趣的是我没有使用multidex,但错误似乎表明BaseActivity 在classes3.dex 中。这是我的 gradle 文件:
应用插件:'com.android.application' 应用插件:'kotlin-android' 应用插件:'kotlin-android-extensions' 应用插件:'kotlin-kapt'
android {
compileSdkVersion 28
defaultConfig {
applicationId <package>
versionCode <versionCode>
versionName <versionName>
minSdkVersion 21
targetSdkVersion 28
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
androidExtensions {
experimental = true
}
}
dependencies {
// Dependencies
}
我尝试使用multidexEnabled false/true,但唯一的变化是false 状态下classes3.dex 后缀消失了。
更新
当然,当我将MyActivity 的animationKind 属性更改为1 时,一切正常。
更新 2
删除@JvmStatic 并保护可见性后,它工作正常。
【问题讨论】:
-
@VinayRathod 感谢您的链接。不幸的是,IDE 建议我使用
@JvmStatic,因为“尚不支持在超类伴侣中使用受保护的非 JVM 静态成员。”。我当然可以改成public,但它并不能告诉我有什么问题。 -
把
@JvmStatic改成@JvmField有帮助吗? -
@yole 不幸的是只有
@JvmStatic编译。 -
@Nominalista,请清理并重建它为我工作。
标签: java android kotlin android-gradle-plugin jvm