日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

当我们在谈论multidex65535时,我们在谈论什么

發(fā)布時(shí)間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 当我们在谈论multidex65535时,我们在谈论什么 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文來(lái)自網(wǎng)易云社區(qū)


作者:鄭文


首先我們并不在討論車牌號(hào).本文盡量避免談?wù)撝貜?fù)的技術(shù)點(diǎn),只探討一下multidex提供給我們的技術(shù)啟示。

原理

multidex技術(shù)原理可以分成兩個(gè)部分:

  • 在app啟動(dòng)時(shí),通過(guò)Multidex.install api,擴(kuò)展ClassLoader的dexElements數(shù)組來(lái)存儲(chǔ)所有dex,這個(gè)流程會(huì)根據(jù)android sdk版本的不同做不同的處理,整個(gè)流程完全通過(guò)反射完成。

  • 編譯過(guò)程中的分包機(jī)制,將app中的class以某種方式將class分布在多個(gè)dex中

Multidex.install

從multidex的原理,很容易想起目前比較流行的一個(gè)代碼熱修復(fù)方案策略。安卓App熱補(bǔ)丁動(dòng)態(tài)修復(fù)技術(shù)介紹 ,qzone的技術(shù)思路在社區(qū)誕生了很多技術(shù)框架,其中知名度最高的就是Nuwa。但客觀的說(shuō),nuwa這個(gè)項(xiàng)目是完全達(dá)不到產(chǎn)品release的要求。在調(diào)研完所有同技術(shù)路線開源框架后,我們決定造個(gè)能應(yīng)用在線上產(chǎn)品的輪子。

我們的解決方案

  • 使用Transform API進(jìn)行bytecode的植入,支持高版本gradle

  • 編譯流程的優(yōu)化,減少了人工干預(yù)的過(guò)程

  • 支持補(bǔ)丁包的簽名驗(yàn)證,避免被惡意hook

  • 兼容網(wǎng)易安全部門的加殼方案

  • 支持ART模式:在art模式下,應(yīng)用補(bǔ)丁包可能導(dǎo)致地址錯(cuò)亂,解決方案是將直接引用修改class的相關(guān)類都打包進(jìn)行補(bǔ)丁包,這是目前其他開源方案沒(méi)有做的

MultiDex存在的問(wèn)題

MultiDex機(jī)制的出現(xiàn)本身是為了避免出現(xiàn)app 65535問(wèn)題的出現(xiàn),但隨著業(yè)務(wù)邏輯的增長(zhǎng),以及不合理的模塊劃分,導(dǎo)致main dex的方法數(shù)也超出了65535,這就導(dǎo)致了main dex capacity exceeded異常。

同時(shí),Multidex的接入額外還會(huì)對(duì)app的啟動(dòng)性能造成影響。Multidex在install時(shí)需要加載dex,首次啟動(dòng)時(shí)還需要做odex的轉(zhuǎn)換,而這些都是在ui主線程中完成。 根據(jù) Carlos Sessa的測(cè)試,啟用multidex后,4.4或以下的設(shè)備,app的啟動(dòng)時(shí)間平均會(huì)增加15%的時(shí)間,更嚴(yán)重的情況,甚至在啟動(dòng)時(shí)候會(huì)出現(xiàn)了黑屏。

目前部分app采取的策略是,放棄掉Multidex的,而轉(zhuǎn)為插件化的架構(gòu)。通過(guò)將非核心模塊的lazy load,來(lái)達(dá)到啟動(dòng)速度的優(yōu)化,但我們需要明確的是,并不是所有app都似乎插件化架構(gòu),為了實(shí)現(xiàn)啟動(dòng)加速或熱更新將本耦合的業(yè)務(wù)邏輯硬生生拆解才是本末倒置。

解決方案

Multidex異步化

在Android的性能優(yōu)化中,最常見的思路就是異步化,減少UI線程的工作。在應(yīng)用的交互層面上,app啟動(dòng)時(shí),幾乎所有app都會(huì)有一個(gè)SplashActivity。在界面上展示歡迎頁(yè),在后臺(tái)進(jìn)行初始化的業(yè)務(wù)邏輯。這就給我們一個(gè)啟發(fā),我們可以將系統(tǒng)的初始化邏輯,延遲到我們的業(yè)務(wù)初始化時(shí)間點(diǎn)上。

更加具體的方式是,我們可以將Multidex.install異步化,保證主線程的正常進(jìn)行,待加載完成后通知SplashActivity跳轉(zhuǎn)到真正的業(yè)務(wù)主界面。

在MultiDex加載的異步化之后,我們可以進(jìn)行第二步:main dex大小的精簡(jiǎn)。

Multidex分包原理介紹

Multidex會(huì)在入口Application的attachBaseContext,加載second dex,因此multidex分包的基本原則是:保證app啟動(dòng)需要的class放置在main dex上。在gradle 1.5以上,multidex通過(guò)CreateManifestKeepList和MutidexTransform完成,分包過(guò)程可以分為三步:

  • 生成manifest_keep.txt

CreateManifestKeepList會(huì)解析出AndroidManifest.xml中所有的組件類:包括Activity、Service、Receiver以及ContentProvider,這些類將會(huì)和Application入口類一起放在build/intermediates/multi-dex/{flavor}/{buildType}/manifest_keep.txt中

  • 生成maindexlist.txt文件

MutidexTransform會(huì)查找manifest_keep.txt中所有類的直接引用類,具體的方式是遍歷類的所有字段類以及方法,查看方法的參數(shù)和返回值的類型,將其放保存在maindexlist.txt

  • 生成main dex

轉(zhuǎn)載于:https://www.cnblogs.com/163yun/p/9565300.html

總結(jié)

以上是生活随笔為你收集整理的当我们在谈论multidex65535时,我们在谈论什么的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。