QuickPatch项目地址:

https://gitee.com/egg90/QuickPatch 和 https://github.com/eggfly/QuickPatch 同步更新

类似于美团的Robust插桩热修复,但是代码可读性比较强,还在继续完善,todo list在项目README里

QuickPatch项目介绍

年轻人的第一个Android插桩热修复框架

基于函数插桩,兼容性好(Android版本升级不需要做修改),支持热更新无需重启app,参考了美团的Robust插桩热修复框架,精简了很多实现细节,代码可读性高

一句话原理

简单地讲,就是通过编译时在每个函数的头部插入一个if判断和一个proxy代理,就可以在运行时动态替换实现,无需重启。代码如下:

protected void onCreate(Bundle savedInstanceState) {if (_QPatchStub != null) {// _QPatchStub.proxy() will check method existance and call itMethodProxyResult proxyResult = _QPatchStub.proxy(this, "onCreate", "(Landroid/os/Bundle;)V", new Object[]{savedInstanceState});if (proxyResult.isPatched) {return;}}// origin implementation belowsuper.onCreate(savedInstanceState);// ...
}

设计思路

  • QuickPatch和美团Robust的区别是,Robust的编译和dex阶段分别使用ASM和Smali做了处理,QuickPatch仅在gradle编译java到class阶段使用Javassist处理,逻辑简单
  • 不支持自动生成dex补丁(复杂度高,代码可读性差),所以需要手动生成补丁,但是提供了补丁类模版,写起来很方便
  • 对于super的处理使用native调用CallNonVirtual##TYPE##Method()系列方法实现
  • 计划支持构造函数和增加成员函数的热修复
  • 可能计划支持非Android的纯Java代码的热修复

DEMO

使用说明

  • 打开app/build.gradle中的一行apply plugin: 'quickpatch.gradleplugin'
  • 然后使用AndroidStudio或者./gradlew执行下面任务:
./gradlew gradleplugin:uploadArchives # 编译插桩插件
./gradlew app:installDebug # 使用插件编译app代码并插桩
  • 为了方便点击app内的Enable Patch按钮可以模拟补丁加载效果,实际上是使用原本的ClassLoader加载了apk内打包好的的QPatch类
  • 同包名下后缀是_QPatch的类是补丁类,如MainActivity类的补丁类对应名字是MainActivity_QPatch
  • 接下来框架代码会使用一个新的ClassLoader加载dex,然后反射识别并查找相应的函数是否存在,如果存在则新的函数里面的逻辑会被调用
  • 补丁文件名一般是patch.dex, 生成dex需要手动使用命令,比如dx --dex --output=patch.dex MainActivity_QPatch.class
  • 补丁文件需要手动放置到sd卡下,比如adb push patch.dex /sdcard/
  • 然后点击app内的Enable Patch按钮即可实时加载补丁,看到pid不会有变化

性能优化思路

  1. 减少没有patch的时候所有函数调用损耗
  2. 减少有patch时,但没有走到patch涉及到的类时的损耗
  3. 减少有patch时,走到patch类,但是没走到patch函数时的损耗
  4. 减少有patch时,走到patch类,并走到patch函数时的损耗
  5. 优化patch函数内不包含反射,和包含native反射或java反射的这三种情况

转载于:https://blog.51cto.com/13941246/2164761

介绍自己的一个Android插桩热修复框架项目QuickPatch相关推荐

  1. Android 框架学习5:微信热修复框架 Tinker 从使用到 patch 加载、生成、合成原理分析

    这篇文章是基于内部分享的逐字稿内容整理的,现在比较喜欢写逐字稿,方便整理成文章. 文章目录 目录 Tinker 介绍 使用 TinkerApplicaition ``SampleApplicaitio ...

  2. Android—常用热修复框架

    前言 热修复即<打补丁>,当一个app上线后,如果发现重大的bug,需要紧急修复.常规的做法是修复bug,然后重新打包,再上线到各个渠道.这种方式的成本高,效率低. 于是热修复技术应运而生 ...

  3. 从零开始手撸一个热修复框架

    1.前言 热修复原理,这个一直是这几年来很热门的话题,在项目中使用的话,也基本要么是阿里系或者腾讯系的开源框架.但是作为一个光会使用的程序员是远远不够的.这篇文章会从dex分包的原因,原理,热修复的由 ...

  4. android 热修复 框架,十分钟教会你使用安卓热修复框架AndFix

    腾讯最近开发出一个Tinker,阿里也有一个Dexposed框架,当然还有一个就是今天的主角热修复框架AndFix.接下来,我会从它的概念.原理.使用方法等为你详细介绍. 1.什么是AndFix? A ...

  5. Android之热修复框架Nuwa

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/70284239 本文出自:[顾林海的博客] ##前言 当热修复框架还没出 ...

  6. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

    文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...

  7. OCRunner 第零篇:从零教你写一个 iOS 热修复框架

    为什么要热修复 在软件开发过程中,很难避免 BUG 的存在,尤其是对于一些达到一定规模的 App 因为协作模式错综复杂,就很容易带着问题上线. 一旦问题上线之后,问题就麻烦了,不仅需要重新打包.测试, ...

  8. Android-FixBug热修复框架的使用及源码分析(不发版修复bug)

    前面几篇博文已经介绍了2种热修复框架的使用及源码分析,AndFix兼容性比较好,而Dexposed Art处于Beta版. AndFix和Dexposed都是阿里的开源项目.  Alibaba-And ...

  9. Alibaba-AndFix Bug热修复框架的使用

    目录(?)[+] AndFix 这篇主要介绍alibaba的AndFix项目的使用,下一篇介绍 AndFix原理及源码解析. Github:https://github.com/alibaba/And ...

最新文章

  1. OpenCV像素点处理 1
  2. 计算机辅助工艺设计张胜文,计算机辅助工装设计.ppt
  3. 再讲IQueryablelt;Tgt;,揭开表达式树的神秘面纱
  4. C/C++知识分享:C++常用内置函数你会几个,使用过几次呢?
  5. 如何解析一个字符串并返回一个嵌套数组?
  6. C加加学习之路 1——开始
  7. 启用OWA提示用户密码过期工具
  8. SQLServer 语句相关
  9. 学习Android 应注意的十个问题
  10. C++产生随机数字最全教程
  11. 【2022年度总结2023新年Flag】--2022:高考失利,我奋力奔跑的大一上;2023,朝着成为更优秀的自己迈进ing
  12. c# 身份证地区码返回地区名 [对照表]
  13. Postman导入数据批量测试
  14. 新年寄语 —— 奋斗2020
  15. vue中将字符转换成数字的简单做法
  16. Google Earth Engine (GEE)——awesome-gee-community-catalog
  17. 微信聊天记录迁移(Android到IOS)
  18. JavaScript基础题目(附答案)
  19. kali2020.1a安装w3af
  20. PDF加密、解密内幕(一) PDF加密字典对象分析

热门文章

  1. AR与大数据 珠联璧合带来的无限想象空间
  2. Post请求和get请求乱码方式解决
  3. js获取select标签选中的值
  4. mysql中的order by
  5. 牛客 216 C 小K的疑惑
  6. 常见异常代码oracle
  7. Highcharts 配置语法;Highcharts 配置选项详细说明
  8. Oracle表空间状态
  9. windows phone 中反序列化json时出现的问题
  10. 了解冒泡排序选择排序