鴻洋大神博客: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