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

詳解dex優(yōu)化對Arouter查找路徑的影響

 更新時間:2021年06月18日 10:43:28   作者:vivo互聯(lián)網(wǎng)技術(shù)  
dex簡單說就是優(yōu)化后的android版.exe。每個apk安裝包里都有。相對于PC上的java虛擬機能運行.class,android上的Davlik虛擬機能運行.dex。本文將著重介紹dex優(yōu)化對Arouter查找路徑的影響

一、前言

疑問:dex文件是什么?dex文件優(yōu)化又是什么?

dex文件優(yōu)化會給項目帶來什么問題,怎么解決這些問題?

1.1 APK的編譯和打包流程

1、通過aapt打包資源文件res,對應生成R.java、resources.arsc和res文件(二進制&非二進制保持原來的代碼)

2、處理aidl文件,生成java接口文件(沒有aidl則忽略)

3、通過java compile編譯R.java、java接口文件,生成對應.class文件(java compiler)

4、運用dex命令,將.class文件和第三方sdk庫中的.class文件轉(zhuǎn)換成classes.dex文件

5、通過apkbuilder將aapt生成的CompiledResources和其他資源文件以及classes.dex文件打包生成apk

6、同樣的,可以使用Jarsigner工具,對上面的apk進行debug或者release簽名

apk的編譯和打包流程圖如下:

實際項目開發(fā)中,5、6兩個步驟,可以借助jenkins平臺直接生成release包即可滿足需求。

1.2 dex文件的應用場景

再來看看dex文件常用的場景,比較流行的有:APK 的瘦身、熱修復、插件化、應用加固、Android 逆向工程、64 K 方法數(shù)限制。

拿方法數(shù)限制舉例,在上面的第4步,將class文件轉(zhuǎn)換成dex文件,默認只會生成一個dex文件,單個dex文件中的方法數(shù)不能超過65536,不然編譯會報錯,但是我們在開發(fā)App時肯定會集成一堆庫,方法數(shù)一般都是超過65536的,解決這個問題的辦法就是:一個dex裝不下,用多個dex來裝,gradle增加一行配置:multiDexEnabled true。

dex文件的應用場景網(wǎng)上介紹的很多,本文不做介紹。而是對項目中實際遇到的問題進行剖析,從而對dex優(yōu)化有進一步的理解。

二、dex到vdex、odex

2.1 ART預優(yōu)化

ART(Android runtime)是什么,它是虛擬機,運營java代碼、APP用的。參考Android發(fā)展史,Android 5.0把ART作為默認的虛擬機,而不是Android4.4及之前使用的DVM(Dalvik VM)了。

回顧一下DVM和ART和Android的關(guān)系,我們先來了解運行Java的幾種虛擬機的工作機制:(1)JVM:JVM虛擬機運行的是java字節(jié)碼。Java文件到JVM的過程是:java -> java bytecode(class) -> java bytecode(jar)

DVM:DVM虛擬機解析執(zhí)行的dex字節(jié)碼。Java文件到DVM的過程是:java -> java bytecode(class) -> dalvik bytecode(dex)

ART:ART虛擬機執(zhí)行本地機器碼。Java文件到ART的過程是:java -> java bytecode(class) -> dalvik bytecode(dex) -> optimized android runtime machine code(oat)

可以看到,DVM到ART的演變,實際上是java文件到虛擬機的執(zhí)行代碼的過渡,相對而言,ART多了oat的過程,ART使用AOT(Ahead-Of-Time)編譯,在應用第一次安裝的時候,字節(jié)碼預編譯成機器碼存在本地,DVM是使用JIT(Just-In-Time)編譯,在應用每次運行的時候,字節(jié)碼都需要通過編譯器即時轉(zhuǎn)換為機器碼才能繼續(xù)執(zhí)行。ART相對于DVM,省去了每次解析字節(jié)碼的過程,所以運行時占用的內(nèi)存會減少,提升應用的運行效率。

2.2 ART的運行方式

ART在Android5.0時代,號稱使用AOT即可讓系統(tǒng)運行在512M的機器上。從 Android 7.0(簡稱 N)開始,ART結(jié)合 AOT、即時(JIT)編譯和配置文件引導型編譯。

這幾種模式可以組合配置,以谷歌的Pixel 設備舉例,配置了以下編譯流程:

1)最初安裝應用時不進行任何 AOT 編譯。應用前幾次運行時,系統(tǒng)會對其進行解譯,并對經(jīng)常執(zhí)行的方法進行 JIT 編譯。

2)當設備閑置和充電時,編譯守護進程會運行,以便根據(jù)在應用前幾次運行期間生成的配置文件對常用代碼進行 AOT 編譯。

下一次重新啟動應用時將會使用配置文件引導型代碼,并避免在運行時對已經(jīng)編譯過的方法進行 JIT 編譯。在應用后續(xù)運行期間進行了 JIT 編譯的方法將會被添加到配置文件中,然后編譯守護進程將會對這些方法進行 AOT 編譯。

ART 包括一個編譯器(dex2oat 工具)和一個為啟動 Zygote 而加載的運行時(libart.so)。dex2oat 工具接受一個 APK 文件,并生成一個或多個編譯文件,然后運行時將會加載這些文件。文件的個數(shù)、擴展名和名稱會因版本而異,但在 Android O 版本中,將會生成以下文件:

vdex:其中包含 APK 的未壓縮 DEX 代碼,另外還有一些旨在加快驗證速度的元數(shù)據(jù)。

odex:其中包含 APK 中經(jīng)過 AOT 編譯的方法代碼。

art (optional):其中包含 APK 中列出的某些字符串和類的 ART 內(nèi)部表示,用于加快應用啟動速度。

2.3 vdex、odex的作用

解壓一個APK(以廠商的系統(tǒng)應用包舉例)的包,可以看到下面的結(jié)構(gòu),不含有任何dex文件

再看下這個應用在手機中的目錄結(jié)構(gòu),vdex、odex文件包含apk的所有代碼,正常也會包含classes.dex文件。由于vdex、odex是機器碼,沒辦法直接轉(zhuǎn)成可以查看的二級制碼查看(也可能是我使用的工具不對)。

2.4 vdex、odex與classes.dex關(guān)系

可能是系統(tǒng)編譯的bug,也可能是生成了ART文件之后,對odex、vdex文件做了二次處理,現(xiàn)象是這樣的,嘗試獲取odex中的dex文件,提示不含有dex文件。

為了再次確認odex里面是否真的含有dex文件,使用010Editor再次確認,可以看到recent Files下面仍然是沒有dex文件的。

嘗試獲取vdex中的dex文件,也是無法獲取的。

所以說,odex(或者vdex)中含有classes.dex的說法是不正確的。

三、Arouter是什么

阿里的一個路由組件,功能很多,我這邊的實際使用場景是進行頁面跳轉(zhuǎn)。具體功能可以參考阿里峰會上對arouter的介紹。

借鑒峰會中提到的一點作為鋪墊,也是我們下面將要講述的一點?!白詈笙敕窒淼木褪茿Router的未來開發(fā)計劃。未來ARouter會支持插件化并且支持生成映射關(guān)系文檔,因為插件化是現(xiàn)在很多大型APP中會使用的技術(shù)方案,很多的Dex和功能是動態(tài)地下發(fā)到APP中的,而在這種情況下,是無法找到所有的Dex文件的,也就是對于沒有加載過的Dex而言,里面的映射關(guān)系是跳轉(zhuǎn)不過去的,所以一旦Dex文件位置發(fā)生變動,常規(guī)的方案是無法找到Dex的,也不能實現(xiàn)映射文件初始化,這一部分會在后面的版本中進行支持”。

阿里可以識別的arouter路徑如下:

換句話說,arouter可能因為dex文件的位置變化或者路徑變化,而無法找到。

四、踩坑

4.1 現(xiàn)象

2.4中提到了odex文件中不含有dex,而arouter查找路徑遵循分組按需加載的規(guī)則,歸結(jié)到底,實際上就是對class文件的查找,如下圖:

而class文件的信息記錄在dex文件中,所以出現(xiàn)了異常,使用arouter進行頁面跳轉(zhuǎn)的時候,出現(xiàn)classNotFound exception。

4.2 解決方案

想要找到解決方案,就要知道怎么樣讓odex對arouter路徑不產(chǎn)生影響,這方面,可能在沒有相關(guān)經(jīng)驗的時候,很難找到解決方案,只能一點點查找。通過搜索ART的工作原理,找到文章《配置ART》,其中文章提到:

也就是說通過配置LOCAL_DEX_PREOPT的屬性,可以防止odex優(yōu)化,于是找到Android.mk中設置該屬性的地方進行設置LOCAL_DEX_PREOPT := nostripping。

既在編譯的時候做dex優(yōu)化(生成odex文件),又不從apk里剝離dex。于是有了下面的apk生成之后的路徑對比,再看下dex不被剝離的路徑,下面含有了classes.dex文件。

使用jadx打開這個classes.dex文件,發(fā)現(xiàn)arouter的路徑文件就在這里,所以arouter的跳轉(zhuǎn)正常了,異常不再出現(xiàn)。

五、總結(jié)

odex優(yōu)化這種系統(tǒng)做的事情,往往會出現(xiàn)一些意想不到的結(jié)果,如果你負責廠商的應用,經(jīng)常需要內(nèi)置項目,這時候要注意了,當你的應用中含有第三方框架的時候,要注意路徑、資源的引用都是沒問題的,雖然正常情況下,odex文件不會對你的路徑產(chǎn)生干擾,但是也難免odex出現(xiàn)失誤,因為對于odex來說,里面的資源無需保存,生成art文件能夠運行即可。合理使用art的配置,可以幫助解決很多問題。

以上就是詳解dex優(yōu)化對Arouter查找路徑的影響的詳細內(nèi)容,更多關(guān)于dex優(yōu)化 Arouter的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • android教程之intent的action屬性使用示例(intent發(fā)短信)

    android教程之intent的action屬性使用示例(intent發(fā)短信)

    這篇文章主要介紹了android中intent的action屬性使用示例,提供了使用intent撥打電話、發(fā)送短信、播放mp3的代碼
    2014-01-01
  • 詳解 Android中Libgdx使用ShapeRenderer自定義Actor解決無法接收到Touch事件的問題

    詳解 Android中Libgdx使用ShapeRenderer自定義Actor解決無法接收到Touch事件的問題

    這篇文章主要介紹了詳解 Android中Libgdx使用ShapeRenderer自定義Actor解決無法接收到Touch事件的問題的相關(guān)資料,希望通過本文能幫助到大家解決這樣的問題,需要的朋友可以參考下
    2017-09-09
  • Android中二維碼的掃描和生成(使用zxing庫)

    Android中二維碼的掃描和生成(使用zxing庫)

    ZXing是一個開放源碼的,用Java實現(xiàn)的多種格式的1D/2D條碼圖像處理庫,它包含了聯(lián)系到其他語言的端口,下面這篇文章主要給大家介紹了關(guān)于Android中二維碼掃描和生成的相關(guān)資料,主要使用的zxing庫,需要的朋友可以參考下
    2022-09-09
  • 如何更改Dialog的標題與按鈕顏色詳解

    如何更改Dialog的標題與按鈕顏色詳解

    這篇文章主要給大家介紹了關(guān)于如何更改Dialog的標題與按鈕顏色的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考借鑒,下面跟著小編來一起學習學習吧。
    2017-08-08
  • 簡析Android多種AlertDialog對話框效果

    簡析Android多種AlertDialog對話框效果

    這篇文章主要為大家介紹了Android多種AlertDialog對話框效果,四種對話框效果一一為大家展示,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Android TabLayout實現(xiàn)京東詳情效果

    Android TabLayout實現(xiàn)京東詳情效果

    這篇文章主要為大家詳細介紹了android TabLayout實現(xiàn)京東詳情效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android?Navigation重建Fragment問題分析及解決

    Android?Navigation重建Fragment問題分析及解決

    這篇文章主要介紹了Android?Navigation重建Fragment問題分析及解決,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Android自定義柱狀圖表的方法實例

    Android自定義柱狀圖表的方法實例

    柱狀圖是我們在日常開發(fā)中經(jīng)常會用到的一種圖表,下面這篇文章主要給大家介紹了關(guān)于Android如何自定義柱狀圖表的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2018-05-05
  • Android開發(fā)筆記之: 數(shù)據(jù)存儲方式詳解

    Android開發(fā)筆記之: 數(shù)據(jù)存儲方式詳解

    本篇文章是對Android中數(shù)據(jù)存儲方式進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Android仿淘寶商品瀏覽界面圖片滾動效果

    Android仿淘寶商品瀏覽界面圖片滾動效果

    這篇文章主要為大家詳細介紹了Android仿淘寶商品瀏覽界面圖片滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03

最新評論

肃北| 兴化市| 黎城县| 青海省| 龙岩市| 康马县| 松原市| 丰台区| 剑川县| 会理县| 青州市| 西城区| 修文县| 岱山县| 隆林| 梁河县| 濉溪县| 铜川市| 巧家县| 德化县| 瑞丽市| 新宁县| 固原市| 吴川市| 莎车县| 卓资县| 建德市| 岐山县| 藁城市| 乌拉特后旗| 睢宁县| 崇阳县| 商城县| 红安县| 武冈市| 永丰县| 旬邑县| 贵港市| 曲松县| 巫山县| 安阳市|