LGE Android8.1设备Drawable资源存在仍报Resources$NotFoundException错误
根因判定
你遇到的报错确实大概率由图片尺寸过大导致。
Android系统加载Drawable资源时会对图片执行解码操作,不同厂商、不同系统版本的单图片解码内存阈值存在差异,LGE Android 8.1这类老设备的阈值通常更低。你当前默认drawable目录下的red_logo.png尺寸为4864×2692,按系统默认ARGB_8888配置解码后占用内存约为52MB,远超出普通老设备的单图内存限制,解码失败后系统就会抛出资源未找到的异常,哪怕全密度目录下都存在对应资源文件。
另外默认drawable目录的密度匹配规则等价于mdpi,你在该目录下放和xxxhdpi同尺寸的资源也不合理:当设备为低/中密度时,系统会优先从默认drawable目录取资源再按密度缩放,会进一步放大图片尺寸,加重内存负担,也是触发崩溃的核心诱因之一。
解决方案
- 压缩全密度目录下的logo资源:你布局中ImageView的高度仅为100dp,完全不需要4864×2692的超大尺寸,按各密度的标准像素要求裁剪即可:
- ldpi:高度75px
- mdpi:高度100px
- hdpi:高度150px
- xhdpi:高度200px
- xxhdpi:高度300px
- xxxhdpi:高度400px
- 修正默认drawable目录资源:默认drawable目录下仅存放mdpi对应尺寸的资源即可,不要放置xxxhdpi尺寸的资源,避免低密设备缩放时内存溢出。
- 可选优化:如果必须保留高清源文件,可改用Glide、Coil等图片加载框架加载drawable资源,这类框架会自动根据ImageView的尺寸采样压缩图片,避免全尺寸解码导致的内存溢出,参考代码:
ImageView logoIv = findViewById(R.id.logoImageView); Glide.with(this).load(R.drawable.red_logo).into(logoIv);
- 快速验证方案:可先将默认drawable目录下的red_logo.png替换为极小尺寸的测试图,重新打包运行看是否还会崩溃,快速确认问题根因。
内容的提问来源于stack exchange,提问作者Zhang Zhan
相关产品推荐
相关产品推荐

