liangjingkanji / BRV

[使用文档] Android 快速构建 RecyclerView, 比 BRVAH 更简单强大
http://liangjingkanji.github.io/BRV/
MIT License
2.49k stars 317 forks source link

开启混淆后,调用getBinding去反射时会崩溃 #386

Closed aikorola closed 10 months ago

aikorola commented 11 months ago

问题描述

开启混淆后,调用getBinding去反射时会崩溃

期望结果

如何复现

调用getBinding时报错

when (itemViewType) {
    R.layout.item_album -> {
        getBinding<ItemAlbumBinding>().apply {
            ...
        }
    }

   ...
}

希望快速解决请Fork仓库复现问题并附上链接, 否则只能等有空才能排查 凭空猜测只会让问题晦涩难懂, 浪费本项目可持续维护时间

截图

异常堆栈信息或者手机截图/视频(拖拽到输入框即可上传)

2023-08-08 19:38:10.744 13866-13866/com.example.ggee E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.ggee, PID: 13866
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:603)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1094)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1094) 
     Caused by: java.lang.NoSuchMethodException: com.example.ggee.databinding.ItemAlbumBinding.bind [class android.view.View]
        at java.lang.Class.getMethod(Class.java:2072)
        at java.lang.Class.getMethod(Class.java:1693)
        at com.example.ggee.view.aspx.AlbumActivity$initView$1$2.invoke(AlbumActivity.kt:1142)
        at com.example.ggee.view.aspx.AlbumActivity$initView$1$2.invoke(AlbumActivity.kt:51)
        at com.drake.brv.BindingAdapter$BindingViewHolder.bind$brv_release(BindingAdapter.kt:1122)
        at com.drake.brv.BindingAdapter.onBindViewHolder(BindingAdapter.kt:174)
        at com.drake.brv.BindingAdapter.onBindViewHolder(BindingAdapter.kt:78)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7254)
        at com.drake.brv.BindingAdapter.onBindViewHolder(BindingAdapter.kt:185)
        at com.drake.brv.BindingAdapter.onBindViewHolder(BindingAdapter.kt:78)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7337)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6194)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6460)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330)
        at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:572)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
        at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
        at com.drake.brv.layoutmanager.HoverGridLayoutManager.onLayoutChildren(HoverGridLayoutManager.java:198)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4012)
        at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578)
        at android.view.View.layout(View.java:23172)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1873)
        at android.view.View.layout(View.java:23172)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
        at android.view.View.layout(View.java:23172)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
        at android.view.View.layout(View.java:23172)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
        at android.view.View.layout(View.java:23172)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
        at android.view.View.layout(View.java:23172)
2023-08-08 19:38:10.744 13866-13866/com.example.ggee E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:795)
        at android.view.View.layout(View.java:23172)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3516)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2988)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1993)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8240)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
        at android.view.Choreographer.doCallbacks(Choreographer.java:796)
        at android.view.Choreographer.doFrame(Choreographer.java:731)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7815)
            ... 3 more

版本

aikorola commented 11 months ago

-keep class implements androidx.viewbinding.ViewBinding {;}

在混淆规则中保留了ViewBinding后解决了

liangjingkanji commented 11 months ago

开启混淆, 你运行sample项目打开ViewBindingFragment界面会崩溃吗?

aikorola commented 11 months ago

@liangjingkanji 没试过运行项目

liangjingkanji commented 11 months ago

那麻烦你运行下吧, 我看混淆好像并不影响调用bind()

sample写的这么好你们都不带运行的, 不会看都没看过吧

ViewBinding封装使用反射是必须的, 并且存在缓存, 不会影响列表性能

liangjingkanji commented 10 months ago

无法复现问题, 此问题关闭

liangjingkanji commented 10 months ago

疑似AGP8开启的android.enableR8.fullMode模式导致, 但我无法复现

Duplicate of liangjingkanji/Net#201