Caused by: android.content.res.Resources$NotFoundException: File res/drawable/*
1、log显示
01-01 09:04:12.245 D/AndroidRuntime( 2938): Shutting down VM
01-01 09:04:12.255 E/AndroidRuntime( 2938): FATAL EXCEPTION: main
01-01 09:04:12.255 E/AndroidRuntime( 2938): Process: com.android.contacts, PID: 2938
01-01 09:04:12.255 E/AndroidRuntime( 2938): java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=1, result=-1, data=Intent { (has extras) }} to activity {com.android.contacts/com.android.contacts.activities.CompactContactEditorActivity}: android.content.res.Resources$NotFoundException: Drawable com.android.contacts:drawable/ic_message_24dp with resource ID #0x7f02004b
“““““`
01-01 09:04:12.255 E/AndroidRuntime( 2938): Caused by: android.content.res.ResourcesNotFoundException: Drawable com.android.contacts:drawable/ic_message_24dp with resource ID #0x7f02004b
01-01 09:04:12.255 E/AndroidRuntime( 2938): Caused by: android.content.res.ResourcesNotFoundException: File res/drawable/ic_message_24dp.xml from drawable resource ID #0x7f02004b
“““““`
01-01 09:04:12.255 E/AndroidRuntime( 2938): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: requires a valid ‘src’ attribute
01-01 09:04:12.259 I/am_crash( 2143): [2938,0,com.android.contacts,818462277,org.xmlpull.v1.XmlPullParserException,Binary XML file line #17: requires a valid ‘src’ attribute,BitmapDrawable.java,771]
01-01 09:04:12.262 W/ActivityManager( 2143): Force finishing activity com.android.contacts/.activities.CompactContactEditorActivity
01-01 09:04:12.262 I/am_finish_activity( 2143): [0,76646553,23,com.android.contacts/.activities.CompactContactEditorActivity,force-crash]
01-01 09:04:12.267 I/wm_task_moved( 2143): [23,1,0]
01-01 09:04:12.273 I/am_focused_activity( 2143): [0,com.android.contacts/.activities.PeopleActivity,finishActivity adjustFocus]
2、log分析
01-01 09:04:12.255 E/AndroidRuntime( 2938): Caused by: android.content.res.ResourcesNotFoundException: Drawable com.android.contacts:drawable/ic_message_24dp with resource ID #0x7f02004b
01-01 09:04:12.255 E/AndroidRuntime( 2938): Caused by: android.content.res.ResourcesNotFoundException: File res/drawable/ic_message_24dp.xml from drawable resource ID #0x7f02004b
01-01 09:04:12.255 E/AndroidRuntime( 2938): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: requires a valid ‘src’ attribute
这个是app Contact 的代码抛出的NotFoundException异常。
主要原因是:在drawable下的一个xml文件中引用的bitmap对象无效导致资源找不到。
应该可能是相关的drawable文件夾下没有图片资源,还有可能在编码时不小把图片的命名和drawable下xml文件的名字相同了。
android可以区分xml和png文件,关键是在某些情况下:比如公司之前的产品都是hdpi的产品,而最近的项目是小屏的ldpi的,在配置board的时候,直接从原有的board上fork过来了一个board,而PRODUCT_AAPT_CONFIG 依然是hdpi,这就导致编译出来的apk,资源都是只hdpi的。当应用在运行时加载ldpi的资源时,找不到,于是就找附件高分辨率的资源。
假若资源的名字和xml文件相同,这些刚好把drawable目录下的ic_capture_video.xml当成了ic_captrue_video.png(都是drawable/ic_capture_video)所以引用了个无效的bitmap源。假若没有,那就也会抛出找不到资源的NotFoundException异常。
解决思路:
1)、添加相关资源图到APP的drawable 不同类型大小屏幕的文件夹。
2)、不要让资源和文件夹的名字重复。
3)、board配置事实求实,根据dip配置PRODUCT_AAPT_CONFIG
./build/core/product_config.mk
Add PRODUCT_LOCALES to PRODUCT_AAPT_CONFIG
PRODUCT_AAPT_CONFIG := (strip(PRODUCTS.(INTERNALPRODUCT).PRODUCTAAPTCONFIG))PRODUCTAAPTCONFIG:=(PRODUCT_LOCALES) (PRODUCTAAPTCONFIG)PRODUCTAAPTPREFCONFIG:=(strip (PRODUCTS.(INTERNAL_PRODUCT).PRODUCT_AAPT_PREF_CONFIG))
# Default to medium-density assets.
# (Can be overridden in the device config, e.g.: PRODUCT_AAPT_CONFIG += hdpi)
PRODUCT_AAPT_CONFIG := (strip (PRODUCT_AAPT_CONFIG) \
(if(filter %dpi,(PRODUCTAAPTCONFIG)),,mdpi))PRODUCTAAPTPREFCONFIG:=(strip $(PRODUCT_AAPT_PREF_CONFIG))
# Everyone gets nodpi assets which are density-independent.
PRODUCT_AAPT_CONFIG += nodpi
# Convert spaces to commas.
comma := ,
PRODUCT_AAPT_CONFIG := \
(subst(space),(comma),(strip $(PRODUCT_AAPT_CONFIG)))
加入配置
PRODUCT_AAPT_CONFIG := mdpi xlarge hdpi xhdpi large
PRODUCT_AAPT_PREF_CONFIG := mdpi
PRODUCT_AAPT_CONFIG = xxxx 对于资源选择的匹配规则?
原则上来说,优先使用符合设备dpi的资源,其次是dpi较低的高dpi资源,再次是dpi较高的高dpi资源,最后采用nodpi的资源,由此,根据设备自身的dpi的不同,不同dpi资源的优先级是有差异的(忽略mdpi&hdpi):
设备dpi 优先级顺序(由高到低)
tvdpi tvdpi>hdpi>xhdpi>xxhdpi>mdpi>default>ldpi>nodpi
hdpi hdpi>tvdpi>xhdpi>xxhdpi>>mdpi>default>ldpi>nodpi
xhdpi xhdpi>xxhdpi>hdpi>tvdpi>mdpi>default>ldpi>nodpi
xxhdpi xxhdpi>xhdpi>hdpi>tvdpi>mdpi>default>ldpi>nodpi