
玩Dota的應(yīng)該知道
熱更新
熱補(bǔ)丁技術(shù)也可以理解為一個(gè)動(dòng)態(tài)修改代碼與資源的通道,它適合于修改量較少的情況。
本文你將獲悉
- 【主流熱更新框架的簡(jiǎn)單比較】
- 【Tinker能做什么】
- 【 Tinker不能做什么】
- 【利用Tinker Platform實(shí)現(xiàn)熱更新詳細(xì)步驟】
- 【
復(fù)雜的熱更新原理】 - 【
繁瑣的補(bǔ)丁制作流程】
部分?jǐn)?shù)據(jù)來(lái)自 tinker官方文檔
主流熱更新框架的簡(jiǎn)單比較

Gitbut表現(xiàn) (2017-12-08 15:00)



Tinker能做什么
- 添加刪除類,方法
- 替換so包
- 資源替換
- 修改Activity,包括添加和刪除
- 結(jié)合Tinker Platform熱更新服務(wù)平臺(tái)進(jìn)行更新包下發(fā)
- 獲取更新補(bǔ)丁后,在下次APP重啟(線程級(jí))時(shí)完成更新
雖然更修改的項(xiàng)目沒(méi)多到讓你為所欲為的地步,但也足夠你應(yīng)付產(chǎn)品經(jīng)理的蜜汁需求或者關(guān)起門來(lái)偷偷改自己埋下的小bug,絕對(duì)不告訴別人
Tinker不能做什么
- Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大組件(1.9.0支持新增非export的Activity);
- 由于Google Play的開(kāi)發(fā)者條款限制,不建議在GP渠道動(dòng)態(tài)更新代碼;
- 在Android N上,補(bǔ)丁對(duì)應(yīng)用啟動(dòng)時(shí)間有輕微的影響;
- 不支持部分三星android-21機(jī)型,加載補(bǔ)丁時(shí)會(huì)主動(dòng)拋出"TinkerRuntimeException:checkDexInstall failed";
- 對(duì)于資源替換,不支持修改remoteView。例如transition動(dòng)畫,notification icon以及桌面圖標(biāo)。
利用Tinker Platform實(shí)現(xiàn)熱更新
第一步:配置gradle
工程目錄下添加插件

buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.1"
}
}
app目錄下gradle配置依賴compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.1"),并添加Tinker配置gradle【tinkerpatch.gradle】

第二步:API 操作(具體看Demo)
public class App extends Application {
ApplicationLike tinkerAppLike;
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
}
@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.TINKER_ENABLE){
tinkerAppLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();
TinkerPatch.init(tinkerAppLike)
//是否自動(dòng)反射Library路徑,無(wú)須手動(dòng)加載補(bǔ)丁中的So文件
//注意,調(diào)用在反射接口之后才能生效,你也可以使用Tinker的方式加載Library
.reflectPatchLibrary()
//設(shè)置收到后臺(tái)回退要求時(shí),鎖屏清除補(bǔ)丁,默認(rèn)是等主進(jìn)程重啟時(shí)自動(dòng)清除
.setPatchRollbackOnScreenOff(true)
//設(shè)置補(bǔ)丁合成成功后,鎖屏重啟程序,默認(rèn)是等應(yīng)用自然重啟
.setPatchRestartOnSrceenOff(true);
}
}
}
在合適的時(shí)候獲取補(bǔ)丁
TinkerPatch.with().fetchPatchUpdate(true);
在客戶端獲取補(bǔ)丁后,Tinker會(huì)根據(jù)配置選擇在鎖屏的時(shí)候或者重啟的時(shí)候自動(dòng)完成補(bǔ)丁修補(bǔ)。
第三步:利用插件生成增量APK

第四不:上傳到Tinker Platform平臺(tái)


總結(jié)
- 在一個(gè)基礎(chǔ)包上可以添加多個(gè)補(bǔ)丁
為什么要選Tinker? - 傻瓜式一鍵生成補(bǔ)丁,AndFix要用apkpatch工具配合命令生成.patch文件
- 長(zhǎng)期維護(hù)
- 長(zhǎng)江后浪推前浪,吸取主流框架的經(jīng)驗(yàn)和教訓(xùn),獨(dú)創(chuàng)補(bǔ)丁算法
- 有信心把熱更新做成商業(yè)級(jí)產(chǎn)品,還有誰(shuí)
一個(gè)框架如果沒(méi)有良好的維護(hù),那么最開(kāi)始就不要使用或者早點(diǎn)棄用,在對(duì)比了多個(gè)主流熱更新框架的github上的star數(shù),未解決的issues數(shù)后,你就會(huì)知道,其實(shí)Tinker現(xiàn)在【根本】【沒(méi)有】【對(duì)手】。
一個(gè)好的框架應(yīng)該也是一個(gè)容易使用的框架,我們的目的是拿來(lái)能直接干活,如果使用過(guò)于復(fù)雜,過(guò)多的時(shí)間用在了研究原理上就得不償失了,畢竟熱修復(fù)不是簡(jiǎn)單的東西。比起其它熱修復(fù)框架,Tinker最大優(yōu)勢(shì)是多了平臺(tái)支持,可支持補(bǔ)丁下發(fā)及管理,實(shí)時(shí)監(jiān)控補(bǔ)丁安裝動(dòng)態(tài),讓熱修復(fù)變得更簡(jiǎn)單,更接地氣,玩家不用自己搭建平臺(tái)下發(fā)更新補(bǔ)丁,絕對(duì)是小公司和個(gè)人項(xiàng)目的福音。而且Tinker已經(jīng)平鋪在騰訊系產(chǎn)品中,幾億設(shè)備上運(yùn)行,和大廠共進(jìn)退,不用擔(dān)心沒(méi)人維護(hù),有問(wèn)題無(wú)法解決。如果你暫時(shí)沒(méi)有找到合適的,可以一試。
就像阿里技術(shù)的萬(wàn)壑說(shuō)的,專業(yè)的事情交給專業(yè)的人去做,開(kāi)發(fā)者應(yīng)該把更多的經(jīng)歷放到自己的核心業(yè)務(wù)之中。
TinkerDemo
