当我们在谈论multidex65535时,我们在谈论什么
本文來(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)題。
- 上一篇: Keepalived 主备配置
- 下一篇: 控制台激活关闭事件