我遇到了一个非常奇怪的错误,因为它只会在安装了从生成的.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”时,一切都正常工作。
第二次更新:
删除“@JvmStatic”和受保护可见性后,它可以正常工作。
@JvmStatic
,因为“在超类伴侣中保护非 JVM 静态成员的使用尚不受支持。” 当然,我可以改为 public,但它并没有告诉我问题出在哪里。 - Nominalista@JvmStatic
更改为@JvmField
会有所帮助吗? - yole@JvmStatic
可以被编译。 - Nominalista