Android热补丁技术方案整理

Android 微信热补丁Tinker -- 补丁流程 微信热补丁Tinker之探索 – 补丁加载 在上一篇文章微信热补丁Tinker之初体验 – 项目集成中提到了Tinker 的框架设计:补丁合成、补丁加载、 阅读详情

概述

项目快速迭代过程中,不可避免的出现BUG,Android线上出现问题,通常需要发版解决。紧急发版,用户不一定升级,强制升级又不友好,有什么更好的解决方案呢?这就用到了热修复技术。

QQ团队的hotfix

hotfix,后来发展成为RocooFix,

GitHub地址: https://github.com/dodola/HotFix

原理详细介绍官方文章:安卓App热补丁动态修复技术介绍

HotFix存在的问题:这种方法无法在已经加载好的类中实现动态替换,只能在类加载之前替换掉。就是说,补丁下载下来后,只能等待用户重启应用才能完成补丁效果。

RocooFix支持两种模式:
静态修复某种情况下需要重启应用。
动态修复,无需重启应用即可生效。

补丁制作

该技术的原理很简单,其实就是用ClassLoader加载机制,覆盖掉有问题的方法。所以我们的补丁其实就是有问题的类打成的一个包。

例子中的出现问题的类是 dodola.hotfix.BugClass 原始代码如下:

public class BugClass {

    public String bug() {
        return "bug class";
    }
}

我们假设BugClass类里的bug()方法出现错误,需要修复,修复代码如下:

public class BugClass {

    public String bug() {
        return "fixed class";
    }
}

那么我们只需要将修复过的类编译后打包成dex即可

步骤如下:

  1. 将补丁类提取出来到一个文件夹里

  2. 将class文件打入一个jar包中 jar cvf path.jar *

  3. 将jar包转换成dex的jar包 dx --dex --output=path_dex.jar path.jar

这样就生成了补丁包path_dex.jar

实现javassist动态代码注入

实现这一部分功能的原因主要是因为出现如下异常

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation 

问题原因在文档中已经描述的比较清楚。

就是如果以上方法中直接引用到的类(第一层级关系,不会进行递归搜索)和clazz都在同一个dex中的话,那么这个类就会被打上CLASS_ISPREVERIFIED

很明显,解决的方法就是在类中引用一个其他dex中的类,但是源码方式的引用会将引用的类打入同一个dex中,所以我们需要找到一种既能编译通过并且将两个互相引用的类分离到不同的dex中,于是就有了这个动态的代码植入方式。

首先我们需要制作引用类的dex包,代码在hackdex中,我直接使用了文档中的类名 AntilazyLoad 这样可以和文章中对应起来,方便一些。

我们将这个库打包成dex的jar包,方法跟制作补丁一样。

下面是重点,我们要用javassist将这个类在编译打包的过程中插入到目标类中。

为了方便,我将这个过程做成了一个Gradle的Task,代码在buildSrc中。

这个项目是使用Groovy开发的,需要配置Groovy SDK才可以编译成功。

核心代码如下:

 /**
     * 植入代码
     * @param buildDir 是项目的build class目录,就是我们需要注入的class所在地
     * @param lib 这个是hackdex的目录,就是AntilazyLoad类的class文件所在地
     */
    public static void process(String buildDir, String lib) {

        println(lib)
        ClassPool classes = ClassPool.getDefault()
        classes.appendClassPath(buildDir)
        classes.appendClassPath(lib)

        //下面的操作比较容易理解,在将需要关联的类的构造方法中插入引用代码
        CtClass c = classes.getCtClass("dodola.hotfix.BugClass")
        println("====添加构造方法====")
        def constructor = c.getConstructors()[0];
        constructor.insertBefore("System.out.println(dodola.hackdex.AntilazyLoad.class);")
        c.writeFile(buildDir)



        CtClass c1 = classes.getCtClass("dodola.hotfix.LoadBugClass")
        println("====添加构造方法====")
        def constructor1 = c1.getConstructors()[0];
        constructor1.insertBefore("System.out.println(dodola.hackdex.AntilazyLoad.class);")
        c1.writeFile(buildDir)


        growl("ClassDumper", "${c.frozen}")
    }

下面在代码编译完成,打包之前,执行植入代码的task就可以了。

在 app 项目的 build.gradle 中插入如下代码

task('processWithJavassist') << {
    String classPath = file('build/intermediates/classes/debug')//项目编译class所在目录
    dodola.patch.PatchClass.process(classPath, project(':hackdex').buildDir
            .absolutePath + '/intermediates/classes/debug')//第二个参数是hackdex的class所在目录

}

android{
   .......
    applicationVariants.all { variant ->
        variant.dex.dependsOn << processWithJavassist //在执行dx命令之前将代码打入到class中
    }
}

反编译编译后的apk可以发现,代码已经植入进去,而且包里并不存在dodola.hackdex.AntilazyLoad 这个类


阿里巴巴的AndFix

GitHub地址: https://github.com/alibaba/AndFix

使用步骤

初始化

patchManager = new PatchManager(context);
patchManager.init(appversion);//current version
加载patch
patchManager.loadPatch();
添加patch文件
patchManager.addPatch(path);
支持热更新,不需要重新启动

阿里巴巴的dexposed

GitHub地址: https://github.com/alibaba/dexposed

大众点评的Nuwa

Nuwa的具体实现也是根据QQ空间的热修复方案来实现的

GitHub地址: https://github.com/jasonross/Nuwa

DroidFix

GitHub地址: https://github.com/bunnyblue/DroidFix

官方介绍: http://bunnyblue.github.io/DroidFix/

DroidFix的实现原理跟QQ空间的热补丁方案类似。

携程的DynamicAPK

GitHub地址: https://github.com/CtripMobile/DynamicAPK

主流热补丁开源方案基本上就是以上这些。



欢迎扫描二维码,关注公众号


android 优秀框架整理,Kotlin科学计算 github https://github.com/loopj/android-async-http 作者:James Smith 使用: repositories { maven { url ‘https://oss.sonatype.org/content/repositories/snapshots/’ } } dependencies { compile ‘com.loopj.android:android-async-http:1.5.0-SNAPSHOT’ } 18.androidannotat 阅读详情

相关推荐

安卓SD卡文件管理更新信息相关-DroidFix安卓App热补丁动态修复技术.zip

DroidFix安卓App热补丁动态修复技术.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

动态热修复技术的实现

项目地址:https://github.com/dodola/HotFix HotFix 安卓App热补丁动态修复框架 介绍 该项目是基于QQ空间终端开发团队的技术文章实现的,完成了文章中提到的基本功能。 文章地址:安卓App热补丁动态修复技术介绍 项目部分代码从 dalvik_patch 项目中修改而来,这个项目本来是用来实现multidex的,发现可以用来实现方法替换的效果。

u013378580的博客 906

平行趋势检验没通过怎么办?别慌,试试三重差分DDD与事件研究法

本文探讨了当平行趋势检验未通过时,如何运用三重差分法(DDD)与事件研究法进行政策评估。通过Stata代码示例和实战案例,详细介绍了DDD的原理、适用场景及实现步骤,并提供了替代方案如合成控制法和匹配DID,帮助研究者获得更准确的因果推断结果。

weixin_28732953的博客 609

必知必会-Hot Patch(热补丁)的两种方案

素闻hot patch热补丁,它到底是个什么鬼?我之前只听说过,它很给力,实际上我在小学时候已经听说热补丁,国防科大教授让我们给系统打热补丁。 先看这里: 我想出来的办法代码是 热补丁Hook多线程下InlineHook解决方法-文章作者的做法 我的分析截图 原文 优缺点分析 如何对多线程程序进行补丁正是另人苦恼的事情,前两天因为工作遇到要inline hook的问

KD的疯狂实验室 1万+

MATLAB 论文复现——基于虚拟储能的电动汽车充放电调度策略及激励评价

文章基于虚拟储能聚合体仿真模型优化电动汽车充放电调度,并采用复合权重评价电动汽车的充电激励。根据电动汽车灵活性和系统稳定性衡量其贡献大小,并通过模糊推理系统模拟用户的充电意愿,实现对电动汽车充电的引导和优化。[1]陈朔,胡昊,方慧敏,等.基于虚拟储能的电动汽车充放电调度策略及激励评价[J/OL].系统仿真学报,1-12[2024-07-24].https://doi.org/10.16182/j.issn1004731x.joss.23-1316.基于虚拟储能的电动汽车充放电调度策略及激励评价。

sjr1478的博客 363

STM32CubeMx配置串口使用printf函数打印数据(HAL库开发)

HAL库开发串口,打印printf

m0_58832575的博客 6286

Lua热补丁方案(HotFix)

文章目录一、lua基础之热更新二、hotfix 实现了Lua热更新,仅对函数作替换,保留旧数据三、热更新介绍1.原理2.要点分析3.Lua热更新的实现4._ENV 环境变量5.上值 upvalue6.热更新函数Lua的require函数7.热更新函数Lua的setenv函数8.热更新函数Lua的debug库函数9.深度递归替换所有的upvalue10.实例分析四、Lua脚本热更新方案五、lua热更新1.什么是热更新2.热更新原理第一种:3.热更新原理第二种: 一、lua基础之热更新 首先,什么是热更新?

森明帮大于黑虎帮的博客 3950

嵌入式面经篇八——进程&线程

记录一些招聘公司在招聘嵌入式软件岗位时的一些问题,此文为第八篇。进程上文:是指进程由用户态切换到内核态时需要保存用户态时CPU寄存器中的值,进程状态以及堆栈上的内容。即保存当前进程的状态,以便再次执行该进程时,能够恢复切换时的状态,继续执行。进程下文:是指切换到内核态后执行的程序,即进程运行在内核空间的部分。中断上文:硬件通过中断触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。

明天你好的博客 1854

紧急发布流程模板

紧急无依赖发布:功能描述 1.应用: 2.影响范围: 3.codereview: @xxx 4.测试: @xxx 5.运维: @xxx 6.工单: @xxx  @xxx 帮忙批一下

qq_37672347的博客 473

基于BenchmarkSQL的达梦数据库TPCC性能测试

中的用户和密码在达梦数据库中创建测试用户,并保证其表空间足够容纳生成的测试数据。如果开启了归档,还要考虑归档日志占用的空间。BenchmarkSQL默认不支持达梦数据库。这里我们让BenchmarkSQL把达梦数据库当作Oracle即可。Oracle数据库对应的测试配置文件为。是使用BenchmarkSQL进行性能测试的主要配置文件。是生成的测试报告,png文件是报告中包含的图片。拷贝达梦数据库驱动到BenchmarkSQL的。测试结束后,会在当前路径下生成一个以。规则命名的结果目录。

Sebastien23的博客 2634

2026年软件测试职业院校技能大赛—ERP管理平台-采购入库模块Bug定位与查找

竞赛对接软件测试相关标准,以“ERP管理平台” 为被测系统,围绕软件测试领域的主流技术及工具,考查选手面 对实际问题的综合分析能力,对测试文档、测试用例的设计能力, 对单元测试、自动化测试、性能测试、接口测试等测试工具及方 法的掌握程度,检验选手团队协作能力、组织规划能力、方法运用能力等。

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 194

测试流程--测试发版规范

简介:为了保证系统稳定性,对软件项目的上线过程进行规范,确保项目符合产品需求。对于已经开发完毕的系统,需要正式部署到生产环境前必须严格按照以下流程规范实施。 规范发版的流程,指定发版的相关输出,相关信息的收集,并通知相关业务方了解发版信息。防止或减少因发版造成的系统抖动对业务产生的影 响,并有利于追溯发版过程,方便后续优化迭代。

huofuman960209的博客 3652

[deprecated]第九章:SVM机制: 9-2 Linux HMM原理与实现详解

Linux内核HMM(异构内存管理)子系统为异构计算平台提供统一内存管理机制,支持CPU与GPU等设备共享虚拟地址空间,实现零拷贝数据访问。其核心功能包括:1)统一虚拟地址空间,设备可直接访问CPU进程内存;2)实时页表同步与失效通知,确保地址空间一致性;3)支持设备端page fault处理;4)管理多种内存类型(系统内存、设备私有内存等)。HMM通过mmu_interval_notifier机制感知地址空间变化,提供标准API简化驱动开发,显著提升异构计算性能和数据传输效率。

图形/计算GPU的驱动与虚拟化技术分享园地 2536

img robertcpp Android热补丁技术方案整理 发表于2016/6/29 12:06:54 7881人阅读 分类: android 概述 项目快速迭代过程中,

  优快云博客  robertcpp Android热补丁技术方案整理 发表于2016/6/29 12:06:54  7881人阅读 分类: android 概述 项目快速迭代过程中,不可避免的出现BUG,Android线上出现问题,通常需要发版解决。紧急发版,用户不一定升级,强制升级又不友好,有

twh69的专栏 329

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android 热补丁修复框架,自动生成带签名的补丁包

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!52357875)]

2401_83916030的博客 1146

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android:这是一份全面&详细的-热修复-学习指南,Android开发基础面试题

希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer!如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

m0_60607371的博客 1011

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android 插件开发-热补丁解决线上问题

Android插件技术已经被广泛传播,基本的实现原理就是通过暴露一套接口把插件编译位apk或者dex,在运行时的DexClassLoader动态加载进来。以下就通过分析Android的一些特性来尝试各种方案。

Android个人记录 1650

android 优秀框架整理

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

2401_84010702的博客 967

【腾讯Bugly干货分享】微信热补丁Tinker的实践演进之路

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ad7a70eaed47bb2699e68eDev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师。每周都会举行嘉宾分享,话题讨论等活动。本期,我们邀请了腾讯WXG Android开发工程师——张绍文,为大家分享《微信热补丁Tinke

腾讯Bugly的专栏 6831

移动端的面试题,Android(1),顺利拿到OPPO公司Android架构师offer

####2. 储备知识热补丁的原理主要基于: Android Dex分包方案 & Android的类加载机制(ClassLoader)所以,在讲热补丁的原理前,先了解上述2个储备知识简介示意图简介加载流程说明示意图注:若2个Dex文件中有重复的类,当加载时,则优先加载排序较前的Dex文件的类若所需加载类 = class3,则最终加载的是排序较前的Dex1文件中的class3。

2401_84104460的博客 772

Android优秀资源整理合集(论菜鸟到高级攻城狮)

时间一长,发现在平时逛论坛,订阅号或者其他人推荐的优秀干货,浏览器随机的收藏已经太乱了。抽空整理下,顺便真心推荐大家看看。至少对于我来说,从菜鸟到现在的进步全靠它们!! Android基础相关 1.Android实现数据存储技术 2.AndroidDevTools(里面有开发所需的各种软件,SDK,JDK等等) Android 开源库 1.Android酷炫实用的开源框架(UI框

为梦拼命的Android攻城狮 2579

fir.im Weekly - iOS / Android 动态化更新方案盘点

动态化更新是 App 开发必然面对的问题。在 iOS 环境下,Apple 开发者们像是“ 带着手铐脚镣跳舞” ,相比之下 Android 开发者会轻松一点,有很多相关的开源框架帮助 App 进行热修复、热更新。本期 fir.im Weekly 整理了滴滴打车团队动态化方案、JSpatch 的作者 iOS 动态化分享,以及 QQ空间、微信、微信读书、美团点评技术团队的 Android 热修复热更新方案

FIRim的专栏 1448

android学习资料整理-----高级篇

一、RxJava1、教你写响应式框架 2、学习 RxJava 操作符的 APP 3、给 Android 开发者的 RxJava 详解—–扔物线 4、RxJava从零开始详解二、android插件补丁1、Android热补丁动态修复技术系列 2、Android 利用 APT 技术在编译期生成代码 3、Android中的动态加载机制 4、掌阅 Android App 插件补丁实践 (Ze

hollow12384的博客 8605

android AndFix热补丁框架(不发版本,修复线上bug)

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。

2401_84544714的博客 482

Android热补丁技术,ClassLoader、dexposed、Andfix、smart app updates补丁技术收集整理

介绍 你所看到的,是一个用于Android应用程序增量更新的开源库。 包括客户端、服务端两部分代码。 原理 自从 Android 4.1 开始,Google引入了应用程序的增量更新。 Link: http://developer.android.com/about/versions/jelly-bean.html Smart app updates is a new fea

梦想启航者 1964
上一篇: AsyncQueryHandler异步操作数据库的使用和源码解析
下一篇: Android进程分类与管理
robert_chao
博客等级 码龄15年 265粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值