Android Tinker 熱更新
阿新 • • 發佈:2018-12-09
磚友們首先要了解為什麼要熱更新?
此博文直接整合熱更新
當一個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
上面倆行程式碼任意一下就可以