Android 5.x运行出现java.lang.VerifyError DataBinderMapperImpl类校验失败问题
Android 5.x 出现DataBinderMapperImpl VerifyError的排查方案
核心原因
该错误是Android 5.0/5.1(API 21/22)的ART验证器对DataBinding生成的字节码兼容性不足导致的,你的实现存在以下几个触发问题的点:
- XML中声明了
constantes变量,但在Fragment初始化Binding时没有赋值,导致生成的Binding类存在未初始化的引用 - XML
openPoliticas控件使用了pt作为单位,低版本系统对非标准单位的处理逻辑会导致生成的字节码不符合验证规则 - 直接在XML中写复杂的表达式判断按钮可用状态,以及引用Kotlin顶层非const常量,会导致生成的Binding类使用了低版本不兼容的方法调用逻辑
- 未开启Java 8 desugar兼容,高版本构建工具生成的字节码包含低版本ART不支持的语法
修复步骤
1. 补全Binding变量赋值
修改Fragment中Binding初始化的代码,补上constantes的赋值:
bindingView = DataBindingUtil.inflate<FragmentDataNewjourneyBinding>(inflater, R.layout.fragment_data_newjourney, container, false) .apply { lifecycleOwner = this@AuthenticationFragment viewModel = this@AuthenticationFragment.viewModel // 补上constantes变量赋值 constantes = br.com.gabriel.novajornada.constants.ConstantsKt }
2. 修正XML中的非标准单位
把openPoliticas控件的android:paddingTop="2pt"改为android:paddingTop="2dp",Android布局不要使用印刷单位pt。
3. 优化XML表达式和常量定义
- 把
ConstantsKt中的NAMES_MAX_LENGTH改为const val修饰,编译期直接替换为常量,避免运行期方法调用:// Constants.kt中修改 const val NAMES_MAX_LENGTH = 50 // 替换为你的原有数值 - 把按钮的可用状态判断逻辑移到ViewModel中,不要在XML中写多控件属性判断的复杂表达式:
- 在ViewModel中添加可观察字段
val isFormValid = ObservableBoolean()- 监听三个输入框的内容变化,更新
isFormValid的值 - XML中按钮的enabled属性改为
android:enabled="@{viewModel.isFormValid}"
4. 开启低版本兼容配置
在app模块的build.gradle中添加Java 8兼容和desugar配置:
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' ... }
5. 清理重建项目
执行Clean Project -> Rebuild Project,清除旧的自动生成的Binding类缓存。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

