首先得聲明的是熱修復(fù)只能在國內(nèi)市場使用幻件。
而國外的Google Play不允許任何APP有更改跷叉,被舉報(bào)就準(zhǔn)備好下架整改了嫌吠。
An app downloaded from Google Play may not modify, replace, or update
itself using any method other than Google Play's update mechanism.
所以老老實(shí)實(shí)在國內(nèi)用就好了忌警。
市面上出現(xiàn)了許多熱修復(fù)搁拙,從最早的Dexposed到后來的AndFix,到現(xiàn)在的Tinker各有千秋法绵。
不過大概的分兩種箕速,一種是基于Dexposed和AndFix的Native流和基于Tinker的Dex流。
以下采取圖片為主的方式介紹朋譬,更多詳細(xì)原理以及代碼實(shí)現(xiàn)請移步參考盐茎。
Native流派
1.簡介
使用Nativie流主要有阿里的DexPosed和AndFix。主要是通過解析補(bǔ)丁中的方法徙赢,
將需要打補(bǔ)丁的地方在Native層使用C++中指針替換來達(dá)到修復(fù)bug的目的字柠。
下面以AndFix作為例子簡單介紹原理
2.流程
3.原理
<img src="http://upload-images.jianshu.io/upload_images/2241150-0d92931d7c0d3080?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240">
總的來說探越,Native流派是先獲取補(bǔ)丁文件中的信息,通過信息進(jìn)入Native層Hook需要修復(fù)Bug的方法窑业,
然后將補(bǔ)丁中的內(nèi)容打到需要替換的位置钦幔。通過這樣的方式來實(shí)現(xiàn)熱修復(fù)。
詳細(xì)介紹以及代碼分析請移步到參考[AndFix原理]
Dex流
1.簡介
Dex流的原理其實(shí)和解決64k方法限制方法類似常柄,主要還是在dex加載上面做文章鲤氢。
分包的時候?qū)⒉煌椒ǚ峙涞讲煌膁ex中,這樣解決了單個dex方法不能超過64k的限制西潘。
插件化開發(fā)也是基于這種理念誕生的卷玉。
不同的dex由不同部門開發(fā),然后由統(tǒng)一的apk進(jìn)行加載秸架。
這樣并行開發(fā)揍庄,互不干擾的模式咆蒿,大大提高了開發(fā)效率东抹,實(shí)現(xiàn)了APK模塊化區(qū)分。
而最近的Tinker沃测,原理本質(zhì)上是一樣的缭黔,但是基于這些采取了很多優(yōu)化,更加穩(wěn)定蒂破。
2.原理
基于android的dexClassLoader機(jī)制馏谨,將需要替換的dex放在dexElements數(shù)組最前面。
當(dāng)系統(tǒng)遍歷方法的時候會優(yōu)先使用前面的方法(補(bǔ)丁方法)附迷,來替代原來的方法惧互。
大概意思和插隊(duì)差不多,把最新的好的放在最前面喇伯,老舊的錯誤的將它淘汰喊儡。
如需詳細(xì)的解析介紹請移步參考中的[QQ空間熱修復(fù)實(shí)現(xiàn)]查看詳細(xì)實(shí)現(xiàn)原理。
后話
其實(shí)從熱修復(fù)里面可以看到一點(diǎn):線上有bug更新一次是在是太麻煩了稻据,不停打包和分發(fā)艾猜,實(shí)在是太繁瑣。熱修復(fù)這種折中的方式應(yīng)運(yùn)而生捻悯。
換句話來說匆赃,現(xiàn)在APP太重了。
每次迭代都要去用戶去應(yīng)用市場下載今缚,這對于用戶來說是個麻煩事算柳,所以APP輕量化是一個以后發(fā)展的方向。
輕量化一個方向就是將APP功能拆分姓言,模塊化開發(fā)埠居。近似生活中查牌,手機(jī)零件由不同工廠生產(chǎn),然后再由一個工廠統(tǒng)一組裝滥壕,這樣大大提高了生產(chǎn)效率纸颜。
我認(rèn)為模塊化必定是以后的發(fā)展方向,從google新的Android Instant Apps就可以看出來绎橘。今后可以通過Deep Link的方式胁孙,從一段url中可以鏈接到一個應(yīng)用的某個模塊,迎來輕量化革命称鳞。
現(xiàn)在開發(fā)模式采用Native+Web混合模式歸根結(jié)底也是為了減輕APP重量涮较,滿足快速迭代的要求。
Android Instant APP和Progressive Web App也是Google推出模糊Native和Web的界限冈止,找到一個既有Native良好體驗(yàn),也有Web APP快速迭代的方案熙暴。
而且從筆者翻譯的【譯】Android 7.0 for Developers
里面的第16點(diǎn)來說闺属,Google目前在持續(xù)性的迭代Chrome以及WebView,我猜測這些新的功能和Chrome的聯(lián)系將會非常密切周霉,甚至可能會將Chrome抬到和Google Play相同的地位來成為Web端的控制者掂器。這樣不但會提高chrome的市場份額,也變相壟斷了整個APP和Web俱箱。
這樣有幾點(diǎn)好處:
- 加強(qiáng)開發(fā)效率国瓮,模糊化Native和Web會給開發(fā)人員帶來便利。
- 方便用戶狞谱,提高整個Android端的用戶體驗(yàn)乃摹。
- 壟斷市場,制定規(guī)則跟衅,站在整個Android流量的上游孵睬。
反正上面都是我猜的
至于一些缺點(diǎn),比如技術(shù)實(shí)現(xiàn)啊什么的与斤,反正還有苦逼的程序員來實(shí)現(xiàn)肪康。
[手動滑稽]
參考
參考內(nèi)容來自大腿們的詳細(xì)介紹,如有侵權(quán)請告知刪除