您好,登錄后才能下訂單哦!
這篇文章主要講解了“Android報錯Didn‘t find class “android.view.x“問題如何解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Android報錯Didn‘t find class “android.view.x“問題如何解決”吧!
App在debug包時沒有問題,但是在release包時就是crash,報錯如下:
可以看到問題是Didn‘t find class “android.view.x“,但是實際上我們代碼中并沒有這個類,由于是release包的問題,所以第一時間想到的是混淆問題,檢查了一番后發現與混淆無關,經過上網查詢發現有人提到說將build.gradle中的shrinkResources設置為false即可解決,經過嘗試發現確實解決了問題,但是為什么呢?
要弄明白問題,首先就要知道shrinkResources是如何工作的。
當我們啟用了資源壓縮(Resource Shrinking),當打包是會去檢查每個資源是否被引用,如果沒有被引用,則會進行優化,但是它有兩種模式Safe和Strict。
在這種模式下,除了直接引用,使用動態代碼引用的資源(比如使用Resources.getIdentifier()
引用資源)也會被保留,這樣就不會造成太大的問題。
在嚴苛模式下,只有直接引用的資源被保留,其他資源就會被壓縮。注意這里是壓縮而不是刪除,具體表現就是如果是圖片,則保留該圖片文件,但是內容則為空,如下:
可以看到處理過的圖片都是67b大小,且沒有內容,這樣大大減少了空間。
而如果是xml文件,則內容同樣為空,如下:
可以看到內容變成了,大小都是47b,也是極大的減少了空間。
這樣我們就知道Didn‘t find class “android.view.x“問題所在了,一定是我們使用的布局被壓縮了,根據crash日志找到NavigateActivity的onCreate方法,這里有如下代碼:
mLayoutId = ResourceUtils.getLayoutId(this, "activity_main"); ... View rootView = View.inflate(this, mLayoutId, null); ... setContentView(rootView);
這個activity_main正是通過Resources.getIdentifier()
動態引用的,在release包中查看這個布局發現已經是空的了,所以就會報上面的錯誤。
所以當我們將shrinkResources設置為false后,因為不會執行資源壓縮,所以問題解決。
但是在默認情況下資源壓縮(Resource Shrinking)的模式是Safe,不應該出現這樣的問題,那么說明我們沒有從根本上解決問題,我們繼續來看。
怎么可以改變資源壓縮(Resource Shrinking)的模式,答案是配置自定義保留文件,在res/raw下新建一個keep.xml文件,在其中就可以設置自定義保留策略,一個示例代碼如下:
<?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:表示對文件做嚴格檢查,逗號分隔
keep:表示保留文件,逗號分隔
shrinkMode:則可以設置資源壓縮(Resource Shrinking)的模式,包括strict和safe兩種
所以我們知道通過keep.xml可以改變資源壓縮(Resource Shrinking)的模式,但是我們并沒有這個文件,這時候想到是不是某些三方庫在搞鬼,檢查apk包我們在res/raw下果然看到一個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庫中的,經過一個個篩查發現如下
聯想到我們剛剛升級了該庫,所以一定是這個庫開發者在新版本加入了這個東西,但是它影響很大,只能說相當的不負責任了。
感謝各位的閱讀,以上就是“Android報錯Didn‘t find class “android.view.x“問題如何解決”的內容了,經過本文的學習后,相信大家對Android報錯Didn‘t find class “android.view.x“問題如何解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。