Tengo muy extraño error, ya que sólo ocurre después de instalar la aplicación desde generada .apk
. Cuando trato de ejecutar la aplicación a través de IDE, que funciona bien.
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)
Como se puede ver que se llama la clase BaseActivity
que tiene este aspecto:
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
}
Ahora, cada actividad se extiende esta clase y, a menudo anula la animationKind
siguiente manera:
class MyActivity: BaseActivity() {
override var animationKind = ANIMATION_SLIDE_FROM_RIGHT
// Some other stuff
}
El problema es que ANIMATION_SLIDE_FROM_RIGHT
es inaccesible para MyActivity
. Voy a repetir que sólo ocurre en generar manualmente .apk
. Lo curioso es que no estoy usando multidex, pero el error parece demostrar que BaseActivity
está en classes3.dex
. Aquí está mi archivo Gradle:
aplicar plugin: 'com.android.application' aplicar plugin: 'Kotlin-android' se aplica plugin: 'Kotlin-android-extensions' aplicar plugin: '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
}
Traté de jugar con multidexEnabled false/true
, pero el único cambio es que en el false
estado del classes3.dex
sufijo desaparece.
ACTUALIZAR
Por supuesto, cuando cambio MyActivity
's animationKind
propiedad para 1
, a continuación, todo funciona bien.
ACTUALIZACIÓN 2
Después de la eliminación @JvmStatic
y la visibilidad protegida funciona bien.
A partir de la documentación oficial Kotlin :
Java permite acceder a los miembros protegidos de otras clases en el mismo paquete y Kotlin no, por lo que las clases de Java tendrá un acceso más amplio al código
Así que, por favor asegúrese de que su BaseActivity
y MyActivity
se encuentran bajo el mismo paquete.
Si ambas actividades no están bajo el mismo paquete a continuación, se ejecuta a la perfección por escorrentía directa del estudio, pero se bloqueará (IllegalAccessError), mientras que se genera apk e intenta ejecutar en el dispositivo mediante la instalación que apk.