Bugly热修复实践
纸上得来终觉浅,绝知此事要躬行
文章目录
前言
热修复技术之前有所了解,but之前的项目都没有进行过实际应用。最近通过一个demo 应用进行了实践,在此进行一下学习记录,也希望能为正在想接入bugly热修复的XDJM提供一点帮助。
一、热修复简单介绍
热修复(也称热补丁、热修复补丁,英语:hotfix)是一种小体积的独立的累积更新包,通常表现为一个或多个文件。通常用来解决线上软件产品的bug,而不需要进行重新发版,可以做到用户无感知修复bug,是一种快速、低成本修复产品软件版本缺陷的方式。
关于热修复的原理以及阿里系,腾讯系,美团等的热修复方案就不再说了,感兴趣的可以自行查阅相关资料,本文重点是以bugly进行项目实践。
二、接入步骤
接入前先说明两点:
- 由于bugly 依赖Tinker ,但是现在tinker还不支持4.x ,所以大家需要降低gradle版本编译。
- 如果你的项目minSdkVersion >=21 ,可以去除MultiDex 的依赖包以及其他配置,这个是为了兼容 5.0以下用到的,目前5.0以下手机可以忽略了,微信等大部分应用的minSdkVersion 都要求21以上了。
1.工程根目录build.gradle配置
工程根目录下“build.gradle”文件中如下配置:
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1' //采用低版本的
classpath "com.tencent.bugly:tinker-support:1.2.2"
}
2.app目录build.gradle配置
配置如下:
......
dependencies {
implementation 'com.tencent.bugly:crashreport_upgrade:latest.release'
implementation 'com.tencent.tinker:tinker-android-lib:latest.release'
}
// 依赖插件脚本
apply from: 'tinker-support.gradle'
......
tinker-support.gradle内容如下所示、:
apply plugin: 'com.tencent.bugly.tinker-support'
def bakPath = file("${buildDir}/bakApk/")
/**
* 此处填写每次构建生成的基准包目录
*/
def baseApkDir = "app-0302-17-36-15" //编译base时 置为空 , 编译补丁包时选择基准包目录
/**
* 对于插件各参数的详细解析请参考 如果没有特殊需求下面的参数都可以不用更改;
* 如果apk需要加固等可以参考具体描述设置参数
*/
tinkerSupport {
// 开启tinker-support插件,默认值true
enable = true
// 指定归档目录,默认值当前module的子目录tinker
autoBackupApkDir = "${bakPath}"
//建议设置true,用户就不用再自己管理tinkerId的命名,插件会为每一次构建的base包自动生成唯一的tinkerId,
autoGenerateTinkerId = true
// 是否启用覆盖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"
// 构建多渠道补丁时使用
buildAllFlavorsDir = "${bakPath}/${baseApkDir}"
// 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)
isProtectedApp = false
// 是否开启反射Application模式
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}/${baseApkDir}/app-release.apk"
ignoreWarning = false
useSign = true
dex {
dexMode = "jar"
pattern = ["classes*.dex"]
loader = []
}
lib {
pattern = ["lib/*/*.so", "src/main/jniLibs/*/*.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&#