腾讯面试合集:热修复连环炮(热修复是什么 有接触过tinker吗,tinker原理是什么)

面试:各种热修复框架对比 为每个类插入一个ChangeQuickRedirect类型的静态变量,当这个字段为空时,执行旧的方法,不为空时,就可以对badMethod做拦截,执行新的逻辑,替代掉badMethod,从而达到修复的目的。超级补丁技术基于DEX分包方案,使用了多DEX加载的原理,大致的过程就是:把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。与类加载方案不同的是,底层替换方案不会再次加载新类,而是直接在Native层修改原有的类,使其功能立即生效。 阅读详情

本文为大型面试分析,需要的可以点个关注

废话不多说,先来一张此系列文的面试资料目录

1.热修复是什么

热修复无疑是这2年较火的新技术,是作为安卓工程师必学的技能之一。在热修复出现之前,一个已经上线的app中如果出现了bug,即使是一个非常小的bug,不及时更新的话有可能存在风险,若要及时更新就得将app重新打包发布到应用市场后,让用户再一次下载,这样就大大降低了用户体验,当热修复出现之后,这样的问题就不再是问题了。

目前较火的热修复方案大致分为两派,分别是:

1.阿里系:spohix、andfix:从底层二进制入手(c语言)。
2.腾讯系:tinker:从java加载机制入手。

2.有接触过tinker吗

答: 有接触过Tinker的 Tinker是一个比较优异修复架构

3.修复的原理是什么

答: 关于bug的概念自己百度百科吧,我认为的bug一般有2种(可能不太准确):

代码功能不符合项目预期,即代码逻辑有问题。
程序代码不够健壮导致App运行时崩溃。
这两种情况一般是一个或多个class出现了问题,在一个理想的状态下,我们只需将修复好的这些个class更新到用户手机上的app中就可以修复这些bug了。但说着简单,要怎么才能动态更新这些class呢?其实,不管是哪种热修复方案,肯定是如下几个步骤:

下发补丁(内含修复好的class)到用户手机,即让app从服务器上下载(网络传输)
app通过**“某种方式”,使补丁中的class被app调用(本地更新)
这里的
"某种方式"**,对本篇而言,就是使用Android的类加载器,通过类加载器加载这些修复好的class,覆盖对应有问题的class,理论上就能修复bug了。所以,下面就先来了解和分析Android中的类加载器吧。

4. Tinker源码分析

Tinker工程结构

直接从github上clone Tinker的源码进行食用如下:

接入流程
1.gradle相关配置主项目中build.gradle加入

buildscript {
    dependencies {
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.8.1')
    }
}

在app工程中build.gradle加入

dependencies {
    //可选,用于生成application类 
    provided('com.tencent.tinker:tinker-android-anno:1.8.1')
    //tinker的核心库
    compile('com.tencent.tinker:tinker-android-lib:1.8.1') 
}
...
...
//apply tinker插件
apply plugin: 'com.tencent.tinker.patch'

这里需要注意tinker编译阶段会判断一个TinkerId的字段,该字段默认由git提交记录生成HEAD(git rev-parse --short HEAD)而且是在rootproject中执行的git命令,所以个别工程可能在rootproject目录没有git init过,可以选择在那初始化git或者自定义gradle修改gitSha方法。

出包还是使用正常的build过程,测试阶段选择assembleDebug,Tinker产出patch使用gradle tinkerPatchDebug同样也支持Flavor和Variant,Tiner会在主工程build目录下创建bakApk,下面会有一个app-yydd-hh-mm-ss的目录里面对应有Favor子目录里面包含了通过assemble出的apk包。在build目录下的outputs中有tinkerPatch里面同样也区分了build variant产物。

需要注意的是在debug出包测试过程中需要修改gradle的参数

ext {
    //for some reason, you may want to ignore tinkerBuild, such as instant run debug build?
    tinkerEnabled = true

    //for normal build
    //old apk file to build patch apk
    tinkerOldApkPath = "${bakPath}/app-debug-1018-17-58-54.apk"
    //proguard mapping file to build patch apk
    tinkerApplyMappingPath = "${bakPath}/app-debug-1018-17-32-47-mapping.txt"
    //resource R.txt to build patch apk, must input if there is resource changed
    tinkerApplyResourcePath = "${bakPath}/app-debug-1018-17-32-47-R.txt"

    //使用buildvariants修改此处app信息作为基准包
    tinkerBuildFlavorDirectory = "${bakPath}/app-1020-11-52-37"
}

而release出包可以直接在gradle命令带上后缀-POLD_APK= -PAPPLY_MAPPING= -PAPPLY_RESOURCE=

1.Application改造
Tinker采用了代码框架的方案来解决应用启动加载默认Application导致patch无法修复它。原理就是使用一个ApplicationLike代理类来完成原Application的功能,把所有原理Application中的代码逻辑移动到ApplicationLike中,然后删除原来的Application类通过注解让Tinker自动生成默认Application。

@DefaultLifeCycle(application = "com.*.Application",
        flags = ShareConstants.TINKER_ENABLE_ALL,
        loadVerifyFlag = false)
public class ApplicationLike extends DefaultApplicationLike {
    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
        //you must install multiDex whatever tinker is installed!
        MultiDex.install(base);

        TinkerManager.setTinkerApplicationLike(this);

        TinkerManager.initFastCrashProtect();
        //should set before tinker is installed
        TinkerManager.setUpgradeRetryEnable(true);

        //installTinker after load multiDex
        //or you can put com.tencent.tinker.** to main dex
        TinkerManager.installTinker(this);
    }
    
}

TinkerManager.java

public static void installTinker(ApplicationLike appLike) {
        if (isInstalled) {
            TinkerLog.w(TAG, "install tinker, but has installed, ignore");
            return;
        }
        //or you can just use DefaultLoadReporter
        LoadReporter loadReporter = new TinkerLoadReporter(appLike.getApplication());
        //or you can just use DefaultPatchReporter
        PatchReporter patchReporter = new TinkerPatchReporter(appLike.getApplication());
        //or you can just use DefaultPatchListener
        PatchListener patchListener = new TinkerPatchListener(appLike.getApplication());
        //you can set your own upgrade patch if you need
        AbstractPatch upgradePatchProcessor = new UpgradePatch();

        TinkerInstaller.install(appLike,
                loadReporter, patchReporter, patchListener,
                TinkerResultService.class, upgradePatchProcessor);

        isInstalled = true;
    }

其中参数application代表自动生成的application包名路径,flags代表tinker作用域包括res、so、dex,loadVerifyFlag代表是否开启加载patch前各个文件进行md5校验,还有一个loaderClass默认是"com.tenc

Android热修复原理(一)热修复框架对比和代码修复 相关文章 解析ClassLoader系列 前言 在Android应用开发中,热修复技术被越来越多的开发者所使用,也出现了很多热修复框架,比如:AndFix、Tinker、Dexposed和Nuwa等等。如果只是会这些热修复框架的使用那意义并不大,我们还需要了解它们的原理,这样不管热修复框架如何变化,只要基本原理不变,我们就可以很快的掌握它们。这一个系列不会对某些热修复框架源码进行解析,... 阅读详情

相关推荐

微信tinker导致冷启动变慢的问题优化

微信tinker导致冷启动变慢的问题优化1. Android S用户反馈微信启动慢2. 抓取微信systrace查看一下3. tinker对冷启动时间的影响4. 修改方案5. Open Dex是什么时候触发的?其中传入的location又是那里来的?6. 断点看一下带tinker和不带tinker的ClassLoader7. 微信内部tinker加载的流程8. 优化tinker导致启动慢的方案 1. Android S用户反馈微信启动慢 首先第一个想到的就是dex的状态问题 是否有进行oat dex(例如

yun_hen的博客 3833

腾讯面试合集热修复连环炮(热修复是什么 有接触tinker吗,tinker原理是什么)...

原文链接:https://www.jianshu.com/p/dcc4a146192e 1.热修复是什么 热修复无疑是这2年较火的新技术,是作为安卓工程师必学的技能之一。在热修复出现之前,一个已经上线的app中如果出现了bug,即使是一个非常小的bug,不及时更新的话有可能存在风险,若要及时更新就得将app重新打包发布到应用市场后,让用户再一次下载,这样就大大降低了用户体验,当热...

480

1006. 换个格式输出整数 (15)-PAT乙级真题

1006. 换个格式输出整数 (15)让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。输出格式:每个测试用例的输出占一行,用规定的格式输出n。输入样例1...

柳婼 の blog 2206

Tinker 接入

一.原理 二.使用步骤 1.工程根目录的build.gradle中添加依赖 在项目的build.gradle中,添加tinker-patch-gradle-plugin的依赖: buildscript { repositories { mavenLocal() google() jcenter() } depend...

yaonga的专栏 1058

Tinker 源码解析-代码修复和资源修复

之前对于热修复原理了解过,现拿项目中使用的Tinker进行分析,加深理解记忆 Tinker 流程图如下 Tinker 将 old.apk 和 new.apk 做了 diff,生成一个 patch.dex,然后下发到手机,将 patch.dex 和本机 apk 中的 classes.dex 做了合并,生成新的 classes.dex,然后加载。 一Tinker代码修复原理 先从ThinkerApplication看 public abstract class TinkerAppli.

u012845099的博客 989

Android热修复技术-Tinker源码分析

一、使用Patch合成新的dex 我们收到后台返回的补丁包后合成调用的是如下代码: TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed_7zip.apk"); Envi...

walk的博客 565

腾讯面试合集热修复连环炮(热修复是什么-有接触tinker吗,tinker原理是什么)(1)

面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!;if (!1.解析dex_meta内容。

2401_84149444的博客 496

腾讯面试合集热修复连环炮(热修复是什么-有接触tinker吗,tinker原理是什么)

1.gradle相关配置主项目中build.gradle加入在app工程中build.gradle加入//可选,用于生成application类//tinker的核心库//apply tinker插件。

a1901149的博客 1118

classpath*: 和classpath:有什么区别_腾讯面试合集热修复连环炮(热修复是什么tinker原理是什么)...

本文为大型面试分析,需要的可以点个关注废话不多说,先来一张此系列文的面试资料目录1.热修复是什么热修复无疑是这2年较火的新技术,是作为安卓工程师必学的技能之一。在热修复出现之前,一个已经上线的app中如果出现了bug,即使是一个非常小的bug,不及时更新的话有可能存在风险,若要及时更新就得将app重新打包发布到应用市场后,让用户再一次下载,这样就大大降低了用户体验,当热修复出现之后,这样的问题就不...

weixin_31282885的博客 126

Android工程师必学技能-面试热点:热修复

1.热修复是什么 热修复无疑是这2年较火的新技术,是作为安卓工程师必学的技能之一。在热修复出现之前,一个已经上线的app中如果出现了bug,即使是一个非常小的bug,不及时更新的话有可能存在风险,若要及时更新就得将app重新打包发布到应用市场后,让用户再一次下载,这样就大大降低了用户体验,当热修复出现之后,这样的问题就不再是问题了。 目前较火的热修复方案大致分为两派,分别是: 1.阿里系:sp...

Aerfa789的博客 450

Android 大厂高级面试必问36题以及算法合集(附:2022年Android高级面试题汇总以及面试题解析)

AndroidBAT高级面试必问36题 详细说说 Binder通信原理与机制 Linux自带多种进程通信方式,为什么Android 都没采用二偏偏使用 Binder 通信 进程保活如何做到,你们保活率有多高 谈一谈Binder 的原理和实现一次拷贝的流程 ButterKnife为什么执行效率为什么比其他注入框架高?它的原理是什么? 组件化如何实现,组件化与插件化的差别在哪里,该怎么选型? 说下组件之间的跳转和组件通信原理机制 有没有使用过组件化,组件化通信如何做到的,ARouter 有用过吗 插件化你是如

datian1234的博客 506

android知识点总结

1.android的四大组件是什么? Activity【活动】:用于表现功能。 Service【服务】:后台运行服务,不提供界面呈现,相当于没有界面的activity。 BroadcastReceiver【广播接收器】:用来接收广播。 Content Provider【内容提供商】:支持在多个应用中存储和读取数据,相当于数据库。 2.android 中的五大布局? LinearLayout(线性布局)、:FrameLayout(单帧布局)、RelativeLayout(相对布局)、AbsoluteLayou

weixin_41846824的博客 3294

Android热修复原理

参考:https://www.cnblogs.com/popfisher/p/8543973.html 一. AndFix AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法。 注:在Native层使用指针替换的方式替换bug方法,已达到修复bug的目的。 AndFix采用native hook的方式,这套方案直接使用dalvik_replaceMe...

weixin_30855099的博客 286

xposed hook 静态函数_Xposed高级用法 实现Tinker热修复

本文为看雪论坛优秀文章看雪论坛作者ID:珍惜AnyHi!大家好,我是珍惜。给大家简单介绍一下,如何用Xposed实现对某个类的替换覆盖。在不编译源码的情况,直接修改原Class内容。(之前的这篇帖子,也不错。Xposed实现Native层Hook:Art 模式 实现Xposed Native注入https://bbs.pediy.com/thread-251171.htm)当我们在 findCla...

weixin_39589766的博客 836

Android热修复Java类_Android开发热修复Tinker源码的简单介绍

0.前言热修复这项技术,基本上已经成为Android项目比较重要的模块了。主要因为项目在上线之后,都难免会有各种问题,而依靠发版去修复问题,成本太高了。现在热修复的技术基本上有阿里的AndFix、QZone的方案、美团提出的思想方案以及腾讯Tinker等。其中AndFix可能接入是最简单的一个(Tinker命令行接入方式差不多),不过AndFix兼容性有一定的问题,QZone方案对性能会有一定...

weixin_36164538的博客 262

热修复框架tinker的使用简介

一、说明 Tinker 是一个开源项目(Github链接),它是微信官方的 Android 热补丁解决方案,它支持动态下发代码、So 库以及资源,让应用能够在不需要重新安装的情况下实现更新,当前市面的热补丁方案有很多,其中比较出名的有阿里的 AndFix、美团的 Robust 以及 QZone 的超级补丁方案。但它们都存在无法解决的问题,这也是正是我推出 Tinker 的原因,这是官方的文档:h...

helloworld19870427的专栏 1169

智护健康:基于 ESP32 的可穿戴式心率血氧远程监测手环设计与实现

随着健康管理理念的普及,可穿戴式健康监测设备成为刚需。本文设计了一款基于 ESP32 芯片的可穿戴式心率与血氧远程监测手环,通过集成专业生物传感器采集生理数据,借助 ESP32 的无线通信能力实现数据远程传输,搭配手机 APP 与云平台完成数据存储、分析与预警。文中详细阐述了硬件选型、模块接线、软件设计流程及核心代码实现,该手环具备低功耗、高精度、实时性强等特点,可满足日常健康监测与远程照护需求。

weixin_42300449的博客 1171

太阳能板实例分割数据集-20251118-145453.zip

数据集介绍:太阳能板实例分割数据集一、基础信息• 数据集名称:太阳能板实例分割数据集• 图片数量:训练集:2341张图片验证集:669张图片测试集:334张图片总计:3344张图片• 训练集:2341张图片• 验证集:669张图片• 测试集:334张图片• 总计:3344张图片• 分类类别:solar_panel(太阳能板):用于识别和分割太阳能板实例。• solar_panel(太阳能板):用于识别和分割太阳能板实例。• 标注格式:YOLO格式,包含实例分割的多边形标注,适用于实例分割任务。• YOLO格式,包含实例分割的多边形标注,适用于实例分割任务。• 数据来源:可能涉及航空或能源相关领域,具体未指定。二、适用场景• 太阳能板检测与监控系统开发:数据集支持实例分割任务,帮助构建能够精确识别和分割太阳能板区域的AI模型,用于能源管理、设备状态监控和自动化巡检。• 可再生能源评估与规划:集成至太阳能资源分析系统,提供太阳能板分布数据,支持太阳能潜力评估和绿色能源项目规划。• 学术研究与工业创新:支持计算机视觉在可再生能源和环保领域的应用研究,助力太阳能技术优化和智能化发展。• 城市规划与建设管理:用于城市太阳能设施安装情况的自动化调查,辅助城市能源基础设施规划和维护。三、数据集优势• 精准标注与专业性:标注采用实例分割多边形,确保对太阳能板边界的精确捕捉,提升模型分割准确性。• 数据量充足:包含超过3000张图片,提供丰富的训练和测试样本,增强模型泛化能力。• 任务适配性强:标注兼容YOLO格式,可直接用于实例分割模型训练,支持主流深度学习框架,便于快速部署。• 应用价值突出:专注于太阳能板实例分割,为可再生能源管理、智能监控和可持续发展提供关键数据支持。

上一篇: 腾讯Android面试:Handler中有Loop死循环,为什么没有阻塞主线程,原理是什么
下一篇: 腾讯面试:增量升级为什么减少升级代价,增量升级原理
初壹十五a
博客等级 码龄7年 146粉丝 257原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值