API 19以下启动应用崩溃:Resources$NotFoundException等异常求助
解决API 19以下版本因矢量Drawable崩溃的问题
嘿,这个问题我之前帮不少开发者搞定过,虽然你说主布局里没有ImageView,但崩溃的根源肯定是你的应用里用到了ic_bluetooth.xml这个矢量Drawable,而Android 4.4(API19)及以下系统原生不支持直接引用矢量图——哪怕是在菜单栏、ActionBar图标或者某个子布局里的引用,都会触发这个Resources$NotFoundException。
下面是两种靠谱的解决办法,你可以根据自己的项目情况选:
办法一:用AppCompat库做兼容(推荐)
这是最省事的方案,利用AndroidX的AppCompat库让低版本系统支持矢量Drawable:
- 首先确保你的Activity继承自
AppCompatActivity(别用原生的Activity),并且App主题继承自Theme.AppCompat系列(比如Theme.AppCompat.Light.NoActionBar) - 打开模块级的
build.gradle文件,在defaultConfig里添加矢量兼容配置:
android { defaultConfig { // 启用矢量Drawable的支持库兼容 vectorDrawables.useSupportLibrary = true } }
- 所有引用矢量图的地方,替换成兼容的引用方式:
- 如果是ImageView,把
android:src="@drawable/ic_bluetooth"改成app:srcCompat="@drawable/ic_bluetooth" - 如果是菜单栏的MenuItem,在菜单xml里用
app:icon代替android:icon,示例:<item android:id="@+id/action_bluetooth" android:title="@string/action_bluetooth" app:icon="@drawable/ic_bluetooth" app:showAsAction="ifRoom"/>
- 如果是ImageView,把
办法二:生成低版本兼容的PNG图片
如果你不想依赖AppCompat库,可以给矢量图生成对应的PNG位图,让低版本系统加载位图资源:
- 右键点击
res/drawable/ic_bluetooth.xml文件,选择New > Vector Asset - 在弹出的窗口里,勾选Generate PNG选项,然后选择需要生成的dpi规格(hdpi、mdpi、xhdpi等)
- 生成的PNG图片会自动放到对应的
drawable-hdpi、drawable-mdpi等目录下,低版本系统会优先加载这些PNG资源,避免找不到矢量图的问题
额外排查小提示
- 检查是否有自定义View或者代码里直接加载了这个矢量图,如果有的话,改用
AppCompatResources.getDrawable(context, R.drawable.ic_bluetooth)来获取Drawable,而不是原生的getResources().getDrawable() - 确认你的
AndroidManifest.xml里,Activity的theme没有用原生的Theme.Holo系列,必须用AppCompat的主题才能让兼容生效
内容的提问来源于stack exchange,提问作者mohamed ebraheem
相关产品推荐
相关产品推荐

