溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android報錯Didn‘t?find?class?“android.view.x“問題如何解決

發(fā)布時間:2023-03-28 14:33:12 來源:億速云 閱讀:250 作者:iii 欄目:開發(fā)技術

這篇文章主要講解了“Android報錯Didn‘t find class “android.view.x“問題如何解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Android報錯Didn‘t find class “android.view.x“問題如何解決”吧!

    前言

    App在debug包時沒有問題,但是在release包時就是crash,報錯如下:

    Android報錯Didn‘t?find?class?“android.view.x“問題如何解決

    可以看到問題是Didn‘t find class “android.view.x“,但是實際上我們代碼中并沒有這個類,由于是release包的問題,所以第一時間想到的是混淆問題,檢查了一番后發(fā)現與混淆無關,經過上網查詢發(fā)現有人提到說將build.gradle中的shrinkResources設置為false即可解決,經過嘗試發(fā)現確實解決了問題,但是為什么呢?

    shrinkResources

    要弄明白問題,首先就要知道shrinkResources是如何工作的。

    當我們啟用了資源壓縮(Resource Shrinking),當打包是會去檢查每個資源是否被引用,如果沒有被引用,則會進行優(yōu)化,但是它有兩種模式Safe和Strict。

    Safe

    在這種模式下,除了直接引用,使用動態(tài)代碼引用的資源(比如使用Resources.getIdentifier()引用資源)也會被保留,這樣就不會造成太大的問題。

    Strict

    在嚴苛模式下,只有直接引用的資源被保留,其他資源就會被壓縮。注意這里是壓縮而不是刪除,具體表現就是如果是圖片,則保留該圖片文件,但是內容則為空,如下:

    Android報錯Didn‘t?find?class?“android.view.x“問題如何解決

    可以看到處理過的圖片都是67b大小,且沒有內容,這樣大大減少了空間。

    而如果是xml文件,則內容同樣為空,如下:

    Android報錯Didn‘t?find?class?“android.view.x“問題如何解決

    可以看到內容變成了,大小都是47b,也是極大的減少了空間。

    android.view.x

    這樣我們就知道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()動態(tài)引用的,在release包中查看這個布局發(fā)現已經是空的了,所以就會報上面的錯誤。

    所以當我們將shrinkResources設置為false后,因為不會執(zhí)行資源壓縮,所以問題解決。

    自定義保留

    但是在默認情況下資源壓縮(Resource Shrinking)的模式是Safe,不應該出現這樣的問題,那么說明我們沒有從根本上解決問題,我們繼續(xù)來看。

    怎么可以改變資源壓縮(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庫中的,經過一個個篩查發(fā)現如下

    Android報錯Didn‘t?find?class?“android.view.x“問題如何解決

    聯想到我們剛剛升級了該庫,所以一定是這個庫開發(fā)者在新版本加入了這個東西,但是它影響很大,只能說相當的不負責任了。

    感謝各位的閱讀,以上就是“Android報錯Didn‘t find class “android.view.x“問題如何解決”的內容了,經過本文的學習后,相信大家對Android報錯Didn‘t find class “android.view.x“問題如何解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI