基于Tinker的热修复
Tinker是腾讯推出的一种热修方案,下面介绍一下Tinker的接入步骤。
一、在工程的 build.gradle添加远程仓库依赖 jcenter
buildscript {repositories {jcenter()}dependencies {// TinkerPatch 插件classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.2"}
}
二、在app/build.gradle引用Tinker的sdk
dependencies {// 若使用annotation需要单独引用,对于tinker的其他库都无需再引用implementation "com.android.support:multidex:1.0.1"provided("com.tinkerpatch.tinker:tinker-android-anno:1.9.5")compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.5")
}
android {defaultConfig {//为热修复添加javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }}
}
三、在app/build.gradle同级目录下新建一个tinkerpatch.gradle文件,用于热修复配置。
apply plugin: 'tinkerpatch-support'/*** TODO: 请按自己的需求修改为适应自己工程的参数*/
//bakPath:基包路径
//baseInfo:基包文件夹名(打补丁包的时候,需要修改)
//variantName:具体文件夹名(存放apk文件)
def bakPath = file("${buildDir}/bakApk/")
def baseInfo = "app-1.0.0-0328-17-53-06"
def variantName = "release"/*** 对于插件各参数的详细解析请参考* http://tinkerpatch.com/Docs/SDK*/
tinkerpatchSupport {/** 可以在debug的时候关闭 tinkerPatch, isRelease() 可以判断BuildType是否为Release **/tinkerEnable = truereflectApplication = true/*** 是否开启加固模式,只能在APK将要进行加固时使用,否则会patch失败。* 如果只在某个渠道使用了加固,可使用多flavors配置**/protectedApp = false/*** 实验功能* 补丁是否支持新增 Activity (新增Activity的exported属性必须为false)**/supportComponent = falseautoBackupApkPath = "${bakPath}"appKey = "应用的appKey"/** 注意: 若发布新的全量包, appVersion一定要更新 **/appVersion = "1.0.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"/*** (可选)重命名备份文件的格式化字符串,默认为'${appName}-${variantName}'* Available vars:* 1. projectName* 2. appName* 3. packageName* 4. buildType* 5. versionName* 6. versionCode* 7. buildTime* 8. fileSHA1* 9. flavorName* 10. variantName* default value: '${appName}-${variantName}'* Note: plz use single-quotation wrapping this format string*/backupFileNameFormat = '${appName}-${variantName}'/*** 若有编译多flavors需求, 可以参照: https://github.com/TinkerPatch/tinkerpatch-flavors-sample* 注意: 除非你不同的flavor代码是不一样的,不然建议采用zip comment或者文件方式生成渠道信息(相关工具:walle 或者 packer-ng)**/
}/*** 用于用户在代码中判断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 = falseuseSign = truedex {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}
}import java.util.regex.Matcher
import java.util.regex.Pattern/*** 如果只想在Release中打开tinker,可以把tinkerEnable赋值为这个函数的return* @return 是否为release*/
def isRelease() {Gradle gradle = getGradle()String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()Pattern pattern;if (tskReqStr.contains("assemble")) {println tskReqStrpattern = Pattern.compile("assemble(\\w*)(Release|Debug)")} else {pattern = Pattern.compile("generate(\\w*)(Release|Debug)")}Matcher matcher = pattern.matcher(tskReqStr)if (matcher.find()) {String task = matcher.group(0).toLowerCase()println("[BuildType] Current task: " + task)return task.contains("release")} else {println "[BuildType] NO MATCH FOUND"return true;}
}
四、在app/build.gradle中引入tinkerpatch.gradle
//热修复
apply from: 'tinkerpatch.gradle'
五、在app/build.gradle中配置打包的签名文件相关信息
signingConfigs {debug {storeFile file("text.jks")storePassword "123456"keyAlias "text"keyPassword "123456"v2SigningEnabled false}release {storeFile file("text.jks")storePassword "123456"keyAlias "text"keyPassword "123456"v2SigningEnabled false}}
六、在AndroidMainfest.xml中声明必要的权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
七、在Application类中初始化Tinker组件
/*** 我们需要确保至少对主进程跟patch进程初始化 TinkerPatch*/private void initTinkerPatch() {// 我们可以从这里获得Tinker加载过程的信息tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();// 初始化TinkerPatch SDK, 更多配置可参照API章节中的,初始化SDKTinkerPatch.init(tinkerApplicationLike).reflectPatchLibrary().setPatchRollbackOnScreenOff(true).setPatchRestartOnSrceenOff(true).setFetchPatchIntervalByHours(3);// 每隔3个小时(通过setFetchPatchIntervalByHours设置)去访问后台时候有更新,通过handler实现轮训的效果TinkerPatch.with().fetchPatchUpdateAndPollWithInterval();}
八、正常打包会在app/build/bakApk目录下生成基础包(生成补丁的基础)
基包位置如下图所示,在上线后需要对基包文件夹进行备份,后续生成补丁包需要用到
九、生成补丁包
在Gradle中找到tinkerPatchRelease执行生成补丁包
补丁包位置如下图
十、发布补丁包
添加版本
上传补丁包
至此整个的Tinker热修复从集成到发布补丁的简要过程已经全部完成了,更详细的过程请参考Tinker官方文档
基于Tinker的热修复相关推荐
- 《android基于andFix的热修复方案》思路篇
1:需求背景 项目上线之后,发现BUG需要修复(比如安卓兼容性等测试难以发现的问题),频繁的更新影响用户体验 2:方案要求 静默下载,耗费流量少,打完补丁后立刻生效,不用重启apk 3:解决思路 3. ...
- android热修复技术tinker,Android热修复方案第一弹——Tinker篇
背景 一款App的正常开发流程应该是这样的:新版本上线-->用户安装-->发现Bug-->紧急修复-->重新发布新版本-->提示用户安装更新,从表面上看这样的开发流程顺理 ...
- Android 浅尝Tinker微信热修复
现在热修复已经很热门了,比较著名的有阿里巴巴的AndFix.Dexposed,腾讯QQ空间的超级补丁和微信最近开源的Tinker. Tinker是一个android的热修复库,在不重新安装apk的情况 ...
- Bugly+Tinker实现热修复
1.使用环境 Android Studio版本(Bumblebee ):Android Studio Bumblebee | 2021.1.1 Patch 3 Build #AI-211.7628.2 ...
- 《android基于andFix的热修复方案》实战篇
有篇文章说的比较简洁,大家可以参考下:AndFix使用说明 下面说说实际使用中遇到的问题 1:如何继承到gradle项目中 dependencies {compile 'com.alipay.eule ...
- Android热修复-Tinker简析
一.简介 日常工作工作中难免会遇到项目上线后出现bug问题,如果紧急发版往往由于渠道审核时间问题,导致bug修复不及时,影响用户体验.这时我们需要引入热修复,免去发版审核烦恼. 热更新优势: 让应用能 ...
- 腾讯Tinker 热修复 Andriod studio 3.0 配置和集成(一)
本文说明 面试的时候经常问我有没有用过热修复?用谁的?能说下原理吗?当时我回答得不好,毕竟以前的项目都没有用,又不敢装逼,mmp,但是基本流程还是知道的,所以我们来初探下Tinker 这个热修复,如果 ...
- 【热修复】Andfix源码分析
转载请标注来源:http://www.cnblogs.com/charles04/p/8471301.html Andfix源码分析 0.目录 背景介绍 源码分析 方案评价 总结与思考 参考文献 1. ...
- Android 热修复一(热修复流程原理)
Android热修复一:热修复的流程 下一篇:Android热修复二(手写热修复代码) 在听了lance老师的热修复理论之后,决定写一篇文章,把我理解的全部记下来 之前也多少了解过热修复,当下的热修复 ...
最新文章
- CCS5.5 中报错 Does not match the target type,not loaded 的一种情况
- 基于SSM实现保健院管理系统
- mysql编程的作用_数据库系统概论对学习编程的作用?
- 图数据集之cora数据集介绍 --- 适用于GCN任务
- PHP输出控制(Output Control)函数
- 鲁大师2014绿色版 v3.75.14.1058 免费版
- Uiautomator 2.0之UiObject2类学习小记
- NFC读卡MS522|CV520
- 强化理解指针、指针数组和数组指针(从三味书屋到成华大道)
- postgres 禁止远程登录_Postgresql允许远程访问配置修改
- C++之(public/protect/private)及fiend
- CS61A fa2021 Composing Programs 2.7 Object Abstraction 对象抽象
- k8s使用的iptables,具体原理是什么?一学就会
- MATLAB | MATLAB中绘图的奇淫技巧合集
- MaxEnt: 最大熵模型(Maximum Entropy Models)
- 航空燃气涡轮发动机分类
- 厦门之旅(2020.6.15-19)
- 阅读书源最新2020在线导入_推荐3款无广告、速度快、可换源的小说利器,5星使用阅读体验...
- 一键隐藏公式——《超级处理器》应用
- 2022年第五届“传智杯”全国大学生IT技能大赛——程序设计挑战赛
热门文章
- 纯js实现鼠标拖尾效果(好玩又简单,一学就会)
- excel组合汇总_Excel汇总20160229
- 电子狗产品在做宣传时发布图文笔记应该注意些什么?
- CodeM 第一题 下单
- XSS Challenges/刷题/Stage #3
- 记账理财,就选我爱管账
- 旅行照片剪辑--苏州同里篇
- 「论文翻译」SATIN: A Secure and Trustworthy Asynchronous Introspection on Multi-Core ARM Processors阅读翻译与笔记
- 第十八届全国大学智能车竞赛车模作品中的电子模块: 白名单与黑名单
- 56 Three.js 使用粒子实现雨滴特效