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消失了。
更新
当然,当我将MyActivity的animationKind属性更改为时1,一切正常。
更新2
移除@JvmStatic并保护可见性后,它可以正常工作。
Java允许从同一包中的其他类访问受保护的成员,而Kotlin不允许,因此Java类将具有对代码的更广泛访问
因此,请确保您的BaseActivity和MyActivity处于同一软件包中。
如果两个活动都不在同一个程序包中,则可以通过直接从Studio运行来完美地运行它,但是在生成.apk并尝试通过安装该apk在设备上运行时,它将崩溃(IllegalAccessError)。
| 归档时间: |
|
| 查看次数: |
2493 次 |
| 最近记录: |