【Android進(jìn)階】1小時(shí)學(xué)會(huì)熱更新--Tinker

Tinker

玩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)單比較

image.png

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

image.png

image.png

image.png

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

工程目錄下添加插件


image.png
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

image.png

第二步: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

image.png

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

發(fā)布補(bǔ)丁

實(shí)時(shí)監(jiān)控

總結(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

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

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

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