1. 程式人生 > >Caused by: android.content.res.Resources$NotFoundException: File res/drawable/***

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/***

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.Resources
NotFoundException: 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.Resources
NotFoundException: 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