#微信熱修復(fù)框架Tinker 接入指南---------->
Tinker簡(jiǎn)介:By騰訊微信團(tuán)隊(duì)開(kāi)發(fā),技術(shù)原理簡(jiǎn)介(參見(jiàn) [http://blog.csdn.net/tencent_bugly/article/details/52251319](http://blog.csdn.net/tencent_bugly/article/details/52251319))> > 特性:Tinker目前只支持熱修復(fù) (暫且不插件化&不支持加固 ->源自[http://blog.csdn.net/tencent_bugly/article/details/52251319](http://blog.csdn.net/tencent_bugly/article/details/52251319) Q18? Q22) > ## 1. Run官方Demo參考鏈接 :From簡(jiǎn)書(shū) [http://www.itdecent.cn/p/57264c770c12](http://www.itdecent.cn/p/57264c770c12)Rrom Tinker官方Wiki [https://github.com/Tencent/tinker/wiki](https://github.com/Tencent/tinker/wiki)### 1.1 導(dǎo)入Sample工程下載完Tinker之后這里需要注意 在android studio 中點(diǎn)擊 tinker-sample-android 項(xiàng)目導(dǎo)入就好了(不要導(dǎo)入別的,導(dǎo)入根目錄會(huì)識(shí)別不了app module),最好設(shè)置項(xiàng)目 允許 VCS->git,并確定切換到master分支(比較穩(wěn)定)
``請(qǐng)關(guān)閉Android Studio 的Instant Run !!!``將官方給出的Sample工程在AndroidStudio中打開(kāi).替換 ``ignoreWarning = false`` 為 ``ignoreWarning = true`` ~~(Tinker 1.6.x版本)首先一點(diǎn),在app的build.gradle文件中找到**usePreGeneratedPatchDex = true **? 注釋掉,然后找到 ** tinkerId = getTinkerIdValue()** 并將其替換成 ** tinkerId = "tinkerId" ** (必須替換不然編譯報(bào)錯(cuò),官方文檔寫(xiě)到:在運(yùn)行過(guò)程中,我們需要驗(yàn)證基準(zhǔn)apk包的tinkerId是否等于補(bǔ)丁包的tinkerId。這個(gè)是決定補(bǔ)丁包能運(yùn)行在哪些基準(zhǔn)包上面,一般來(lái)說(shuō)我們可以使用git版本號(hào)、versionName等等。),其中后面的值可以隨意設(shè)置.~~.(見(jiàn)圖1)**圖1**a86e73d8bdaffd99 ## 1.2 編譯運(yùn)行原版apk使用assembleDebug 任務(wù)(如下圖)編譯并生成debug apk

`` 這里注意 android studio run 按鈕生成的apk可能不會(huì)加入簽名,使用tinker插件生成補(bǔ)丁包時(shí)候回導(dǎo)致簽名不一致問(wèn)題,建議使用assembleXXX 任務(wù)生成基準(zhǔn)包,而且直接run 還會(huì)導(dǎo)致(對(duì)照基準(zhǔn)apk包和補(bǔ)丁apk發(fā)現(xiàn)補(bǔ)丁apk比基準(zhǔn)apk大了1M多,查看log.text發(fā)現(xiàn)居然多了很多莫名其妙的圖片 詳見(jiàn)wiki issue:https://github.com/Tencent/tinker/issues/103 輸出文件詳解參見(jiàn) 官方wiki https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97``
此時(shí)Tinker會(huì)在工程的app/build/bakApk/目錄下保存這個(gè)時(shí)間點(diǎn)打包好的apk文件(這里就是基準(zhǔn)包---所謂基準(zhǔn)包 就是未啟用熱修復(fù)的包),找到剛才生成的apk文件,復(fù)制其完整文件名,在app的build.gradle文件找到**tinkerOldApkPath**這一項(xiàng)設(shè)置,并將其設(shè)置為**tinkerOldApkPath = "${bakPath}/<剛才生成的apk文件名>"**(見(jiàn)圖2)**圖2**
在build.gradle文件找到**tinkerApplyResourcePath**這一項(xiàng)設(shè)置,并將其設(shè)置為**tinkerApplyResourcePath = "${bakPath}/<剛才生成的apk文件名下面的txt文件>"** ``apk,R.txt,mapping.txt等反正backApk目錄下面生成的東西和gradle中ext各項(xiàng)對(duì)應(yīng)``形如 ```? tinkerOldApkPath = "${bakPath}/app-debug-1018-17-32-47.apk"? ? //proguard mapping file to build patch apk? ? tinkerApplyMappingPath = "${bakPath}/app-debug-1018-17-32-47-mapping.txt"? ? //resource R.txt to build patch apk, must input if there is resource changed? ? tinkerApplyResourcePath = "${bakPath}/app-debug-1018-17-32-47-R.txt"? ? //only use for build all flavor, if not, just ignore this field? ? tinkerBuildFlavorDirectory = "${bakPath}/app-1018-17-32-47" ```
## 1.3 修改源碼 生成新版apk 補(bǔ)丁在MainActivity.java中,我們稍作改動(dòng),例如將R.string.test_resource對(duì)應(yīng)的字符串資源的值修改(見(jiàn)圖3),```I am in the base apk-->//原值I am in the patch apk//新值>```還可以在MainActivity中添加一行代碼(見(jiàn)圖3)``` Log.e(TAG, "i am on patch onCreate"); ```**圖3**你可以自行做出更多的改動(dòng)(這也是我們需要熱修復(fù)的原因),然后再Gradle腳本中找到'app:/tinker/tinkerPatchDebug'這條命令(見(jiàn)圖4),雙擊運(yùn)行,它將生成debug版的patch(補(bǔ)丁)apk文件. (有時(shí)tinkerPatchDebug任務(wù)耗時(shí)過(guò)長(zhǎng),可關(guān)閉任務(wù)再次執(zhí)行一次)\**圖4**運(yùn)行完畢后,補(bǔ)丁apk文件所在位置見(jiàn)圖5 **圖5**(官方wiki:簽名后并使用7zip壓縮的補(bǔ)丁包,也是我們通常使用的補(bǔ)丁包。但正式發(fā)布的時(shí)候,最好不要以.apk結(jié)尾,防止被運(yùn)營(yíng)商挾持。)將patch_signed_7zip.apk這個(gè)文件拷貝到Android設(shè)備的ExternalStorageDirectory()路徑下(即SD卡目錄下).文件的路徑可以隨意設(shè)定,只需在MainActivity中指明補(bǔ)丁Apk路徑即可(見(jiàn)圖6) **圖6**## 1.4 安裝熱修復(fù)補(bǔ)丁 觀察程序變化點(diǎn)擊APP主界面中的LOAD PATCH加載補(bǔ)丁,提示成功后,點(diǎn)擊KILL SELF結(jié)束當(dāng)前進(jìn)程(Tinker必須重啟才能熱修復(fù)成功),重新啟動(dòng)后,即可發(fā)現(xiàn)變化.可以看到,經(jīng)過(guò)上述修改,原有Apk的應(yīng)用啟動(dòng)后在Log中打印為(見(jiàn)圖7)**圖7**而應(yīng)用補(bǔ)丁后,打印結(jié)果為(見(jiàn)圖8):**圖8**# 2. Tinker Sample編譯失敗中的常見(jiàn)問(wèn)題## 2.1. 網(wǎng)絡(luò)情況不佳時(shí),tinker插件所依賴的庫(kù)或者插件缺失(如 com.tencent.mm:SevenZip 缺失)? 1.1 原因:下載地址是https開(kāi)頭,導(dǎo)致下載不下來(lái)
1.2 解決辦法:找到C盤(pán)用戶目錄下.gradle目錄下的cache目錄(形如 C:\Users\hasee\.gradle\caches)
刪除該文件夾下所有文件以及文件夾然后將 根目錄(Project:)build.gradle中把? ? 把``jcenter()``? 更改為
``` jcenter(){? ? ? ? ? ? url 'http://jcenter.bintray.com/'? ? ? ? }? ? ```
再重新編譯。(相當(dāng)于再次重新下載依賴)## 2.2. Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'. BSDiff$1.class解決辦法: clean project## 2.3. Error:(9, 0) Your project path contains non-ASCII characters編譯失敗原因:工程目錄處于中文路徑下解決辦法:不處于中文路徑下就好了## 2.4 加載補(bǔ)丁時(shí)補(bǔ)丁加載失敗補(bǔ)丁加載失敗的原因很多,具體原因可以在logcat中查看,但是需要確保logcat的設(shè)置如下,否則tinker合成補(bǔ)丁日志輸出獲取不到常見(jiàn)加載失敗有簽名校驗(yàn)的問(wèn)題解決辦法:注意不要搞混 tinkerPatchDebug gradle任務(wù) 和 tinkerPatchReleas gradle任務(wù) 對(duì)應(yīng)生成的
patch_signed_7zip,debug簽名就用 tinkerPatchDebug gradle任務(wù) 生成的 patch_signed_7zip
`` 這里注意 android studio run 按鈕不會(huì)加入簽名,使用tinker插件生成補(bǔ)丁包時(shí)候回導(dǎo)致簽名不一致問(wèn)題,建議使用assembleXXX 任務(wù)生成基準(zhǔn)包``