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接入步驟:
**
第一步:新增外掛依賴
工程根目錄下“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檔案
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 =”
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 = “
//applyResourceMapping = “
}
}
切記每次打包時記得修改tinkerId
建立完成後在app module的“build.gradle”檔案中新增:
// 依賴外掛指令碼
apply from: ‘tinker-support.gradle’
“`