Android 拒绝类,因为它未能通过编译时验证

Android 拒绝类,因为它未能通过编译时验证,android,synchronized-block,Android,Synchronized Block,我的一个应用程序在启动时突然失败,并显示以下错误消息: java.lang.VerifyError:拒绝类 com.sample.BufferManagerImpl,因为它失败了 编译时验证(声明 “com.sample.BufferManagerImpl”出现在 /data/app/com.sample.myapp-1/base.apk) 它仅在使用ART虚拟机的设备上出现故障,而在Dalvik上则不出现故障。该问题是由于在try catch块中存在synchronized块造成的,例如: t

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

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


它仅在使用ART虚拟机的设备上出现故障,而在Dalvik上则不出现故障。该问题是由于在
try catch
块中存在
synchronized
块造成的,例如:

try {
    synchronized (mLock) {
        updateState();
    }
} catch (IllegalStateException e) {
}
显然这不是一个好的做法,但只要我像这样改变它,它就会起作用:

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

我在使用安卓5时遇到了这个问题。我的应用程序在4或更低版本上运行正常,但在安卓5设备上我崩溃了

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

 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
。 . . .
.

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

文件->首选项>生成执行->部署->即时运行

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

如果您是使用Jack进行构建,请确保已从build.gradle关闭该功能

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

    jackOptions {
        enabled false
    }
}

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

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。

AOSP问题跟踪器上可能存在的相关问题:这会破坏lambdas。