【Android進階】1小時學會熱更新--Tinker

weixin_34365417發表於2017-12-15
1411177-47e75876892547d7.png
Tinker

玩Dota的應該知道

熱更新

熱補丁技術也可以理解為一個動態修改程式碼與資源的通道,它適合於修改量較少的情況。

本文你將獲悉

  • 【主流熱更新框架的簡單比較】
  • 【Tinker能做什麼】
  • 【 Tinker不能做什麼】
  • 【利用Tinker Platform實現熱更新詳細步驟】
  • 複雜的熱更新原理
  • 繁瑣的補丁製作流程
    部分資料來自 tinker官方文件

主流熱更新框架的簡單比較

1411177-86b048395f4f83e4.png
image.png

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

1411177-c701fd3b4e023ab3.png
image.png

1411177-0b7c0f01c0d7b3b7.png
image.png

1411177-6cdadf4ec1762907.png
image.png

Tinker能做什麼

  • 新增刪除類,方法
  • 替換so包
  • 資源替換
  • 修改Activity,包括新增和刪除
  • 結合Tinker Platform熱更新服務平臺進行更新包下發
  • 獲取更新補丁後,在下次APP重啟(執行緒級)時完成更新
    雖然更修改的專案沒多到讓你為所欲為的地步,但也足夠你應付產品經理的蜜汁需求或者關起門來偷偷改自己埋下的小bug,絕對不告訴別人

Tinker不能做什麼

  • Tinker不支援修改AndroidManifest.xml,Tinker不支援新增四大元件(1.9.0支援新增非export的Activity);
  • 由於Google Play的開發者條款限制,不建議在GP渠道動態更新程式碼;
  • 在Android N上,補丁對應用啟動時間有輕微的影響;
  • 不支援部分三星android-21機型,載入補丁時會主動丟擲"TinkerRuntimeException:checkDexInstall failed";
  • 對於資源替換,不支援修改remoteView。例如transition動畫,notification icon以及桌面圖示。

利用Tinker Platform實現熱更新

第一步:配置gradle

工程目錄下新增外掛


1411177-f2c37fa45eda1371.png
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

1411177-c1645c88e6767efb.png
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)
                    //是否自動反射Library路徑,無須手動載入補丁中的So檔案
                    //注意,呼叫在反射介面之後才能生效,你也可以使用Tinker的方式載入Library
                    .reflectPatchLibrary()
                    //設定收到後臺回退要求時,鎖屏清除補丁,預設是等主程式重啟時自動清除
                    .setPatchRollbackOnScreenOff(true)
                    //設定補丁合成成功後,鎖屏重啟程式,預設是等應用自然重啟
                    .setPatchRestartOnSrceenOff(true);
        }
    }
}

在合適的時候獲取補丁

TinkerPatch.with().fetchPatchUpdate(true);

在客戶端獲取補丁後,Tinker會根據配置選擇在鎖屏的時候或者重啟的時候自動完成補丁修補。

第三步:利用外掛生成增量APK

1411177-0e21284d5ba316ec.png
image.png

第四不:上傳到Tinker Platform平臺

1411177-dd4753240c19e625.png
釋出補丁

1411177-bb49579ce20739f3.png
實時監控

總結

  • 在一個基礎包上可以新增多個補丁
    為什麼要選Tinker?
  • 傻瓜式一鍵生成補丁,AndFix要用apkpatch工具配合命令生成.patch檔案
  • 長期維護
  • 長江後浪推前浪,吸取主流框架的經驗和教訓,獨創補丁演算法
  • 有信心把熱更新做成商業級產品,還有誰

一個框架如果沒有良好的維護,那麼最開始就不要使用或者早點棄用,在對比了多個主流熱更新框架的github上的star數,未解決的issues數後,你就會知道,其實Tinker現在【根本】【沒有】【對手】

一個好的框架應該也是一個容易使用的框架,我們的目的是拿來能直接幹活,如果使用過於複雜,過多的時間用在了研究原理上就得不償失了,畢竟熱修復不是簡單的東西。比起其它熱修復框架,Tinker最大優勢是多了平臺支援,可支援補丁下發及管理,實時監控補丁安裝動態,讓熱修復變得更簡單,更接地氣,玩家不用自己搭建平臺下發更新補丁,絕對是小公司和個人專案的福音。而且Tinker已經平鋪在騰訊系產品中,幾億裝置上執行,和大廠共進退,不用擔心沒人維護,有問題無法解決。如果你暫時沒有找到合適的,可以一試。

就像阿里技術的萬壑說的,專業的事情交給專業的人去做,開發者應該把更多的經歷放到自己的核心業務之中。

TinkerDemo

1411177-ab4f39d2306f8555.png
image.png

相關文章