部分设备出现ResourcesNotFoundException崩溃求助:缺失design_ic_visibility资源
design_ic_visibility on Pixel 1 & Nexus 5X 问题背景
你碰到的这个崩溃很典型:你的应用在Pixel 1和Nexus 5X这类旧设备上触发ResourcesNotFoundException,指向的资源是design_ic_visibility——这个图标是Material Components库自带的密码切换图标,你的项目里没有直接引入,但依赖库本该包含它。从调用栈能看出来,崩溃发生在PasswordToggleEndIconDelegate.initialize()过程中,也就是TextInputLayout初始化密码切换图标的时候。
即时解决方案
下面几个方案可以快速解决这个问题,你可以根据项目情况选择:
手动补全缺失的资源
直接把Material库中的design_ic_visibility和design_ic_visibility_off图标(涵盖mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi所有分辨率版本)复制到你项目对应的res/drawable-*目录下。这样系统会优先加载你本地的资源,绕开依赖库中资源加载失败的问题。自定义密码切换图标
在布局文件里给TextInputLayout指定自定义的end图标,替换默认的Material图标:<com.google.android.material.textfield.TextInputLayout android:id="@+id/password_input_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:endIconDrawable="@drawable/your_custom_visibility_icon" app:endIconMode="password_toggle"> <com.google.android.material.textfield.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword"/> </com.google.android.material.textfield.TextInputLayout>记得自定义图标要覆盖所有分辨率文件夹,适配旧设备的资源加载逻辑。
降级Material Components库版本
如果你用的是较新的Material库版本,试着降级到更稳定的旧版(比如1.4.0),部分新版本的资源打包逻辑可能在旧设备上有兼容性问题。修改build.gradle中的依赖:implementation 'com.google.android.material:material:1.4.0'同步项目后再测试旧设备是否还会崩溃。
后续建议
既然你已经把问题提交到Google Issue Tracker,后续可以跟进官方的修复进度,但上面的方案能帮你先解决当前的线上崩溃问题。需要注意的是,降级库版本可能会限制一些新功能,所以优先考虑前两个方案。
内容的提问来源于stack exchange,提问作者Rainmaker

