Tinker热修复使用总结

Tencent Tinker:移动应用热修复的未来之路 Tencent Tinker是腾讯公司开发的一款移动应用热修复框架,旨在帮助开发者快速修复线上应用的bug、漏洞和功能问题。它提供了一套强大的工具和机制,使得开发者能够在不影响用户体验的情况下进行实时修复和功能更新。Tencent Tinker的出现解决了传统应用修复需要重新发布整个应用的痛点,有效提升了开发效率和用户体验。 阅读详情

Tinker的使用记录与总结

1. 使用场景(为什么使用热修复?)

在开发过程中,我们经常遇到一些小的且必须及时解决的线上bug,常用的方法就是更新一个版本,推送到用户强制更新。

例:公司项目3.0.0版本上线后,遇到用户不能使用流量下载的bug,我们只能推出了3.0.1版本修复了此bug。

如果使用了热修复技术,我们就可以在不升级版本的情况下解决此问题。

 

2.为什么使用Tinker?

 

Tinker

QZone

AndFix

Robust

类替换

yes

yes

no

no

So替换

yes

no

no

no

资源替换

yes

yes

no

no

全平台支持

yes

yes

no

yes

即时生效

no

no

yes

yes

性能损耗

较小

较大

较小

较小

补丁包大小

较小

较大

一般

一般

开发透明

yes

yes

no

no

复杂度

较低

较低

复杂

复杂

Rom体积

Dalvik较大

较小

较小

较小

成功率

较高

较高

一般

最高

研发实力雄厚;Tinker 在微信的数亿用户上得到验证,它的稳定性与性能值得信赖。

第三方支持平台多:TinkerPatch, Bugly,Tinker-Manager,tinker-dex-dump等方便对Tinker进行使用及调试。

下面以TinkerPatch为例:

附上链接:http://www.tinkerpatch.com/

 

在TinkerPatch后台申请appKey(申请步骤略过):

 

3.TinkerPatch的使用

1)添加Gradle插件依赖(project下的build.gradle)

dependencies { classpath ("com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:${TINKERPATCH_VERSION}") { changing = true } }

2)添加 TinkerPatch SDK 库的 denpendencies 依赖(app下的build.gradle)

annotationProcessor("com.tinkerpatch.tinker:tinker-android-anno:${TINKER_VERSION}") { changing = true }
compileOnly("com.tinkerpatch.tinker:tinker-android-anno:${TINKER_VERSION}") { changing = true } 
implementation("com.tinkerpatch.sdk:tinkerpatch-android-sdk:${TINKERPATCH_VERSION}") { changing = true }

为了简单方便,我们将 TinkerPatch 相关的配置都放于 tinkerpatch.gradle 中, 我们需要将其引入

apply from: 'tinkerpatch.gradle'

 

3)在gradle.properties添加版本信息,方便更新版本

TINKERPATCH_VERSION=1.2.2 
TINKER_VERSION=1.9.2

4) 配置 tinkerpatchSupport 参数,打开引入的 tinkerpatch.gradle,如图:

apply plugin: 'tinkerpatch-support'

def bakPath = file("${buildDir}/bakApk/")
def baseInfo = "app-3.1.0-1203-16-00-22"
def variantName = "primary-release"

/**
 * 对于插件各参数的详细解析请参考
 * http://tinkerpatch.com/Docs/SDK
 */
tinkerpatchSupport {
    /** 可以在debug的时候关闭 tinkerPatch **/
    tinkerEnable = true
    reflectApplication = true

    autoBackupApkPath = "${bakPath}"

    /** 是否开启加固模式,只有在使用加固时才能开启此开关 **/
    protectedApp = true

    appKey = "这里替换成TinkerPatch后台的Appkey"
    appVersion = "3.1.0"

    def pathPrefix = "${bakPath}/${baseInfo}/${variantName}/"
    def name = "${project.name}-${variantName}"

    baseApkFile = "${pathPrefix}/${name}.apk"
    baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
    baseResourceRFile = "${pathPrefix}/${name}-R.txt"

//    baseApkFile = "${bakPath}/app-1.0.0-0118-15-36-58/debug/app-debug.apk"
//    baseProguardMappingFile = "${bakPath}/app-1.0.0-0118-15-36-58/debug/app-debug-mapping.txt"
//    baseResourceRFile = "${bakPath}/app-1.0.0-0118-15-36-58/debug/app-debug-R.txt"

    /** 若有编译多flavors需求,可在flavors中覆盖以下参数
     *  你也可以直接通过tinkerPatchAllFlavorDebug/tinkerPatchAllFlavorRelease, 一次编译所有的flavor补丁包
     *  注意的是:除非你不同的flavor代码是不一样的,不然建议采用zip comment或者文件方式生成渠道信息
     **/
//    productFlavors {
//        flavor {
//            flavorName = "flavor1"
//            appVersion = "${tinkerpatchSupport.appVersion}_${flavorName}"
//
//            pathPrefix = "${bakPath}/${baseInfo}/${flavorName}${variantName}/"
//            name = "${project.name}-${flavorName}${variantName}"
//
//            baseApkFile = "${pathPrefix}/${name}.apk"
//            baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
//            baseResourceRFile = "${pathPrefix}/${name}-R.txt"
//        }
//
//        flavor {
//            flavorName = "flavor2"
//            appVersion = "${tinkerpatchSupport.appVersion}_${flavorName}"
//
//            pathPrefix = "${bakPath}/${baseInfo}/${flavorName}${variantName}/"
//            name = "${project.name}-${flavorName}${variantName}"
//
//            baseApkFile = "${pathPrefix}/${name}.apk"
//            baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
//            baseResourceRFile = "${pathPrefix}/${name}-R.txt"
//        }
//    }
}

/**
 * 用于用户在代码中判断tinkerPatch是否被使能
 */
android {
    defaultConfig {
        buildConfigField "boolean", "TINKER_ENABLE", "${tinkerpatchSupport.tinkerEnable}"
    }
}

/**
 * 一般来说,我们无需对下面的参数做任何的修改
 * 对于各参数的详细介绍请参考:
 * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
 */
tinkerPatch {
    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
    }
}

5)初始化TinkerPatch SDK。

 public class MyApplication extends MultiDexApplication{
   
   ...
     
    private ApplicationLike tinkerApplicationLike;
    @Override

    public void onCreate() {
        super.onCreate();
        if (BuildConfig.TINKER_ENABLE) {
            // 我们可以从这里获得Tinker加载过程的信息
            tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();
            // 初始化TinkerPatch SDK, 更多配置可参照API章节中的,初始化SDK
            TinkerPatch.init(tinkerApplicationLike)
                    .reflectPatchLibrary()
                    .setPatchRollbackOnScreenOff(true)
                    .setPatchRestartOnSrceenOff(true)
                    .setFetchPatchIntervalByHours(1);
            Log.e("TinkerPatch", "Current patch version is " + TinkerPatch.with().getPatchVersion());
            // 每隔1个小时(通过setFetchPatchIntervalByHours设置)去访问后台时候有更新,通过handler实现轮训的效果
            TinkerPatch.with().fetchPatchUpdateAndPollWithInterval();
            ...
        }
        
        ...
        
    }

注意:初始化的代码建议紧跟 super.onCreate(),并且所有进程都需要初始化,已达到所有进程都可以被 patch 的目的

 

6)生成基类包

运行完毕,之后找到基类包的生成路径。

修改tinkerpatch.gradle中的3个文件路径。

def bakPath = file("${buildDir}/bakApk/")
def baseInfo = "app-3.1.0-1203-16-00-22"
def variantName = "primary-release"

 

7)生成补丁包。在原代码基础上添加任意Toast用来测试补丁是否加载成功(原包里是没有这段Toast的)。

showToast("升级ok!!!!!!!",false);

 

运行结束之后,找到补丁包的位置,如下:

 

8)发布补丁,进入TinkerPatch后台进行配置:

在这里我们选择开发预览,开发预览用于开发测试,不会影响到线上版本。

 

9)先安装第6步生成的基类包,此时是没有Toast代码的,开发者需要在手机上安装测试工具,

附上链接:http://ogmj51oem.bkt.clouddn.com/TinkerDebugTool.apk

打开开关,

再重新打开我们的应用,从后台可以发现补丁已经被下载,需要再次重新打开应用,才会完成合并的操作,在后台我们可以看到补丁的下载数/合成数/应用数,刚刚发布的补丁也只有16.6k:

测试没问题后,选择全量下发,就可以不知不觉的修复线上的bug,并在后台可以实时监控补丁合成情况:

 

 

总结

截止到此,借助TinkerPatch三方平台,初步掌握了热修复的使用,复杂的原理知识还有待学习,凭着他们的官方文档接入SDK时,遇到了很多坑,所以又重新梳理了我在接入和使用Tinker时的步骤和方法,感兴趣的同学可以借鉴看一看。

 

Flutter项目使用Bugly+Tinker实现代码热修复 阅读详情

相关推荐

Android开发:热修复 Tinker 原理分析,Android多态实现原理

Override@Override//安装分包配置分包就创建了一个做模拟异常和修复异常的入口,和一个Calculate模拟异常,做了10/0的操作,修复后为10/1注:获取修复后的文件可以通过直接buildapk直接解压获取,或者用build-tools下的dx.bat执行命令获取简单贴下,点击fix按钮后的代码://将下载的修复包,复制到私有目录,解压从.dex文件中取到对应的.class文件//从sd卡取修复包//目标文件。

2401_84148974的博客 804

Tinker热修复框架详解:Android应用补丁生成,提升应用稳定性

Tinker不仅可以修复代码中的 Bug,还可以进行资源、so 库等的热更新,从而避免频繁发布新的 APK 给用户带来的麻烦。Tinker是腾讯开源的Android热修复框架,通过动态更新 和修复 应用中的代码、资源和本地库文件,无需用户重新安装 APK,便可以及时修复应用中的 bug,优化用户体验。Tinker 是腾讯开源的Android热修复框架,通过动态更新和修复应用中的代码、资源和本地库文件,无需用户重新安装 APK,便可以及时修复应用中的 bug,优化用户体验。

刘 争 3266

热修复框架Tinker的使用

Tinker是腾讯出的一款热修复框架,关于热修复框架Tinker介绍本文就不描述太多了,网络已经很多了 本文主要介绍主要基础的集成使用,本文主要使用Gradle方式集成 Tinker的github地址,详细介绍可以看wiki https://github.com/Tencent/tinker demo的github地址: https://github.com/ZhiLiangT/tink...

码可菠萝的博客 1612

热修复框架Tinker的从0到集成之路

热修复框架Tinker的从0到集成之路 转载请标明出处: http://blog.youkuaiyun.com/lisdye2/article/details/52049857 本文出自:【Alex_MaHao的博客】 项目中的源码已经共享到github,有需要者请移步【Alex_MaHao的github】 2015年10月,QQ空间提出了热修复方案,一时间热修复风靡Android界,阿里

茅屋 6553

Android热修复Tinker原理分析

目录 1、tinker的class文件修复 2、tinker的资源文件修复 3、几种热修复方案对比 1、tinker的class文件修复 1.1、先说dex文件的加载和类的查找过程 1.1.1、dex文件的加载过程 Java层通过我们会通过创建一个DexClassLoader来加载我们的dex,下面就以此为切入点进行 dexClassLoader = new DexClassLoader(apkPath, getFilesDir().getAbsolutePath(), null, getCl

Xiangxue155的博客 1108

Android热修复技术:Tinker实战指南

本文还有配套的精品资源,点击获取 简介:在Android开发中,热修复技术是保持应用稳定性和用户体验的关键。本文详细介绍了如何使用腾讯开源的Tinker进行应用的动态更新,包括集成Tinker、配置Tinker Gradle插件、创建和编译补丁包、服务器端管理和客户端补丁应用等关键步骤。文章还涵盖了测试、调试以及使用Tinker时需要关注的注意事项,确保开发者能够高效地修复...

weixin_29717341的博客 2715

腾讯热修复Tinker的详解和使用

转载请标明出处: [http://blog.youkuaiyun.com/qq_33408235/article/details/78357259](http://blog.youkuaiyun.com/qq_33408235/article/details/78357259) 1. 热修复概述热修复说白了就是”打补丁”,比如你们公司上线一个app,用户反应有重大bug,需要紧急修复。如果按照通 常做法,那就是程序猿

qq_33408235的博客 2198

通义千问语言模型Qwen2.5架构详解

此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。

搏博的专栏 1万+

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

一、概述 放了一个大长假,happy,先祝大家2017年笑口常开。 假期中一行代码没写,但是想着马上要上班了,赶紧写篇博客回顾下技能,于是便有了本文。 热修复这项技术,基本上已经成为项目比较重要的模块了。主要因为项目在上线之后,都难免会有各种问题,而依靠发版去修复问题,成本太高了。 现在热修复的技术基本上有阿里的AndFix、QZone的方案、美团提出的思想方案以及腾讯的Tinker等。

Hongyang 5万+

CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

CELF(Cost-Effective Lazy Forward selection)算法解析      引言:在社交网络影响力最大化问题的求解过程中,我们往往需要去选择一些目标种子结点作为信息初始传播的源头。贪婪算法在传播效果上的解决可以达到影响的最大化,但是在时间复杂度上面显得确十分糟糕。为此CELF算法应势而生,CELF算法利用了函数次模性的特点,在第一轮选择种子结点时,计算网络中所有节点的边际收益,但将在之后的过程中,不再做网络节点边际收益的重复计算,这相对于传统的贪婪算法,将在时间上得到非常明显的

hahaxq的博客 2476

2026年AI编程工作流实战:Claude Code与Open Code深度对比

AI编程已从代码生成工具升级为IDE级智能工作流核心能力。其本质是将大语言模型深度嵌入开发环境,通过语义理解、上下文感知与行动闭环重构传统编码范式。Claude Code以企业级知识图谱和双轨Code Review为代表,强调合规性、可审计与深度集成;Open Code则依托Skill可组合性、本地优先模型与ocp协议,实现开源驱动的灵活扩展。二者共同推动IDE从‘编辑器’进化为‘数字搭档’——能理解RFC文档、记住PR评论、自动补全带重试的fetch逻辑,并在Promise链发呆时一键重构为async/a

weixin_33739523的博客 461

Tinker热修复——Bugly让热修复变得如此简单

前言 不知你是否遇到这样的情况?千辛万苦上开发了一个版本,好不容易上线了,突然发现了一个严重bug需要进行紧急修复,怎么办?难道又要重新打包App、测试,发布新个版本?就为了修改一两行的代码? 莫慌,这种问题其实可以分分钟解决。如果你学会了这项黑科技——热修复。 在用户使用App的时候,不知不觉,这个Bug就被修复了。 介绍 当下热修复框架的种类繁多,其中有名的包括阿里的AndFix,微信的Tin...

智玲君 2525

计算机网络自顶向下(第八版)第一章课后习题

电路交换网络具有以下优点:资源独占性,在建立连接时,电路交换网络为通信双方独占一条物理路径,不会受到其他用户的影响。低时延,由于建立了专用路径,数据传输时延较小,适合对时延敏感的应用,如实时语音和视频通信。数据链路层:提供节点之间可靠的数据传输,主要任务是错误检测和纠正,以及数据帧的传输和访问控制。移动蜂窝网络:如4G LTE和5G,通过移动基站提供的无线信号实现移动设备的互联网接入。网络层:负责数据包的路由和转发,主要任务是通过网络选择最佳路径,进行流量控制和拥塞控制。手机,服务器,路由器,电脑;

hiahiakk的博客 2255

Android热修复之微信Tinker使用初探

Tinker Android 热修复 微信团队 ClassLoader AndFix Nuwa

乌云然的博客 1万+

2026年经典爬虫案例专栏|第17篇:学术论文爬虫实战——知网与万方数据采集

字段名说明数据类型title论文标题字符串authors作者列表列表abstract摘要字符串keywords关键词列表列表journal发表期刊字符串year发表年份整数volume卷号字符串issue期号字符串pages页码范围字符串citations引用次数整数downloads下载次数整数doiDOI编号字符串url论文链接字符串学术论文爬虫是科研工作的重要辅助工具,可以帮助研究人员高效地收集和管理论文数据。

2201_76125261的博客 1062

Modbus RTU 详解 + FreeMODBUS移植(附项目源码)

本文全面解析Modbus RTU通信协议,详细介绍其报文格式、功能码定义及典型应用场景,并手把手指导如何将FreeMODBUS协议栈移植到嵌入式平台。内容涵盖从底层硬件驱动配置、协议栈移植到主机/从机通信测试的全流程,重点讲解移植过程中的常见问题及解决方案。文章最后提供经过实测的完整项目源码,帮助开发者快速实现稳定的Modbus RTU通信功能。

Bit_Dong的博客 2926

Tinker热修复使用

关于热修复为什么使用热修复 1、项目中使用Tinker热修复 1.首先前往TinkerPatch平台注册账号,添加你的APP 并记下你的appkey Tinker Patch平台的使用非常简单,我们下一步需要集成 Tinker Patch 平台客户端的SDK。 2、接入Tinker SDK 1、在你的项目级Gradle中添加 gradle 插件依赖 ``` ...

路边那条狗的博客 441

【连接器专题】 EIA-364 系列标准的完整列表

EIA-364 系列标准在电子工业中具有重要的地位,为电子连接器和互连系统的测试和验证提供了统一的、可操作的流程和方法,有助于提高电子产品的质量和可靠性,促进了电子工业的发展

一点硬件 2655

291.Tinker 热修复框架

全量替换:不同于增量式热修复,Tinker 采用全量 dex/lib/resources 替换高兼容性:支持 Android 2.3 到 12低性能损耗:修复后的应用性能几乎无损开源:代码在 GitHub 上完全开源,社区活跃稳定:已在微信、QQ 等大型应用上经过验证Tinker 是一个功能强大的热修复框架,通过全量替换 + 差量分发的方式实现高效热修复。它的优点在于稳定性高、兼容性好,适用于大多数 Android 应用的热修复需求。

2303_79132118的博客 1109

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

微信热修复tinker及tinker server快速接入

微信热修复tinker及tinker server快速接入

心现识变妙莲华 1645

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Tinker热修复

Version:1.0 StartHTML:0000000179 EndHTML:0000127578 StartFragment:0000040205 EndFragment:0000127538 SourceURL:file:///Y:\Desktop\学习\新建文件夹\Tinker热修复.docx Tinker热修复 热修复背景 刚发布的版本出现了严重的Bug,这就需要去解决Bug、测...

weixin_40193331的博客 332

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android集成Tinker热修复

Android开发的各位应该都碰到过这样的问题,我们在项目上线之后,经常会临时被告知某个小功能需要被修改,或者说上线了之后才发现某个bug需要紧急修复,于是总能匆匆忙改了段代码又得上线新的版本,极其麻烦,Tinker 是是微信官方的 Android 热修复解决方案,能让用户在没有察觉,没有更新app的情况下实现修复。 比较一下各个热修复实现方案。 添加依赖 首先添加插件到project的build...

Zhangyz_521的博客 2171

热修复Tinker

一点微薄之力在这个希望可以帮助到大家!!!

yuejunfeng1993的博客 522

Android 浅尝Tinker微信热修复

现在热修复已经很热门了,比较著名的有阿里巴巴的AndFix、Dexposed,腾讯QQ空间的超级补丁和微信最近开源的Tinker。   Tinker是一个android的热修复库,在不重新安装apk的情况就可以更新dex,library和resource。Tinker区别于AndFix和QQ空间超级补丁采用了更好的dexdiff算法。想要了解详细介绍参考下面微信负责人张绍文的博客链接。 演示ap

danfengw的博客 3179
上一篇: Android Google认证 -CTS认证问题小结
下一篇: Android 仿京东分类列表侧边栏UI库
Jay丶Xu
博客等级 码龄10年 55粉丝 23原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值