1. 程式人生 > >BuglyTinker詳細介紹(圖文詳解)

BuglyTinker詳細介紹(圖文詳解)

雖然Bugly官網有一些tinker的接入教程,但由於各個版本的不一樣,有些地方稍微有一點點前後不對應,Tinker支援加固apk熱修復,360加固也支援,能夠修改四大元件,也能新增Activity.
**

Tinker原理:

**
Tinker的方案對比其他方案為什麼會有那麼多好處?主要是因為Tinker採用的是全量Dex替換策略,這樣不但可以避免ART地址錯亂問題,也可以解決在Dalvik上需要插樁的麻煩,tinkerPatch直接使用基準apk包與新編譯出來的apk包做差異,得到最終的補丁包。在執行的時候,將差異的patch.dex重新跟原始安裝包裡的Dex組合為新Dex。在啟動的時候ClassLoader會載入最新的Dex,這樣就做到了熱修復,除了可以用來修復bug,甚至一些new feature也可以使用tinker來發布。為了保證patch.dex比較小,微信團隊自研了DexDiff演算法可以做到非常小的差量包。為了保證dex合併的效能,Tinker會在後臺啟動一個patch Process來進行dex合併,讓使用者感知不到,在下次啟動的時候,新的dex就會生效。

Tinker原理圖

為什麼要用Tinker

**

Tinker接入步驟:

**

第一步:新增外掛依賴

工程根目錄下“build.gradle”檔案中新增:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // tinkersupport外掛, 其中lastest.release指拉取最新版本,也可以指定明確版本號
        classpath "com.tencent.bugly:tinker-support:lastest.release"
    }
}

第二步:整合SDK

gradle配置

在app module的“build.gradle”檔案中新增(示例配置):

  android {
        defaultConfig {
          ndk {
            //設定支援的SO庫架構
            abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
          }
        }
      }
      dependencies {
          compile "com.android.support:multidex:1.0.1"
// 多dex配置 compile 'com.tencent.bugly:crashreport_upgrade:latest.release' compile 'com.tencent.bugly:nativecrashreport:latest.release' }

第三步:工程中建立tinker-support.gradle檔案

新建tinker-support.gradle檔案

apply plugin: ‘com.tencent.bugly.tinker-support’

def bakPath = file(“${buildDir}/bakApk/”)

/**
* 此處填寫每次構建生成的基準包目錄
*/
def baseApkDir = “app-1225-11-11-11”

/**
* 對於外掛各引數的詳細解析請參考
*/
tinkerSupport {

// 開啟tinker-support外掛,預設值true
enable = true

// 指定歸檔目錄,預設值當前module的子目錄tinker
autoBackupApkDir = "${bakPath}"

// 是否啟用覆蓋tinkerPatch配置功能,預設值false
// 開啟後tinkerPatch配置不生效,即無需新增tinkerPatch
overrideTinkerPatchConfiguration = true

// 編譯補丁包時,必需指定基線版本的apk,預設值為空
// 如果為空,則表示不是進行補丁包的編譯
// @{link tinkerPatch.oldApk }
baseApk = "${bakPath}/${baseApkDir}/app-release.apk"

// 對應tinker外掛applyMapping
baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"

// 對應tinker外掛applyResourceMapping
baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"

// 構建基準包和補丁包都要指定不同的tinkerId,並且必須保證唯一性
tinkerId = "patch-1.0.0"

// 構建多渠道補丁時使用
// buildAllFlavorsDir = "${bakPath}/${baseApkDir}"

// 是否啟用加固模式,預設為false.(tinker-spport 1.0.7起支援)
 isProtectedApp = true

// 是否開啟反射Application模式,一般設定成false,相容性好
enableProxyApplication = false

// 是否支援新增非export的Activity(注意:設定為true才能修改AndroidManifest檔案)
supportHotplugComponent = true

}

/**
* 一般來說,我們無需對下面的引數做任何的修改
* 對於各引數的詳細介紹請參考:
* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
*/
tinkerPatch {
//oldApk =”bakPath/{appName}/app-release.apk”
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
tinkerId = “1.0.1-base”
//applyMapping = “bakPath/{appName}/app-release-mapping.txt” // 可選,設定mapping檔案,建議保持舊apk的proguard混淆方式
//applyResourceMapping = “bakPath/{appName}/app-release-R.txt” // 可選,設定R.txt檔案,通過舊apk檔案保持ResId的分配
}
}

切記每次打包時記得修改tinkerId
建立完成後在app module的“build.gradle”檔案中新增:

// 依賴外掛指令碼
apply from: ‘tinker-support.gradle’
“`

第四步:生成基準包

這裡寫圖片描述

第五步:生成補丁包

這裡寫圖片描述

第六步:釋出補丁

這裡寫圖片描述

這裡寫圖片描述