最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android報(bào)錯(cuò)Didn‘t?find?class?“android.view.x“問題解決原理剖析

 更新時(shí)間:2023年03月28日 11:26:06   作者:BennuCTech  
這篇文章主要為大家介紹了Android報(bào)錯(cuò)Didn‘t?find?class?“android.view.x“問題解決及原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

今天同事提到了一個(gè)問題,我們的一款A(yù)pp在debug包時(shí)沒有問題,但是在release包時(shí)就是crash,報(bào)錯(cuò)如下:

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

shrinkResources

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

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

Safe

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

Strict

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

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

而如果是xml文件,則內(nèi)容同樣為空,如下:

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

android.view.x

這樣我們就知道Didn‘t find class “android.view.x“問題所在了,一定是我們使用的布局被壓縮了,根據(jù)crash日志找到NavigateActivity的onCreate方法,這里有如下代碼:

mLayoutId = ResourceUtils.getLayoutId(this, "activity_main");
...
View rootView = View.inflate(this, mLayoutId, null);
...
setContentView(rootView);

這個(gè)activity_main正是通過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í)行資源壓縮,所以問題解決。

自定義保留

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

怎么可以改變資源壓縮(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兩種

所以我們知道通過keep.xml可以改變資源壓縮(Resource Shrinking)的模式,但是我們并沒有這個(gè)文件,這時(shí)候想到是不是某些三方庫在搞鬼,檢查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庫中的,經(jīng)過一個(gè)個(gè)篩查發(fā)現(xiàn)如下

聯(lián)想到我們剛剛升級(jí)了該庫,所以一定是這個(gè)庫開發(fā)者在新版本加入了這個(gè)東西,但是它影響很大,只能說相當(dāng)?shù)牟回?fù)責(zé)任了。

總結(jié)

通過上面的剖析,我們了解了資源壓縮(Resource Shrinking)到底是什么,同時(shí)也知道問題所在,所以其實(shí)我們可以不將shrinkResources設(shè)置為false,而是在項(xiàng)目中新建一個(gè)keep.xml文件,將shrinkMode改回safe就好,當(dāng)然也可以在keep中添加出錯(cuò)的文件,但是這樣只解決這一個(gè)問題,不保證后續(xù)沒有其他動(dòng)態(tài)引用,所以最好就是將模式改回safe即可。

最后大家在升級(jí)三方庫后一定要仔細(xì)測(cè)試,以防被坑!

以上就是Android報(bào)錯(cuò)Didn‘t find class “android.view.x“問題解決原理剖析的詳細(xì)內(nèi)容,更多關(guān)于Android報(bào)錯(cuò)解決剖析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android Fragment實(shí)現(xiàn)底部通知欄

    Android Fragment實(shí)現(xiàn)底部通知欄

    這篇文章主要為大家詳細(xì)介紹了Android Fragment實(shí)現(xiàn)底部通知欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • android ocr——身份證識(shí)別的功能實(shí)現(xiàn)

    android ocr——身份證識(shí)別的功能實(shí)現(xiàn)

    本篇文章主要介紹了android ocr——身份證識(shí)別的功能實(shí)現(xiàn),具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11
  • Android  兩個(gè)Fragment之間的跳轉(zhuǎn)和數(shù)據(jù)的傳遞實(shí)例詳解

    Android 兩個(gè)Fragment之間的跳轉(zhuǎn)和數(shù)據(jù)的傳遞實(shí)例詳解

    這篇文章主要介紹了Android 兩個(gè)Fragment之間的跳轉(zhuǎn)和數(shù)據(jù)的傳遞實(shí)例詳解的相關(guān)資料,這里說明實(shí)現(xiàn)的思路及實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-07-07
  • Kotlin標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法應(yīng)用詳解

    Kotlin標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法應(yīng)用詳解

    Kotlin中的標(biāo)準(zhǔn)函數(shù)指的是Standard.kt文件中定義的函數(shù),任何Kotlin代碼都可以自由地調(diào)用所有的標(biāo)準(zhǔn)函數(shù)。例如let這個(gè)標(biāo)準(zhǔn)函數(shù),他的主要作用就是配合?.操作符來進(jìn)行輔助判空處理
    2022-12-12
  • AndroidStudio4.1 自定義模板的使用方法

    AndroidStudio4.1 自定義模板的使用方法

    這篇文章主要介紹了AndroidStudio4.1 自定義模板的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Android編程之殺毒的實(shí)現(xiàn)原理及具體實(shí)例

    Android編程之殺毒的實(shí)現(xiàn)原理及具體實(shí)例

    這篇文章主要介紹了Android編程之殺毒的實(shí)現(xiàn)原理及具體實(shí)例,結(jié)合實(shí)例形式分析了Android殺毒功能的原理與簡(jiǎn)單實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-12-12
  • Android實(shí)現(xiàn)生成二維碼并保存到相冊(cè)

    Android實(shí)現(xiàn)生成二維碼并保存到相冊(cè)

    這篇文章主要介紹了如何利用Android實(shí)現(xiàn)二維碼的生成,并且保存到本地相冊(cè)。文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編學(xué)習(xí)一下
    2022-04-04
  • Android發(fā)生ANR后的信息采集過程

    Android發(fā)生ANR后的信息采集過程

    這篇文章主要為大家介紹了Android發(fā)生ANR后的信息采集過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Android控件之TabHost用法實(shí)例分析

    Android控件之TabHost用法實(shí)例分析

    這篇文章主要介紹了Android控件之TabHost用法,以完整實(shí)例形式較為詳細(xì)的分析了TabHost控件實(shí)現(xiàn)選項(xiàng)卡的相關(guān)技巧,需要的朋友可以參考下
    2015-09-09
  • Android中PopupMenu組件的使用實(shí)例

    Android中PopupMenu組件的使用實(shí)例

    本篇文章主要介紹了Android中PopupMenu組件的使用實(shí)例,詳細(xì)的介紹了PopupMenu組件的使用,具體一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07

最新評(píng)論

道孚县| 迁安市| 华蓥市| 沛县| 白水县| 来安县| 临澧县| 乌拉特中旗| 高淳县| 清徐县| 浦东新区| 开原市| 宜宾市| 北流市| 溧水县| 商洛市| 柳州市| 荔浦县| 南开区| 合山市| 葫芦岛市| 惠安县| 顺平县| 仁化县| 乌拉特后旗| 城固县| 襄樊市| 永吉县| 新安县| 清徐县| 常山县| 龙川县| 洱源县| 讷河市| 惠东县| 黔西| 澄迈县| 天峻县| 高安市| 高雄市| 太仓市|