熱更新,熱修復(fù)

鴻洋大神博客:http://blog.csdn.net/lmj623565791/article/list/1

(不止有熱更新tinker,還有像ui卡頓、基于編譯時注解等好文章)

熱更新相關(guān):

http://www.itdecent.cn/p/c12063b41aa2

1、Bugly集成了Tinker

bugly官網(wǎng)

https://beta.bugly.qq.com/apps/a51b65d9d4/hotfix?pid=1

https://bugly.qq.com/v2/downloads

https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20170307182353

https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix-demo/

注意問題,

1、項目中引入bugly會與instant run沖突,處理方法

1、將之前MyApplication的內(nèi)容全部移到MyApplicationLike中

2、平時進(jìn)行開發(fā)、bug調(diào)試,可以gradle下的apply from: 'tinker-support.gradle'注釋掉

這樣就可以啟用instant run功能

3、正式生成apk或者生成補(bǔ)丁patch時,把a(bǔ)pply from: 'tinker-support.gradle',

同時關(guān)閉instant run功能

http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=2865

2、每次發(fā)布一個版本后一定要將基準(zhǔn)包apk、maping.txt、R.txt保存下來

因為把gradle下的apply from: 'tinker-support.gradle'注釋掉后,

tinker-support.gradle下編寫的bakApka路徑將會消失,里面的內(nèi)容也會清空

所以一定要將基準(zhǔn)包內(nèi)容拷貝出來,最好把整個目錄拷貝出來,bakApka\app-0313-11-35-21\...

當(dāng)修復(fù)完bug后,需要生成補(bǔ)丁包,在把整個目錄拷貝到build文件夾下

3、另外注意,第二級路徑def baseApkDir = "app-0310-18-47-32",這個命名并沒有起到作用

每次生成都是當(dāng)前時間app-月日-時-分-秒,所以這個目錄名也得保留下來,生成補(bǔ)丁時,直接

指定這個目錄,比如

baseApk = "${bakPath}/app-0310-19-22-22/app-debug.apk"

baseApkProguardMapping = "${bakPath}/app-0310-19-02-02/patch_app-release-mapping.txt"(這個文件,有時候沒有生成,不知為何)

baseApkResourceMapping = "${bakPath}/app-0310-19-22-22/app-debug-R.txt"

tinkerId = "patch1-1.0.1"

其他網(wǎng)址:

http://www.itdecent.cn/p/c12063b41aa2

http://www.itdecent.cn/p/5a31480286ab

http://www.itdecent.cn/p/2dda80c2cdfe

2、Tinker(微信使用)

github官網(wǎng):

https://github.com/Tencent/tinker

https://github.com/Tencent/tinker/wiki(wiki)

http://tinkerpatch.com/Docs/intro(文檔)

http://blog.csdn.net/tyk9999tyk/article/details/53391519(常見問題)

原理、源碼

1、基礎(chǔ)概念

1、java基礎(chǔ)概念

.java,? .class,? ClassLoader,? jvm

.java文件---編譯---.class文件(字節(jié)碼)---ClassLoader加載.class文件---jvm(解釋并執(zhí)行,實現(xiàn)跨平臺)

http://www.itdecent.cn/p/29efb9a9b008(里面有講解了反射)

2、Android基礎(chǔ)概念

.dex? BaseDexClassLoader等

.java文件---編譯---.class文件(字節(jié)碼)---合并、優(yōu)化---一個或多個.dex文件(主要看有沒有進(jìn)行dex分包處理)

---BaseDexClassLoader(以及下方的DexClassLoader、PathClassLoader等)---原始的dex生成相應(yīng)的優(yōu)化后的odex文件

---ART或Dalvik虛擬機(jī)上運行

http://www.itdecent.cn/p/a620e368389a

http://www.blogfshare.com/dex-format.html

http://www.itdecent.cn/p/2d32f2343f8f

http://www.itdecent.cn/p/86fba19d80c8

3、dex分包

http://www.itdecent.cn/p/a67a560903fa

2、原理、源碼

關(guān)鍵字:dex分包、dexElements、classes.dex和classes1.dex中有重復(fù)的類、old dex、new dex、diff算法、生成patch文件

https://github.com/Tencent/tinker(下方的圖)

http://blog.csdn.net/lmj623565791/article/details/54882693(有對上面網(wǎng)址中的圖作解釋,原理整體流程)

http://blog.csdn.net/lmj623565791/article/details/60874334(diff算法、生成patch文件)

對改圖的整體理解:

tinker將old.apk和new.apk做了diff,拿到patch.dex,然后將patch.dex與本機(jī)中apk的classes.dex做了合并,生成新的classes.dex,運行時通過反射將合并后的dex文件放置在加載的dexElements數(shù)組的前面。

運行時替代的原理,其實和Qzone的方案差不多,都是去反射修改dexElements。

兩者的差異是:Qzone是直接將patch.dex插到數(shù)組的前面;而tinker是將patch.dex與app中的classes.dex合并后的全量dex插在數(shù)組的前面。

tinker這么做的目的還是因為Qzone方案中提到的CLASS_ISPREVERIFIED的解決方案存在問題;而tinker相當(dāng)于換個思路解決了該問題。

以下是QQZone的解決方案,出現(xiàn)的CLASS_ISPREVERIFIED問題,tinker解決的這個問題采用了另外的方法,參考上面的網(wǎng)址

https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a&scene=1&srcid=1106Imu9ZgwybID13e7y2nEi#wechat_redirect

http://blog.csdn.net/lmj623565791/article/details/49883661

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容