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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

App热补丁动态修复技术介绍

發布時間:2025/3/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 App热补丁动态修复技术介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

安卓App熱補丁動態修復技術介紹

來自qq空間團隊:微信號qzonemobiledev
QQ空間終端開發團隊

1.背景

當一個App發布之后,突然發現了一個嚴重bug需要進行緊急修復,這時候公司各方就會忙得焦頭爛額:重新打包App、測試、向各個應用市場和渠道換包、提示用戶升級、用戶下載、覆蓋安裝。有時候僅僅是為了修改了一行代碼,也要付出巨大的成本進行換包和重新發布。

這時候就提出一個問題:有沒有辦法以補丁的方式動態修復緊急Bug,不再需要重新發布App,不再需要用戶重新下載,覆蓋安裝?

雖然Android系統并沒有提供這個技術,但是很幸運的告訴大家,答案是:可以,我們QQ空間提出了熱補丁動態修復技術來解決以上這些問題。


2.實際案例

空間Android獨立版5.2發布后,收到用戶反饋,結合版無法跳轉到獨立版的訪客界面,每天都較大的反饋。在以前只能緊急換包,重新發布。成本非常高,也影響用戶的口碑。最終決定使用熱補丁動態修復技術,向用戶下發Patch,在用戶無感知的情況下,修復了外網問題,取得非常好的效果。


3.解決方案

該方案基于的是android dex分包方案的,關于dex分包方案,網上有幾篇解釋了,所以這里就不再贅述,具體可以看這里https://m.oschina.net/blog/308583。

簡單的概括一下,就是把多個dex文件塞入到app的classloader之中,但是android dex拆包方案中的類是沒有重復的,如果classes.dex和classes1.dex中有重復的類,當用到這個重復的類的時候,系統會選擇哪個類進行加載呢?

讓我們來看看類加載的代碼:


一個ClassLoader可以包含多個dex文件,每個dex文件是一個Element,多個dex文件排列成一個有序的數組dexElements,當找類的時候,會按順序遍歷dex文件,然后從當前遍歷的dex文件中找類,如果找類則返回,如果找不到從下一個dex文件繼續查找。

理論上,如果在不同的dex中有相同的類存在,那么會優先選擇排在前面的dex文件的類,如下圖:


在此基礎上,我們構想了熱補丁的方案,把有問題的類打包到一個dex(patch.dex)中去,然后把這個dex插入到Elements的最前面,如下圖:


好,該方案基于第二個拆分dex的方案,方案實現如果懂拆分dex的原理的話,大家應該很快就會實現該方案,如果沒有拆分dex的項目的話,可以參考一下谷歌的multidex方案實現。然后在插入數組的時候,把補丁包插入到最前面去。

好,看似問題很簡單,輕松的搞定了,讓我們來試驗一下,修改某個類,然后打包成dex,插入到classloader,當加載類的時候出現了(本例中是QzoneActivityManager要被替換):


為什么會出現以上問題呢?

從log的意思上來講,ModuleManager引用了QzoneActivityManager,但是發現這這兩個類所在的dex不在一起,其中:

1. ModuleManager在classes.dex中

2. QzoneActivityManager在patch.dex中

結果發生了錯誤。

這里有個問題,拆分dex的很多類都不是在同一個dex內的,怎么沒有問題?

讓我們搜索一下拋出錯誤的代碼所在,嘿咻嘿咻,找到了一下代碼:


從代碼上來看,如果兩個相關聯的類在不同的dex中就會報錯,但是拆分dex沒有報錯這是為什么,原來這個校驗的前提是:

如果引用者(也就是ModuleManager)這個類被打上了CLASS_ISPREVERIFIED標志,那么就會進行dex的校驗。那么這個標志是什么時候被打上去的?讓我們在繼續搜索一下代碼,嘿咻嘿咻~~,在DexPrepare.cpp找到了一下代碼:


這段代碼是dex轉化成odex(dexopt)的代碼中的一段,我們知道當一個apk在安裝的時候,apk中的classes.dex會被虛擬機(dexopt)優化成odex文件,然后才會拿去執行。
虛擬機在啟動的時候,會有許多的啟動參數,其中一項就是verify選項,當verify選項被打開的時候,上面doVerify變量為true,那么就會執行dvmVerifyClass進行類的校驗,如果dvmVerifyClass校驗類成功,那么這個類會被打上CLASS_ISPREVERIFIED的標志,那么具體的校驗過程是什么樣子的呢?

此代碼在DexVerify.cpp中,如下:


1. 驗證clazz->directMethods方法,directMethods包含了以下方法:

1. static方法

2. private方法

3. 構造函數

2. clazz->virtualMethods

1. 虛函數=override方法?

概括一下就是如果以上方法中直接引用到的類(第一層級關系,不會進行遞歸搜索)和clazz都在同一個dex中的話,那么這個類就會被打上CLASS_ISPREVERIFIED


所以為了實現補丁方案,所以必須從這些方法中入手,防止類被打上CLASS_ISPREVERIFIED標志

最終空間的方案是往所有類的構造函數里面插入了一段代碼,代碼如下:

if (ClassVerifier.PREVENT_VERIFY) {

System.out.println(AntilazyLoad.class);

}


其中AntilazyLoad類會被打包成單獨的hack.dex,這樣當安裝apk的時候,classes.dex內的類都會引用一個在不相同dex中的AntilazyLoad類,這樣就防止了類被打上CLASS_ISPREVERIFIED的標志了,只要沒被打上這個標志的類都可以進行打補丁操作。

然后在應用啟動的時候加載進來.AntilazyLoad類所在的dex包必須被先加載進來,不然AntilazyLoad類會被標記為不存在即使后續加載了hack.dex包那么他也是不存在的這樣屏幕就會出現茫茫多的類AntilazyLoad找不到的log。

所以Application作為應用的入口不能插入這段代碼。(因為載入hack.dex的代碼是在Application中onCreate中執行的,如果在Application的構造函數里面插入了這段代碼,那么就是在hack.dex加載之前就使用該類,該類一次找不到,會被永遠的打上找不到的標志)

其中:


之所以選擇構造函數是因為他不增加方法數,一個類即使沒有顯式的構造函數,也會有一個隱式的默認構造函數。

空間使用的是在字節碼插入代碼,而不是源代碼插入,使用的是javaassist庫來進行字節碼插入的。

隱患:

虛擬機在安裝期間為類打上CLASS_ISPREVERIFIED標志是為了提高性能的,我們強制防止類被打上標志是否會影響性能?這里我們會做一下更加詳細的性能測試.但是在大項目中拆分dex的問題已經比較嚴重,很多類都沒有被打上這個標志。

如何打包補丁包:

1. 空間在正式版本發布的時候,會生成一份緩存文件,里面記錄了所有class文件的md5,還有一份mapping混淆文件。

2. 在后續的版本中使用-applymapping選項,應用正式版本的mapping文件,然后計算編譯完成后的class文件的md5和正式版本進行比較,把不相同的class文件打包成補丁包。

備注:該方案現在也應用到我們的編譯過程當中,編譯不需要重新打包dex,只需要把修改過的類的class文件打包成patch dex,然后放到sdcard下,那么就會讓改變的代碼生效。


總結

以上是生活随笔為你收集整理的App热补丁动态修复技术介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品久久在线 | av免| 插插插干干干 | 特种兵之深入敌后 | 禁果av一区二区三区 | 亚洲欧美日韩国产 | 欧美一区二区三区免费在线观看 | 最新黄色在线 | 国产精品ⅴa有声小说 | www在线观看视频 | 久久亚洲一区二区 | 一区精品在线观看 | 成人网战 | 91在线免费看 | 欧美老肥妇做爰bbww | 人人草av| 成人性做爰aaa片免费看不忠 | 一级片免费视频 | 国产又大又粗又爽 | 国产精品99久久久久久久久久久久 | 麻豆av在线播放 | 瑟瑟视频免费观看 | 国产亚洲一区二区不卡 | 深爱五月综合网 | 久久91亚洲精品中文字幕奶水 | 色综合天天网 | 操碰97| 中国女人真人一级毛片 | 女人脱下裤子让男人捅 | 精品色 | 亚洲毛茸茸 | 26uuu国产精品视频 | 日本黄色免费网址 | 国产成人av免费观看 | 色综合久久天天综合网 | 性中国xxx极品hd | 波多野结衣一二三区 | 久久网国产 | 手机看片福利在线 | 中文字幕无人区二 | 亚洲欧美视频二区 | 亚洲国产中文在线 | 成人爽爽视频 | 久久精工是国产品牌吗 | 亚洲视频在线视频 | 91亚洲国产成人精品性色 | 五月婷婷深深爱 | 黑人借宿巨大中文字幕 | 97久久人人 | 特级黄色一级片 | xxxxx亚洲| 嫩模啪啪 | 欧美日韩成人在线观看 | 欧洲亚洲天堂 | 色七七久久 | 久久久久久久久综合 | 中文字幕第七页 | 97人妻精品一区二区免费 | 拔插拔插华人 | 99热这里只有精品久久 | 国产无码精品在线播放 | 天堂аⅴ在线最新版在线 | 四虎永久网址 | 看黄色小视频 | 欧美人与禽zozzo性之恋的特点 | 久久久国产打桩机 | 欧洲视频一区二区三区 | 丝袜 亚洲 另类 国产 制服 | 精品午夜久久久 | 国产13页 | 国产成人无码www免费视频播放 | 无码人妻丰满熟妇精品区 | 自拍偷拍视频网站 | 日韩污视频在线观看 | 久久婷婷丁香 | 亚洲蜜桃精久久久久久久久久久久 | 国产 日韩 欧美 在线 | 精品人妻无码一区二区色欲产成人 | 亚洲第一页夜 | 亚洲av无码一区二区三区dv | 日韩极品一区 | 日韩性在线 | 午夜在线看 | 亚洲av最新在线网址 | 日本人三级 | 国产有码 | 小香蕉影院 | 日韩精品一区二区三区 | 国产性猛交| 日本在线www | 久久一区欧美 | 一区视频在线 | 国产一区二区免费 | 久操综合 | 探花av在线 | 日韩免费在线播放 | 国产图片一区 | 中文区中文字幕免费看 | 在线观看国产 |