Android App调试正常,打包安装崩溃求助(FirebaseRecyclerAdapter报错)
解决FirebaseRecyclerAdapter打包APK后崩溃的问题
我之前也碰到过一模一样的情况——USB调试运行完全正常,打包成release APK安装就崩溃,报错就是这个NoSuchMethodException: <init> [class android.view.View],核心原因是代码混淆搞的鬼!
问题根源
调试模式下(debug build)默认是关闭代码混淆的,但release打包时会开启混淆(一般build.gradle里minifyEnabled true)。混淆器会重命名类、压缩未被引用的代码,而FirebaseRecyclerAdapter需要通过反射找到你的ViewHolder类的public View构造方法,混淆后这个构造方法要么被重命名,要么被误删,就导致找不到了。
解决方案
1. 添加混淆规则到proguard-rules.pro
打开你的项目根目录(或模块目录)下的proguard-rules.pro,添加以下规则:
# 保留FirebaseUI相关类不被混淆 -keep class com.firebase.ui.** { *; } # 保留RecyclerView ViewHolder的public构造方法(适配support库) -keepclassmembers class * extends android.support.v7.widget.RecyclerView.ViewHolder { public <init>(android.view.View); } # 如果你的项目用了AndroidX,替换上面的support规则为这个 -keepclassmembers class * extends androidx.recyclerview.widget.RecyclerView.ViewHolder { public <init>(android.view.View); }
2. 检查你的ViewHolder类
确保你的自定义ViewHolder的构造方法是public权限,并且参数是View类型,比如:
public class MyCustomViewHolder extends RecyclerView.ViewHolder { // 必须是public,参数是View public MyCustomViewHolder(View itemView) { super(itemView); // 这里初始化你的控件 } }
3. 如果你用了Data Binding
如果项目里用了Data Binding,还要额外添加规则保留Binding类:
-keep class **.*Binding { *; }
验证方法
修改完混淆规则后,重新打包release APK安装测试,应该就能正常运行了。如果还是有问题,可以先把build.gradle里release的minifyEnabled改成false,打包测试如果正常,那肯定还是混淆规则没加对。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

