作为程序猿,在日常开发中,难免会脑子一抽,埋下一个不能称为bug的bug,又或者不小心打包上传市场的时候,忽略了一些东西。市场上已经更新了,怎么办呢?重新修改bug,升级版本重新打包上传市场,成本太高了。我就深受其害,最近连续三天,一天一个新版本,可谓煎熬。痛定思痛,一定要接入热更新,所以有了下面三篇文章:
二、Bugly热更新+Walle(瓦力)多渠道打包解决方案
三、Bugly热更新+Walle(瓦力)多渠道打包+应用加固解决方案
关于热更新的介绍和选择,这里就不多说了,网上有很多相关的文章,大家想了解的可以去问下度娘。这里主要介绍一下腾讯Bugly。
一、Bugly的接入:
具体可以参考Bugly官方文档:Bugly Android热更新使用指南,个人感觉文档还是很详细的,按照上面步骤接入非常简便:
第一步:添加插件依赖
工程根目录下“build.gradle”文件中添加:
buildscript {
repositories {
jcenter()
}
dependencies {
// tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
classpath "com.tencent.bugly:tinker-support:1.1.2"
}
}
注意:自tinkersupport 1.0.3版本起无需再配tinker插件的classpath。
第二步:集成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:1.3.6'
// 指定tinker依赖版本(注:应用升级1.3.5版本起,不再内置tinker)
compile 'com.tencent.tinker:tinker-android-lib:1.9.9'
compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.2.0
}
后续更新升级SDK时,只需变更配置脚本中的版本号即可。
注意: 升级SDK已经集成crash上报功能,已经集成Bugly的用户需要注释掉原来Bugly的jcenter库; 已经配置过符号表的Bugly用户保留原有符号表配置; Bugly SDK(2.1.5及以上版本)已经将Java Crash和Native Crash捕获功能分开,如果想使用NDK库,需要配置: compile ‘com.tencent.bugly:nativecrashreport:latest.release’
在app module的“build.gradle”文件中添加:
// 依赖插件脚本
apply from: ‘tinker-support.gradle’
注:您需要在同级目录下创建tinker-support.gradle这个文件哦。
tinker-support.gradle内容如下所示(示例配置):
apply plugin: 'com.tencent.bugly.tinker-support'
def bakPath = file("${buildDir}/bakApk/")
/**
此处填写每次构建生成的基准包目录
*/
def baseApkDir = "app-0208-15-10-00"
/**
* 对于插件各参数的详细解析请参考
*/
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 = "base-1.0.1"
// 构建多渠道补丁时使用
// buildAllFlavorsDir = "${bakPath}/${baseApkDir}"
// 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)
// isProtectedApp = true
// 是否开启反射Application模式
enableProxyApplication = false
// 是否支持新增非export的Activity