当我们在谈论multidex65535时,我们在谈论什么
本文來自網(wǎng)易云社區(qū)
作者:鄭文
首先我們并不在討論車牌號.本文盡量避免談論重復的技術(shù)點,只探討一下multidex提供給我們的技術(shù)啟示。
原理
multidex技術(shù)原理可以分成兩個部分:
在app啟動時,通過Multidex.install api,擴展ClassLoader的dexElements數(shù)組來存儲所有dex,這個流程會根據(jù)android sdk版本的不同做不同的處理,整個流程完全通過反射完成。
編譯過程中的分包機制,將app中的class以某種方式將class分布在多個dex中
Multidex.install
從multidex的原理,很容易想起目前比較流行的一個代碼熱修復方案策略。安卓App熱補丁動態(tài)修復技術(shù)介紹 ,qzone的技術(shù)思路在社區(qū)誕生了很多技術(shù)框架,其中知名度最高的就是Nuwa。但客觀的說,nuwa這個項目是完全達不到產(chǎn)品release的要求。在調(diào)研完所有同技術(shù)路線開源框架后,我們決定造個能應用在線上產(chǎn)品的輪子。
我們的解決方案
使用Transform API進行bytecode的植入,支持高版本gradle
編譯流程的優(yōu)化,減少了人工干預的過程
支持補丁包的簽名驗證,避免被惡意hook
兼容網(wǎng)易安全部門的加殼方案
支持ART模式:在art模式下,應用補丁包可能導致地址錯亂,解決方案是將直接引用修改class的相關(guān)類都打包進行補丁包,這是目前其他開源方案沒有做的
MultiDex存在的問題
MultiDex機制的出現(xiàn)本身是為了避免出現(xiàn)app 65535問題的出現(xiàn),但隨著業(yè)務邏輯的增長,以及不合理的模塊劃分,導致main dex的方法數(shù)也超出了65535,這就導致了main dex capacity exceeded異常。
同時,Multidex的接入額外還會對app的啟動性能造成影響。Multidex在install時需要加載dex,首次啟動時還需要做odex的轉(zhuǎn)換,而這些都是在ui主線程中完成。 根據(jù) Carlos Sessa的測試,啟用multidex后,4.4或以下的設(shè)備,app的啟動時間平均會增加15%的時間,更嚴重的情況,甚至在啟動時候會出現(xiàn)了黑屏。
目前部分app采取的策略是,放棄掉Multidex的,而轉(zhuǎn)為插件化的架構(gòu)。通過將非核心模塊的lazy load,來達到啟動速度的優(yōu)化,但我們需要明確的是,并不是所有app都似乎插件化架構(gòu),為了實現(xiàn)啟動加速或熱更新將本耦合的業(yè)務邏輯硬生生拆解才是本末倒置。
解決方案
Multidex異步化
在Android的性能優(yōu)化中,最常見的思路就是異步化,減少UI線程的工作。在應用的交互層面上,app啟動時,幾乎所有app都會有一個SplashActivity。在界面上展示歡迎頁,在后臺進行初始化的業(yè)務邏輯。這就給我們一個啟發(fā),我們可以將系統(tǒng)的初始化邏輯,延遲到我們的業(yè)務初始化時間點上。
更加具體的方式是,我們可以將Multidex.install異步化,保證主線程的正常進行,待加載完成后通知SplashActivity跳轉(zhuǎn)到真正的業(yè)務主界面。
在MultiDex加載的異步化之后,我們可以進行第二步:main dex大小的精簡。
Multidex分包原理介紹
Multidex會在入口Application的attachBaseContext,加載second dex,因此multidex分包的基本原則是:保證app啟動需要的class放置在main dex上。在gradle 1.5以上,multidex通過CreateManifestKeepList和MutidexTransform完成,分包過程可以分為三步:
生成manifest_keep.txt
CreateManifestKeepList會解析出AndroidManifest.xml中所有的組件類:包括Activity、Service、Receiver以及ContentProvider,這些類將會和Application入口類一起放在build/intermediates/multi-dex/{flavor}/{buildType}/manifest_keep.txt中
生成maindexlist.txt文件
MutidexTransform會查找manifest_keep.txt中所有類的直接引用類,具體的方式是遍歷類的所有字段類以及方法,查看方法的參數(shù)和返回值的類型,將其放保存在maindexlist.txt
生成main dex
轉(zhuǎn)載于:https://www.cnblogs.com/163yun/p/9565300.html
總結(jié)
以上是生活随笔為你收集整理的当我们在谈论multidex65535时,我们在谈论什么的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keepalived 主备配置
- 下一篇: 控制台激活关闭事件