因为编译时验证Android失败而拒绝类

时间:2015-05-26 09:52:01

标签: android synchronized-block

我的一个应用程序在启动时突然失败,并显示以下错误消息:

  

java.lang.VerifyError:拒绝类   com.sample.BufferManagerImpl因为失败了   编译时验证(声明   出现'com.sample.BufferManagerImpl'   /data/app/com.sample.myapp-1/base.apk)

它仅在使用ART虚拟机的设备上失败,但在Dalvik上没有失败

5 个答案:

答案 0 :(得分:8)

问题是由于synchronized块中有try-catch块,例如:

try {
    synchronized (mLock) {
        updateState();
    }
} catch (IllegalStateException e) {
}

显然这不是一个好习惯,但是一旦我改变它就会起作用:

synchronized(mLock) {
    try {
        updateState();
    } catch (IllegalStateException e) {
    }
}

答案 1 :(得分:3)

在android studio 2.1中,即时运行会导致此问题,只需在关闭即时运行功能后运行。

档案 - >偏好>构建执行 - >部署 - >即时运行

禁用第一个复选框:    启用即时运行热插拔.....

答案 2 :(得分:1)

如果您使用Jack构建,请确保它已从build.gradle

关闭
defaultConfig {
    ...
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    jackOptions {
        enabled false
    }
}

答案 3 :(得分:1)

由于在Android InstrumentationTest中使用Mockito,也可能发生此错误。如果错误出现在模拟对象上,则必须将此行添加到gradle-file:

androidTestCompile "com.crittercism.dexmaker:dexmaker:1.4"
androidTestCompile "com.crittercism.dexmaker:dexmaker-dx:1.4"
androidTestCompile "com.crittercism.dexmaker:dexmaker-mockito:1.4"

这适用于Mockito 1.10.15和1.10.19。

答案 4 :(得分:0)

我有 android 5 这个问题。我的应用程序在4或以下正确,但在Android 5设备上我崩溃了。

我用多个Threads打破了我的代码并修复了它。 如果您的代码想要更改用户界面,请使用处理程序

 Thread Thread = new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            handler.post(new Runnable() {

                @Override
                public void run() {
                    use this if your codes will change the Ui

。 。 。 。