IllegalAccessError:类无法访问方法

Nom*_*sta 3 java android jvm kotlin android-gradle-plugin

我有一个非常奇怪的错误,因为它仅在从generate安装应用程序之后发生.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)
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个名为的类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
}
Run Code Online (Sandbox Code Playgroud)

现在,每个活动都扩展了该类,并经常覆盖animationKind如下内容:

class MyActivity: BaseActivity() {

    override var animationKind = ANIMATION_SLIDE_FROM_RIGHT

    // Some other stuff
}
Run Code Online (Sandbox Code Playgroud)

问题是,ANIMATION_SLIDE_FROM_RIGHT是无法访问MyActivity。我将重复一遍,它仅在手动生成时发生.apk。有趣的是,我没有使用multidex,但是错误似乎表明BaseActivityin 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
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用multidexEnabled false/true,但是唯一的变化是后缀false状态classes3.dex消失了。

更新

当然,当我将MyActivityanimationKind属性更改为时1,一切正常。

更新2

移除@JvmStatic并保护可见性后,它可以正常工作。

Vin*_*hod 6

Kotlin官方文档中

Java允许从同一包中的其他类访问受保护的成员,而Kotlin不允许,因此Java类将具有对代码的更广泛访问

因此,请确保您的BaseActivityMyActivity处于同一软件包中。

如果两个活动都不在同一个程序包中,则可以通过直接从Studio运行来完美地运行它,但是在生成.apk并尝试通过安装该apk在设备上运行时,它将崩溃(IllegalAccessError)。