1. 程式人生 > >Android Tinker 熱更新

Android Tinker 熱更新

磚友們首先要了解為什麼要熱更新?

此博文直接整合熱更新

當一個App釋出之後,突然發現了一個嚴重bug需要進行緊急修復,這時候公司各方就會 忙得焦頭爛額:重新打包App、測試、向各個應用市場和渠道換包、提示使用者升級、使用者下 載、覆蓋安裝。有時候僅僅是為了修改了一行程式碼,也要付出巨大的成本進行換包和重新發 布。 這時候就提出一個問題:有沒有辦法以補丁的方式動態修復緊急Bug,不再需要重新發布 App,不再需要使用者重新下載,覆蓋安裝? 線上程式出現Bug,在不想重新發布包讓使用者更新安裝的情況下,可以使用熱修復,讓使用者 在不知不覺就修復了程式的問題.

熱更新不需要去Tinker下載SDK....所以方便很多

1.需要簽名,需要簽名,需要簽名,需要簽名(重要的事情說N遍)

2.匯入依賴

implementation 'com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.8'
apply from: 'tinkerpatch.gradle'  //在build.gradle上方寫入

3.我們需要在根gradle中寫入

classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.8"

4.建立一個名叫SampleApplication  需要繼承Application程式碼如下

private ApplicationLike tinkerApplicationLike;

@Override
public void onCreate() {
    super.onCreate();
    // 我們可以從這裡獲得Tinker載入過程的資訊
    tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();

    // 初始化TinkerPatch SDK, 更多配置可參照API章節中的,初始化SDK
    TinkerPatch.init(tinkerApplicationLike)
            .reflectPatchLibrary()
            .setPatchRollbackOnScreenOff(true)
            .setPatchRestartOnSrceenOff(true)
            .setFetchPatchIntervalByHours(3);

    // 每隔3個小時(通過setFetchPatchIntervalByHours設定)去訪問後臺時候有更新,通過handler實現輪訓的效果
    TinkerPatch.with().fetchPatchUpdateAndPollWithInterval();
}

5.建立一個名叫tinkerpatch.gradle的檔案 用於Tinker的構建

apply plugin: 'tinkerpatch-support'

/**
 * TODO: 請按自己的需求修改為適應自己工程的引數
 *  app-1.0-0913-16-56-54 是你自己apk檔案 每次編譯工程的時候都會有apk檔案
 * 需要注意的是 app-1.0-0913-16-56-54  你是要修補Bug的apk檔案 
 */
def bakPath = file("${buildDir}/bakApk/")
def baseInfo = "app-1.0-0913-16-56-54"
def variantName = "debug"

/**
 * 對於外掛各引數的詳細解析請參考
 * http://tinkerpatch.com/Docs/SDK
 */
tinkerpatchSupport {
    /** 可以在debug的時候關閉 tinkerPatch **/
    /** 當disable tinker的時候需要新增multiDexKeepProguard和proguardFiles,
     這些配置檔案本身由tinkerPatch的外掛自動新增,當你disable後需要手動新增
     你可以copy本示例中的proguardRules.pro和tinkerMultidexKeep.pro,
     需要你手動修改'tinker.sample.android.app'本示例的包名為你自己的包名, com.xxx字首的包名不用修改
     **/
    tinkerEnable = true
    reflectApplication = true
    /**
     * 是否開啟加固模式,只能在APK將要進行加固時使用,否則會patch失敗。
     * 如果只在某個渠道使用了加固,可使用多flavors配置
     **/
    protectedApp = false
    /**
     * 實驗功能
     * 補丁是否支援新增 Activity (新增Activity的exported屬性必須為false)
     **/
    supportComponent = true

    autoBackupApkPath = "${bakPath}"

    appKey = "去Tinker官網建立的App的Id"

    /** 注意: 若釋出新的全量包, appVersion一定要更新 **/
    appVersion = "1.0"		//需要修補Bug的版本號

    def pathPrefix = "${bakPath}/${baseInfo}/${variantName}/"
    def name = "${project.name}-${variantName}"

    baseApkFile = "${pathPrefix}/${name}.apk"
    baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
    baseResourceRFile = "${pathPrefix}/${name}-R.txt"

    /**
     *  若有編譯多flavors需求, 可以參照: https://github.com/TinkerPatch/tinkerpatch-flavors-sample
     *  注意: 除非你不同的flavor程式碼是不一樣的,不然建議採用zip comment或者檔案方式生成渠道資訊(相關工具:walle 或者 packer-ng)
     **/
}

/**
 * 用於使用者在程式碼中判斷tinkerPatch是否被使能
 */
android {
    defaultConfig {
        buildConfigField "boolean", "TINKER_ENABLE", "${tinkerpatchSupport.tinkerEnable}"
    }
}

/**
 * 一般來說,我們無需對下面的引數做任何的修改
 * 對於各引數的詳細介紹請參考:
 * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
 */
tinkerPatch {
    ignoreWarning = false
    useSign = true
    dex {
        dexMode = "jar"
        pattern = ["classes*.dex"]
        loader = []
    }
    lib {
        pattern = ["lib/*/*.so"]
    }

    res {
        pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
        ignoreChange = []
        largeModSize = 100
    }

    packageConfig {
    }
    sevenZip {
        zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
//        path = "/usr/local/bin/7za"
    }
    buildConfig {
        keepDexApply = false
    }
}

6.在MainActivity中寫入下拉補丁的方法

//主動拉一下補丁
TinkerPatch.with().fetchPatchUpdate(true);

7.基本的整合部分就完成了

現在我們需要去Tinker官網去建立App,沒註冊的磚友需要註冊賬號

8.建立完畢以後,我們需要生成舊程式碼的apk包

在黑視窗中敲入gradlew assembleRelease生成舊的apk包

9.生成差異包

gradlew tinkerPatchRelease

gradlew tinkerPatchDebug

上面倆行程式碼任意一下就可以

10.生成差異包,以後,會提示你存放的路徑

11.在自己的電腦中找到相對應的路徑

12.cp到桌面,進入Tinker官網上傳差異包,上傳補丁

13.最重要的一步,執行程式,檢視Tinker官網更新成功補丁的數量,成功了就好了

14.注意:一切步驟都完成以後,第一次重啟專案不會生效,第二次啟動專案才可以

想了解更多技術點?