日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > 綜合技術(shù) > Android熱補丁技術(shù)方案整理

Android熱補丁技術(shù)方案整理

來源:程序員人生   發(fā)布時間:2016-08-16 18:20:16 閱讀次數(shù):3933次

概述

項目快速迭代進程中,不可避免的出現(xiàn)BUG,Android線上出現(xiàn)問題,通常需要發(fā)版解決。緊急發(fā)版,用戶不1定升級,強迫升級又不友好,有甚么更好的解決方案呢?這就用到了熱修復技術(shù)。

QQ團隊的hotfix

hotfix,后來發(fā)展成為RocooFix,

GitHub地址: https://github.com/dodola/HotFix

原理詳細介紹官方文章:安卓App熱補釘動態(tài)修復技術(shù)介紹

HotFix存在的問題:這類方法沒法在已加載好的類中實現(xiàn)動態(tài)替換,只能在類加載之前替換掉。就是說,補釘下載下來后,只能等待用戶重啟利用才能完成補釘效果。

RocooFix支持兩種模式:
靜態(tài)修復某種情況下需要重啟利用。
動態(tài)修復,無需重啟利用便可生效。

補釘制作

該技術(shù)的原理很簡單,其實就是用ClassLoader加載機制,覆蓋掉有問題的方法。所以我們的補釘其實就是有問題的類打成的1個包。

例子中的出現(xiàn)問題的類是 dodola.hotfix.BugClass 原始代碼以下:

public class BugClass { public String bug() { return "bug class"; } }

我們假定BugClass類里的bug()方法出現(xiàn)毛病,需要修復,修復代碼以下:

public class BugClass { public String bug() { return "fixed class"; } }

那末我們只需要將修復過的類編譯后打包成dex便可

步驟以下:

  1. 將補釘類提取出來到1個文件夾里

  2. 將class文件打入1個jar包中 jar cvf path.jar *

  3. 將jar包轉(zhuǎn)換成dex的jar包 dx --dex --output=path_dex.jar path.jar

這樣就生成了補釘包path_dex.jar

實現(xiàn)javassist動態(tài)代碼注入

實現(xiàn)這1部份功能的緣由主要是由于出現(xiàn)以下異常

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation 

問題緣由在文檔中已描寫的比較清楚。

就是如果以上方法中直接援用到的類(第1層級關(guān)系,不會進行遞歸搜索)和clazz都在同1個dex中的話,那末這個類就會被打上CLASS_ISPREVERIFIED

很明顯,解決的方法就是在類中援用1個其他dex中的類,但是源碼方式的援用會將援用的類打入同1個dex中,所以我們需要找到1種既能編譯通過并且將兩個相互援用的類分離到不同的dex中,因而就有了這個動態(tài)的代碼植入方式。

首先我們需要制作援用類的dex包,代碼在hackdex中,我直接使用了文檔中的類名 AntilazyLoad 這樣可以和文章中對應(yīng)起來,方便1些。

我們將這個庫打包成dex的jar包,方法跟制作補釘1樣。

下面是重點,我們要用javassist將這個類在編譯打包的進程中插入到目標類中。

為了方便,我將這個進程做成了1個Gradle的Task,代碼在buildSrc中。

這個項目是使用Groovy開發(fā)的,需要配置Groovy SDK才可以編譯成功。

核心代碼以下:

/** * 植入代碼 * @param buildDir 是項目的build class目錄,就是我們需要注入的class所在地 * @param lib 這個是hackdex的目錄,就是AntilazyLoad類的class文件所在地 */ public static void process(String buildDir, String lib) { println(lib) ClassPool classes = ClassPool.getDefault() classes.appendClassPath(buildDir) classes.appendClassPath(lib) //下面的操作比較容易理解,在將需要關(guān)聯(lián)的類的構(gòu)造方法中插入援用代碼 CtClass c = classes.getCtClass("dodola.hotfix.BugClass") println("====添加構(gòu)造方法====") def constructor = c.getConstructors()[0]; constructor.insertBefore("System.out.println(dodola.hackdex.AntilazyLoad.class);") c.writeFile(buildDir) CtClass c1 = classes.getCtClass("dodola.hotfix.LoadBugClass") println("====添加構(gòu)造方法====") def constructor1 = c1.getConstructors()[0]; constructor1.insertBefore("System.out.println(dodola.hackdex.AntilazyLoad.class);") c1.writeFile(buildDir) growl("ClassDumper", "${c.frozen}") }

下面在代碼編譯完成,打包之前,履行植入代碼的task就能夠了。

在 app 項目的 build.gradle 中插入以下代碼

task('processWithJavassist') << { String classPath = file('build/intermediates/classes/debug')//項目編譯class所在目錄 dodola.patch.PatchClass.process(classPath, project(':hackdex').buildDir .absolutePath + '/intermediates/classes/debug')//第2個參數(shù)是hackdex的class所在目錄 } android{ ....... applicationVariants.all { variant -> variant.dex.dependsOn << processWithJavassist //在履行dx命令之前將代碼打入到class中 } }

反編譯編譯后的apk可以發(fā)現(xiàn),代碼已植入進去,而且包里其實不存在dodola.hackdex.AntilazyLoad 這個類


阿里巴巴的AndFix

GitHub地址: https://github.com/alibaba/AndFix

使用步驟

初始化

patchManager = new PatchManager(context); patchManager.init(appversion);//current version
加載patch
patchManager.loadPatch();
添加patch文件
patchManager.addPatch(path);
支持熱更新,不需要重新啟動

阿里巴巴的dexposed

GitHub地址: https://github.com/alibaba/dexposed

大眾點評的Nuwa

Nuwa的具體實現(xiàn)也是根據(jù)QQ空間的熱修復方案來實現(xiàn)的

GitHub地址: https://github.com/jasonross/Nuwa

DroidFix

GitHub地址: https://github.com/bunnyblue/DroidFix

官方介紹: http://bunnyblue.github.io/DroidFix/

DroidFix的實現(xiàn)原理跟QQ空間的熱補釘方案類似。

攜程的DynamicAPK

GitHub地址: https://github.com/CtripMobile/DynamicAPK

主流熱補釘開源方案基本上就是以上這些。



歡迎掃描2維碼,關(guān)注公眾號


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 欧美日韩电影一区二区 | 能在线看的av | 男女国产视频 | 黄色的视频在线观看 | 国产在线一区二区三区 | 国产99久久精品 | 成人免费毛片片v | 福利av在线 | 日韩理论在线 | 九九热视频在线观看 | 国产精品久久久久一区二区三区 | 亚洲你懂的 | 欧美中文字幕在线 | 欧美综合在线视频 | 精品在线免费观看 | 国产成人久久精品 | 欧美日韩中文字幕在线视频 | 亚洲精品高清视频 | 一二区成人影院电影网 | 午夜视频免费看 | 日韩一区二区在线播放 | 精品久久久久99 | 精品动漫av| 国产999精品久久久 日韩av成人在线 | 澳门永久av免费网站 | 色呦呦视频| 最近的2019中文字幕免费一页 | 一区二区三区国产精品视频 | 欧美三级韩国三级日本三斤 | 久久国产精品久久w女人spa | jizz日韩 | 国产日韩亚洲欧美 | 日韩视频一区二区 | 91香焦视频 | 色成人亚洲 | 国产区精品在线观看 | av影视大全 | 亚洲精品人成 | a毛片免费 | 狠狠久| 成人在线一区二区三区 |