Bugly热更新是腾讯推出的热更新框架,热更新是指无需到应用市场重新下载安装app,只需要在app内下载补丁包即可实现app的更新,主要用于app的bug修复或者少量改动。

大家在使用app(特别是游戏app比较常见)的时候应该都有过类似经历:打开app时,一个弹框显示:有新的更新包,点击下载,只需要下载几百KB或几兆的补丁包,app就实现了更新,这就是使用的热更新技术。

Bugly热更新官方接入文档:https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20180709165613

一、添加插件依赖

工程根目录下“build.gradle”文件中添加:

buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.tencent.bugly:tinker-support:1.1.5"
}
}

二、gradle配置

先生成一个jks密钥,然后在app module的“build.gradle”文件中添加(示例配置):

android {
defaultConfig {
ndk {
abiFilters 'armeabi'
}
signingConfigs {
release {
storeFile file(jks密钥库路径)
storePassword 密钥库密码
keyAlias 密钥名
keyPassword 密钥密码
}
}
buildTypes {
release {
//应用签名信息
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
}
dependencies {
implementation 'com.android.support:design:27.1.1'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.tencent.bugly:crashreport_upgrade:1.3.5'
implementation 'com.tencent.tinker:tinker-android-lib:1.9.6'
implementation 'com.tencent.bugly:nativecrashreport:2.2.0'
}

三、新建tinker-support.gradle

在app module下新建tinker-support.gradle,内容如下:

apply plugin: 'com.tencent.bugly.tinker-support'

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

/**
* 此处填写每次构建生成的基准包目录
*/
def baseApkDir = "app-0719-23-18-50" /**
* 对于插件各参数的详细解析请参考
*/
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.3" // 构建多渠道补丁时使用
// buildAllFlavorsDir = "${bakPath}/${baseApkDir}" // 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)
// isProtectedApp = true // 是否开启反射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}/${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 =
} 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的分配
}
}

建立完成后,在app module中的build.gradle文件中添加:

apply from: 'tinker-support.gradle'

四、初始化SDK

先在Bugly管理平台:https://bugly.qq.com/v2/上申请appId,注册账户后登录,点击新建产品:

然后在我的产品–>设置中可以看到appId

五、AndroidManifest.xml配置

在AndroidMainfest.xml中进行以下配置:

  1. 权限配置
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  1. Activity配置
  <!-- Bugly升级SDK配置开始  -->
<activity
android:name="com.tencent.bugly.beta.ui.BetaActivity"
android:configChanges="keyboardHidden|orientation|screenSize|locale"
android:theme="@android:style/Theme.Translucent"/>

3.配置FileProvider

先在res目录新建xml文件夹,创建provider_paths.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="beta_external_path"
path="Download/" />
<external-path
name="beta_external_files_path"
path="Android/data/" />
</paths>

在AndroidManifest中配置FileProvider:

<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>

六、混淆配置:

如果开启了混淆,在proguard-rules.pro文件中添加以下混淆规则:

# bugly混淆规则
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
# tinker混淆规则
-dontwarn com.tencent.tinker.**
-keep class com.tencent.tinker.** { *; }
# v4包混淆规则
-keep class android.support.**{*;}

七、生成基准包

我们对基准包和补丁包做一个简单的测试,在基准包的MainActivity中显示一个TextView,文字为“基准包”,补丁包中将其显示文字修改为“补丁包”。

基准包:运行app,显示如下:
      

运行成功后,10分钟左右、在Bugly管理后台的我的产品–>版本管理界面可以看到如下显示:

生成基准包:

点击图示位置的assembleRelease,生成基准包,完成后在下图位置可以看到app_release.apk

在手机联网状态下,安装此基准包,否则上传补丁包时会报错:“未匹配到可应用补丁包的App版本,请确认补丁包的基线版本是否配置正确”

八、生成补丁包

修改MainActivity中的代码:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tv_test.text = "补丁包"
}
}

生成补丁包:
1.先将tinker-support.gradle中的baseApkDir修改为第七步生成的apk文件夹名
2.再将tinkerId修改为patch-1.0.0
3.然后点击下图位置的buildTinkerPatchRelease生成补丁包

生成的补丁包在这里:

这里注意路径不要找错了,是patch/release文件夹下的patch_signed_7zip.apk,而不是apk/tinkerPatch/release文件夹下的patch_signed_7zip.apk,如果上传apk文件夹下的补丁包,Bugly管理平台会报错:“上传失败!补丁文件缺失必需字段:Created-Time、Created-By、YaPatchType、VersionName、VersionCode、From、To,请检查补丁文件后重试!

九、上传补丁包,见证热更新

在Bugly管理后台的 应用升级 --> 热更新 中,点击发布新补丁:

上传patch/release文件夹下的patch_signed_7zip.apk:

上传成功后,显示如下:

然后我们静静等待热更新生效,生效时间大概十分钟,生效之后显示如下:

源码地址:https://gitee.com/anan9303/TinkerFix

参考地址:https://blog.csdn.net/AlpinistWang/article/details/84248026#_8

Android 腾讯bugly Tinker 热修复的更多相关文章

  1. 微信tinker 热修复

    Tinker 是微信官方的Android热补丁解决方案,它支持动态下发代码.So库以及资源,让应用能够在不需要重新安装的情况下实现更新.当然,你也可以使用Tinker来更新你的插件. github:h ...

  2. android--------微信 Tinker 热修复 (三)

    前面简单介绍了一下Tinker热修复的使用,包含debug和release,今天就来分享一下微信针对Tinker热修复提供的一个平台,TinkerPatch补丁管理后台. 1:什么是TinkerPat ...

  3. android--------微信 Tinker 热修复 (二)

    前面简单介绍了一下Tinker热修复,今天就来分享一下如何在Android中使用,希望对各位有帮助. 1:Tinker 接入指南 在项目的build.gradle中,添加tinker-patch-gr ...

  4. Tinker 热修复框架 简单上手教程

    当你们看到Tinker的时候是不是有点愣逼这个是什么东西? 简单来说就是不需要重新下载app和重新安装app 来进行更新app的技术框架. 看看这个吧,我也是才学习 ,先做个学习记录 参考:Tinke ...

  5. Tinker 热修复

    集成方式: 第一步:在project  build.gradle 文件中添加: dependencies { // Tinker classpath("com.tinkerpatch.sdk ...

  6. android--------微信 Tinker 热修复 (一)

    什么是热修复 热修复补丁(hotfix),又称为patch,指能够修复软件漏洞的一些代码,是一种快速.低成本修复产品软件版本缺陷的方式. 热修复有多种,如:Tinker ,QZone,Andfix, ...

  7. Tinker热修复

    集成buggly热修复的时候报错 Error:A problem occurred configuring project ‘:app’. Failed to notify project evalu ...

  8. Android 热修复 Tinker接入及源码浅析

    一.概述 放了一个大长假,happy,先祝大家2017年笑口常开. 假期中一行代码没写,但是想着马上要上班了,赶紧写篇博客回顾下技能,于是便有了本文. 热修复这项技术,基本上已经成为项目比较重要的模块 ...

  9. Android 热修复 Tinker接入及源代码浅析

    本文已在我的公众号hongyangAndroid首发.转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/54882693本文出自张鸿 ...

随机推荐

  1. BeanFactory 和FactoryBean的区别

    转自:https://www.cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是 ...

  2. OpenStack组件——Neutron网络服务(2)

    1.虚拟机获取 ip 1)用 namspace 隔离 DHCP 服务 Neutron 通过 dnsmasq 提供 DHCP 服务,而 dnsmasq 通过 Linux Network Namespac ...

  3. dll的封装和使用

    背景 在windows平台下,要实现函数的封装,一般采用的是dll动态库的形式 实现了函数的封装就意味着实现过程的隐藏 可以实现跨平台和跨语言的使用 实施步骤 生成dll动态库 在VS中生成新项目,应 ...

  4. 让mysql的id字段变成表的主键

    1.#已经加主键 desc szdj.sys_message_user;alter table sys_message_user add constraint pk_mess_user primary ...

  5. 生成一个水平+垂直居中的div

    这是前端布局经常用到的布局方式,水平垂直居中:面试也经常会问到. 一. 绝对定位实现居中 注意:使用绝对定位布局的时候,外层元素必须也设置有position属性,具体设置为什么值看具体情况.只要不是s ...

  6. [转帖]微软 SQL Server 2008/R2 停止支持

    微软 SQL Server 2008/R2 停止支持 微软停止支持 SQLSERVER 2008R2 https://t.cj.sina.com.cn/articles/view/3172142827 ...

  7. [转帖]ASML发布Q1季度财报 营收22.3亿欧元,EUV光刻机下半年产能大增 ...

    ASML发布Q1季度财报营收22.3亿欧元,EUV光刻机下半年产能大增 ... 孟宪瑞发布于2019-4-18 10:32 https://www.expreview.com/67969.html 一 ...

  8. python基础面试题(全网最全!)

    目录 1.为什么学习Python? 2.通过什么途径学习的Python? 3.Python和Java.PHP.C.C#.C++等其他语言的对比? 4.简述解释型和编译型编程语言? 5.Python解释 ...

  9. 05 Python网络爬虫的数据解析方式

    一.爬虫数据解析的流程 1.指定url 2.基于requests模块发起请求 3.获取响应中的数据 4.数据解析 5.进行持久化存储 二.解析方法 (1)正则解析 (2)bs4解析 (3)xpath解 ...

  10. 物联网的语言c,python,go等

    日本生鱼片 电热水器的使用方法http://www.hiry.cn/b/mt/33959.html 物联网层次很多,首先要看你从事哪个层级的工作了.既然你问语言,那么肯定是开发类的工作,开发类的对象中 ...