Android報(bào)錯(cuò)Didn‘t?find?class?“android.view.x“問(wèn)題解決原理剖析
前言
今天同事提到了一個(gè)問(wèn)題,我們的一款A(yù)pp在debug包時(shí)沒(méi)有問(wèn)題,但是在release包時(shí)就是crash,報(bào)錯(cuò)如下:

可以看到問(wèn)題是Didn‘t find class “android.view.x“,但是實(shí)際上我們代碼中并沒(méi)有這個(gè)類,由于是release包的問(wèn)題,所以第一時(shí)間想到的是混淆問(wèn)題,檢查了一番后發(fā)現(xiàn)與混淆無(wú)關(guān),經(jīng)過(guò)上網(wǎng)查詢發(fā)現(xiàn)有人提到說(shuō)將build.gradle中的shrinkResources設(shè)置為false即可解決,經(jīng)過(guò)嘗試發(fā)現(xiàn)確實(shí)解決了問(wèn)題,但是為什么呢?
shrinkResources
要弄明白問(wèn)題,首先就要知道shrinkResources是如何工作的。
當(dāng)我們啟用了資源壓縮(Resource Shrinking),當(dāng)打包是會(huì)去檢查每個(gè)資源是否被引用,如果沒(méi)有被引用,則會(huì)進(jìn)行優(yōu)化,但是它有兩種模式Safe和Strict。
Safe
在這種模式下,除了直接引用,使用動(dòng)態(tài)代碼引用的資源(比如使用Resources.getIdentifier()引用資源)也會(huì)被保留,這樣就不會(huì)造成太大的問(wèn)題。
Strict
在嚴(yán)苛模式下,只有直接引用的資源被保留,其他資源就會(huì)被壓縮。注意這里是壓縮而不是刪除,具體表現(xiàn)就是如果是圖片,則保留該圖片文件,但是內(nèi)容則為空,如下:

可以看到處理過(guò)的圖片都是67b大小,且沒(méi)有內(nèi)容,這樣大大減少了空間。
而如果是xml文件,則內(nèi)容同樣為空,如下:

可以看到內(nèi)容變成了,大小都是47b,也是極大的減少了空間。
android.view.x
這樣我們就知道Didn‘t find class “android.view.x“問(wèn)題所在了,一定是我們使用的布局被壓縮了,根據(jù)crash日志找到NavigateActivity的onCreate方法,這里有如下代碼:
mLayoutId = ResourceUtils.getLayoutId(this, "activity_main"); ... View rootView = View.inflate(this, mLayoutId, null); ... setContentView(rootView);
這個(gè)activity_main正是通過(guò)Resources.getIdentifier()動(dòng)態(tài)引用的,在release包中查看這個(gè)布局發(fā)現(xiàn)已經(jīng)是空的了,所以就會(huì)報(bào)上面的錯(cuò)誤。
所以當(dāng)我們將shrinkResources設(shè)置為false后,因?yàn)椴粫?huì)執(zhí)行資源壓縮,所以問(wèn)題解決。
自定義保留
但是在默認(rèn)情況下資源壓縮(Resource Shrinking)的模式是Safe,不應(yīng)該出現(xiàn)這樣的問(wèn)題,那么說(shuō)明我們沒(méi)有從根本上解決問(wèn)題,我們繼續(xù)來(lái)看。
怎么可以改變資源壓縮(Resource Shrinking)的模式,答案是配置自定義保留文件,在res/raw下新建一個(gè)keep.xml文件,在其中就可以設(shè)置自定義保留策略,一個(gè)示例代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:discard="@color/selector_tint_color"
tools:keep="@layout/activity_test1,@layout/activity_test2"
tools:shrinkMode="strict"/>
其中:
- discard:表示對(duì)文件做嚴(yán)格檢查,逗號(hào)分隔
- keep:表示保留文件,逗號(hào)分隔
- shrinkMode:則可以設(shè)置資源壓縮(Resource Shrinking)的模式,包括strict和safe兩種
所以我們知道通過(guò)keep.xml可以改變資源壓縮(Resource Shrinking)的模式,但是我們并沒(méi)有這個(gè)文件,這時(shí)候想到是不是某些三方庫(kù)在搞鬼,檢查apk包我們?cè)趓es/raw下果然看到一個(gè)keep.xml文件,如下:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/hms_download_progress,@drawable/screen_off"
tools:shrinkMode="strict"
/>
明顯是華為hms庫(kù)中的,經(jīng)過(guò)一個(gè)個(gè)篩查發(fā)現(xiàn)如下

聯(lián)想到我們剛剛升級(jí)了該庫(kù),所以一定是這個(gè)庫(kù)開發(fā)者在新版本加入了這個(gè)東西,但是它影響很大,只能說(shuō)相當(dāng)?shù)牟回?fù)責(zé)任了。
總結(jié)
通過(guò)上面的剖析,我們了解了資源壓縮(Resource Shrinking)到底是什么,同時(shí)也知道問(wèn)題所在,所以其實(shí)我們可以不將shrinkResources設(shè)置為false,而是在項(xiàng)目中新建一個(gè)keep.xml文件,將shrinkMode改回safe就好,當(dāng)然也可以在keep中添加出錯(cuò)的文件,但是這樣只解決這一個(gè)問(wèn)題,不保證后續(xù)沒(méi)有其他動(dòng)態(tài)引用,所以最好就是將模式改回safe即可。
最后大家在升級(jí)三方庫(kù)后一定要仔細(xì)測(cè)試,以防被坑!
以上就是Android報(bào)錯(cuò)Didn‘t find class “android.view.x“問(wèn)題解決原理剖析的詳細(xì)內(nèi)容,更多關(guān)于Android報(bào)錯(cuò)解決剖析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android手機(jī)衛(wèi)士之確認(rèn)密碼對(duì)話框
這篇文章主要為大家詳細(xì)介紹了Android手機(jī)衛(wèi)士之確認(rèn)密碼對(duì)話框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android SpringAnimation彈性動(dòng)畫解析
這篇文章主要為大家詳細(xì)介紹了Android SpringAnimation彈性動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android開發(fā)自定義實(shí)時(shí)圖表控件實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Android自定義實(shí)時(shí)圖表控件實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android性能調(diào)優(yōu)利器StrictMode應(yīng)用分析
StrictMode意思為嚴(yán)格模式,是用來(lái)檢測(cè)程序中違例情況的開發(fā)者工具。最常用的場(chǎng)景就是檢測(cè)主線程中本地磁盤和網(wǎng)絡(luò)讀寫等耗時(shí)的操作。這篇文章給大家介紹Android性能調(diào)優(yōu)利器StrictMode應(yīng)用分析,感興趣的朋友一起看看吧2018-01-01
Android listview動(dòng)態(tài)加載列表項(xiàng)實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android listview動(dòng)態(tài)加載列表項(xiàng)實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
Android nativePollOnce函數(shù)解析
這篇文章主要介紹了Android nativePollOnce函數(shù)解析的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03
AndroidStudio修改Code Style來(lái)格式化自定義標(biāo)簽的xml文件方式
這篇文章主要介紹了AndroidStudio修改Code Style來(lái)格式化自定義標(biāo)簽的xml文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

