Android热更新之微信Tinker集成接入Bugly热更新
最近公司项目中需要集成热更新功能,由于刚开始接入的时候踩了很多坑,所以现在记录一下集成的过程. 集成过程参考了Bugly官方文档热更新使用指南https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20170815114059热更新是Bugly为解决开发者紧急修复线上bug,而无需重新发版让用户无感知就能把问题修复的一项能力。Bugly目前采用微信Tinker的开源方案,开发者只需要集成我们提供的SDK就可以实现自动下载补丁包、合成、并应用补丁的功能,提供了热更新管理后台让开发者对每个版本补丁进行管理。 为什么使用Bugly热更新? 无需关注Tinker是如何合成补丁的 无需自己搭建补丁管理后台 无需考虑后台下发补丁策略的任何事情 无需考虑补丁下载合成的时机,处理后台下发的策略 提供了更加方便集成Tinker的方式 通过HTTPS及签名校验等机制保障补丁下发的安全性 丰富的下发维度控制,有效控制补丁影响范围 提供了应用升级一站式解决方案第一步:添加插件依赖 工程根目录下“build.gradle”文件中添加: buildscript { repositories { jcenter() } dependencies { // tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4 classpath"com.tencent.bugly:tinker-support:latest.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" //其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.2.0 compile'com.tencent.bugly:crashreport_upgrade:latest.release' //其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.2.0 compile'com.tencent.bugly:nativecrashreport:latest.release' }在app module的“build.gradle”文件中添加: // 依赖插件脚本 apply from: 'tinker-support.gradle'tinker-support.gradle内容如下所示:注:需要在app module下创建tinker-support.gradle这个文件 apply plugin: 'com.tencent.bugly.tinker-support' def bakPath = file("${buildDir}/bakApk/") /** * 此处填写每次构建生成的基准包目录 */ def baseApkDir = "app-0908-17-42-31" /** * 对于插件各参数的详细解析请参考 */ tinkerSupport { // 开启tinker-support插件,默认值true enable = true // 指定归档目录,默认值当前module的子目录tinker autoBackupApkDir = "${bakPath}" // 编译补丁包时,必需指定基线版本的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 = "base-1.0.4" tinkerId = "patch-1.0.4" // 是否启用覆盖tinkerPatch配置功能,默认值false // 开启后tinkerPatch配置不生效,即无需添加tinkerPatch overrideTinkerPatchConfiguration = true // 构建多渠道补丁时使用 // buildAllFlavorsDir = "${bakPath}/${baseApkDir}" //支持加固需要添加的属性 isProtectedApp = true // 是否开启反射Application模式 enableProxyApplication = 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"] } 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的分配 } }第三步:初始化SDK ...