代码之家  ›  专栏  ›  技术社区  ›  Nominalista

IllegalAccessError:类无法访问方法

  •  3
  • Nominalista  · 技术社区  · 6 年前

    我有一个非常奇怪的错误,因为它只在从generated安装app之后发生。 .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,但是错误似乎表明 基本活动 是在 classes3.dex . 这是我的毕业档案:

    应用插件:“com.android.application” 应用插件:“Kotlin Android” 应用插件:“Kotlin Android扩展” 应用插件:“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 陈述 等级3.DEX 后缀消失。

    更新

    当然,当我换衣服的时候 肌肉活动 动画类型 属性到 1 然后一切正常。

    更新2

    去除后 @JvmStatic 保护好的能见度,效果很好。

    3 回复  |  直到 6 年前
        1
  •  6
  •   Adinia Nirmal Dhara    6 年前

    来自 official Kotlin documentation :

    Java允许访问其他类中的受保护成员 包和Kotlin没有,因此Java类将具有更广泛的访问权限。 对代码

    所以,请确保 BaseActivity MyActivity 在同一个包裹下。

    如果这两个活动不在同一个包下,那么它将通过直接从Studio运行完美运行,但在生成.apk时它将崩溃(illegalaccesserror),并尝试通过安装该apk在设备上运行。

        2
  •  0
  •   EpicPandaForce Jigar Joshi    6 年前

    虽然我不确定这会导致IllegalAccessError的原因,但您应该这样定义这些常量:

    companion object {
        const val ANIMATION_DEFAULT = 0
        const val ANIMATION_SLIDE_FROM_RIGHT = 1
        const val ANIMATION_SLIDE_FROM_BOTTOM = 2
    }
    

    这应该解决你的问题,否则用 @JvmField 而不是 @JvmStatic 会是更好的选择。

        3
  •  0
  •   azizbekian    6 年前

    确保已声明内部失败的方法 同一模块 作为呼叫码。

    在我的案例中,我遇到了以下错误:

    java.lang.IllegalAccessError: Method 'boolean[] my.package.common.kotlin.AndroidExtensionsKt.$jacocoInit()' is inaccessible to class 'my.package.ui.first.FirstActivity$viewModel$2' (declaration of 'my.package.ui.first.FirstActivity$viewModel$2' appears in /data/app/my.package.dev-fdHNodmdXHv-b_heK4MXeA==/base.apk!classes8.dex)
        at my.package.ui.first.FirstActivity$viewModel$2.invoke(FirstActivity.kt:18)
        at my.package.ui.first.FirstActivity$viewModel$2.invoke(FirstActivity.kt:14)
        at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)
        at my.package.ui.first.FirstActivity.getViewModel(Unknown Source:11)
        at my.package.ui.first.FirstActivity.onCreate(FirstActivity.kt:23)
    

    在哪里? getViewModel() 已在中声明 common 模块和 FirstActivity 已在中声明 app 模块:

    inline fun <reified T : ViewModel> FragmentActivity.getViewModel(
        factory: ViewModelProvider.Factory = ViewModelProvider.NewInstanceFactory()
    ) = ViewModelProviders.of(this, factory).get(T::class.java)
    

    移动后 获取视图模型() 常见的 模块到 应用程序 模块未发现问题。