android开发分享AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databinding.DataBinderMapper.getDataBinder(androidx.databindi

混淆导致的数据绑定库错误 问题摘要 AbstractMethodError: abstract method “androidx.databinding.ViewDataBinding androidx.databinding.DataBinderMapper.getDataBinder(andro …


混淆导致的数据绑定库错误

问题摘要

abstractmethoderror: abstract method "androidx.databinding.viewdatabinding androidx.databinding.databindermapper.getdatabinder(androidx.databinding.databindingcomponent, android.view.view, int)"

堆栈如下:

java.lang.abstractmethoderror: abstract method "androidx.databinding.viewdatabinding androidx.databinding.databindermapper.getdatabinder(androidx.databinding.databindingcomponent, android.view.view, int)"         at androidx.databinding.mergeddatabindermapper.getdatabinder(mergeddatabindermapper.java:74)         at androidx.databinding.databindingutil.bind(databindingutil.java:199)         at androidx.databinding.databindingutil.inflate(databindingutil.java:130)         at androidx.databinding.databindingutil.inflate(databindingutil.java:95)         at cn.sintoon.common.adapter.sinrecyclerviewbaseadapter.oncreateviewholder(unknown source:11)         at cn.sintoon.common.adapter.sinrecyclerviewbaseadapter.oncreateviewholder(unknown source:0)         at androidx.recyclerview.widget.recyclerview$adapter.createviewholder(recyclerview.java:6794)         at androidx.recyclerview.widget.recyclerview$recycler.trygetviewholderforpositionbydeadline(recyclerview.java:5975)         at androidx.recyclerview.widget.recyclerview$recycler.getviewforposition(recyclerview.java:5858)         at androidx.recyclerview.widget.recyclerview$recycler.getviewforposition(recyclerview.java:5854)         at androidx.recyclerview.widget.linearlayoutmanager$layoutstate.next(linearlayoutmanager.java:2230)         at androidx.recyclerview.widget.linearlayoutmanager.layoutchunk(linearlayoutmanager.java:1557)         at androidx.recyclerview.widget.linearlayoutmanager.fill(linearlayoutmanager.java:1517)         at androidx.recyclerview.widget.linearlayoutmanager.onlayoutchildren(linearlayoutmanager.java:612)         at androidx.recyclerview.widget.recyclerview.dispatchlayoutstep2(recyclerview.java:3924)         at androidx.recyclerview.widget.recyclerview.onmeasure(recyclerview.java:3336)         at android.view.view.measure(view.java:23454)         at androidx.constraintlayout.widget.constraintlayout.internalmeasurechildren(constraintlayout.java:1227)         at androidx.constraintlayout.widget.constraintlayout.onmeasure(constraintlayout.java:1572)         at android.view.view.measure(view.java:23454)         at android.view.viewgroup.measurechildwithmargins(viewgroup.java:6834)         at android.widget.framelayout.onmeasure(framelayout.java:185)         at androidx.appcompat.widget.contentframelayout.onmeasure(contentframelayout.java:143)         at android.view.view.measure(view.java:23454)         at android.view.viewgroup.measurechildwithmargins(viewgroup.java:6834)         at androidx.appcompat.widget.actionbaroverlaylayout.onmeasure(actionbaroverlaylayout.java:403)         at android.view.view.measure(view.java:23454)         at android.view.viewgroup.measurechildwithmargins(viewgroup.java:6834)         at android.widget.framelayout.onmeasure(framelayout.java:185)         at android.view.view.measure(view.java:23454)         at android.view.viewgroup.measurechildwithmargins(viewgroup.java:6834)         at android.widget.linearlayout.measurechildbeforelayout(linearlayout.java:1565)         at android.widget.linearlayout.measurevertical(linearlayout.java:847)         at android.widget.linearlayout.onmeasure(linearlayout.java:726)         at android.view.view.measure(view.java:23454)         at android.view.viewgroup.measurechildwithmargins(viewgroup.java:6834)         at android.widget.framelayout.onmeasure(framelayout.java:185)         at com.android.internal.policy.decorview.onmeasure(decorview.java:847)         at android.view.view.measure(view.java:23454)         at android.view.viewrootimpl.performmeasure(viewrootimpl.java:2954)         at android.view.viewrootimpl.measurehierarchy(viewrootimpl.java:1753)         at android.view.viewrootimpl.performtraversals(viewrootimpl.java:2041)         at android.view.viewrootimpl.dotraversal(viewrootimpl.java:1636)         at android.view.viewrootimpl$traversalrunnable.run(viewrootimpl.java:7946)         at android.view.choreographer$callbackrecord.run(choreographer.java:1092)         at android.view.choreographer.docallbacks(choreographer.java:893)         at android.view.choreographer.doframe(choreographer.java:812)         at android.view.choreographer$framedisplayeventreceiver.run(choreographer.java:1078)         at android.os.handler.handlecallback(handler.java:907)

出现场景

封装了一个类库,向外提供一个封装好的 recycleradapter,使用 databinding 。生成类库时开启了混淆,在使用时,抛出异常。

问题原因

androidx.databinding.databindingcomponent 混淆掉了。

如何修复

修改混淆规则。不混淆这个类。

-keep class androidx.databinding.databindingcomponent {*;}

排查过程

根据错误堆栈看,是找不到这个方法,初步怀疑就是被混淆掉了方法,然后直接使用不混淆的测试,的确没有异常了。确认是混淆的问题。

然后在 /build/outputs/mapping/ 目录下查看 mapping.txt 文件,发现果然是将这类混淆掉了。

# compiler: r8 # compiler_version: 1.4.77 # min_api: 1 androidx.databinding.databindingcomponent -> a.a.a:

mapping.txt 这个文件提供混淆前后类、方法、类成员等的对照表。

总结

在基础类库中使用了数据绑定库要配置混淆规则。

参考 proguard 混淆规则

www.ctvol.com true Article android开发分享AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databinding.DataBinderMapper.getDataBinder(androidx.databindi

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/addevelopment/900093.html

(0)
上一篇 2021年10月23日 下午8:13
下一篇 2021年10月23日 下午8:14

精彩推荐