Android 热修复、插件化、双开基本原理
最近几年,安卓热门技术中,有关热修复、插件化、双开等等技术应用的比较广泛。本文从最简单直接的一个例子入手,分析其中的技术原理和构建思路。有3个相关的基本知识点,java中的反射、设计模式中的代理模式、安卓中的类加载
反射的主要作用就是可以根据类的完整包名+类名,可以读取类里面定义的字段、方法名等等;还可以针对一个对象,对对象里面的字段进行写入替换;反射执行对象的方法等等。重点在对字段进行替换写入,如果不能进行替换,那么所有的插件化热修复等等就无从谈起。
首先定义一个功能类,类里定义一个test方法
public class UserInfoManager {public UserInfoManager(){}public void test(Context context) {Toast.makeText(context,"我是"+UserInfoManager.class.getName()+"",Toast.LENGTH_LONG).show();} }
然后定义一个针对改功能使用的接口类
public class Manager {private UserInfoManager userInfoManager;public Manager() {userInfoManager = new UserInfoManager();}public void test(Context context) {if (userInfoManager != null) {userInfoManager.test(context);}} }
在Activity中的按钮点击事件中使用如下方法调用
manager = new Manager(); manager.test(this);
执行后可以看到如下弹框
假如这个是一个线上APP的一段逻辑,这一段业务逻辑有问题,我们现在需要更改他;热修复的要求是直接替换这个类,用户只需要更新自己需要的类就可以完成替换;在这个要求下,我们首先需要想到的是在这一段逻辑中加入可更新类对象的方法,利用反射可以这样实现
实现一个新类继承自UserInfoManager
public class UserInfoManagerFix extends UserInfoManager {public UserInfoManagerFix(){}@Overridepublic void test(Context context) {Toast.makeText(context,"我是"+UserInfoManagerFix.class.getName()+"",Toast.LENGTH_LONG).show();} }
然后更新按钮点击的实现方式,利用反射替换UserInfoManager为UserInfoManagerFix
manager = new Manager(); //替换补丁类 try {//new一个补丁userInfoManagerFix = new UserInfoManagerFix();//获取需要替换的对象字段Field mUserInfoManagerA = manager.getClass().getDeclaredField("userInfoManager");mUserInfoManagerA.setAccessible(true);//核心,替换类引用mUserInfoManagerA.set(manager, userInfoManagerFix);//再次执行方法manager.test(this); } catch (Exception e) {e.printStackTrace(); }
执行后,可以看到如下
是不是已经执行的是补丁类的方法
我们需要的是将这个类打包成补丁进行网络下载后加载,我简单的将其打包成jar,选择Build->Make Project-,完成后在
app\build\intermediates\javac\debug\classes\包名\下找到类名.class文件,然后利用jar 命令转化成一个jar。
我转化后放在assets下,如图
然后更改下点击事件
manager = new Manager(); //复制补丁到指定路径,模拟网络下载 String hotFixLibPath = getExternalCacheDir().getAbsolutePath() + File.separator + "UserInfoManagerFix.jar"; try {InputStream inputStream = getAssets().open("UserInfoManagerFix.jar");File file = new File(hotFixLibPath);file.deleteOnExit();file.createNewFile();FileOutputStream outputStream = new FileOutputStream(file);int read = -1;while ((read = inputStream.read()) > 0) {outputStream.write(read);}outputStream.flush();outputStream.close(); } catch (Exception e) { } //利用DexClassLoader加载补丁,然后替换 String hotFixOutPath = getExternalCacheDir().getAbsolutePath(); DexClassLoader classLoader = new DexClassLoader(hotFixLibPath, hotFixOutPath, null, getClassLoader()); try {Class hotFixCls = classLoader.loadClass("com.example.hotfix.managerfix.UserInfoManagerFix");Object hotFixObj = hotFixCls.newInstance();//找到字段进行替换Field mUserInfoManagerA = manager.getClass().getDeclaredField("userInfoManager");mUserInfoManagerA.setAccessible(true);mUserInfoManagerA.set(manager, hotFixObj);//再次执行方法manager.test(this); } catch (Exception e) {e.printStackTrace(); }
执行点击
可以看到执行的是jar包中的方法。整个jar包也就2Kb
如果真的有这么一个需求,那么更新2kb的jar包总比更新整个APP体验好的多。
现在基本实现了一个简单的,可以进行热修复目的小Demo。
插件化和虚拟化双开APP的原理基本也如上。其核心过程都是更改系统原有的一些流程,因此需要从安卓源码进行分析;并且如果需要兼容不同版本系统,还需要在针对不同代码写不用的hook过程。
Android 热修复、插件化、双开基本原理相关推荐
- Android面试之百题经典Android答案——cookie,session,JNI,AIDL,Binder,ClassLoader,AMS,WMS,PWS,热更新,插件化,Hook,dex
一.Activity生命周期 实际面试中可能会以实例形式出现,比如:启动A,再从A启动B,请描述各生命周期 二.Activity的启动模式 Activity的启动模式有4种,分别是Standard.S ...
- Android 热修复使用Gradle Plugin1.5改造Nuwa插件
随着谷歌的Gradle插件版本的不断升级,Gradle插件现在最新的已经到了2.1.0-beta1,对应的依赖为com.android.tools.build:gradle:2.0.0-beta6,而 ...
- 58同城Android端-最小插件化框架实战和原理分析
目录 背景 插件化需要了解的知识 2.1 类加载过程和类加载器 2.2 ClassLoader 的 findClass.findLibrary.findResource 2.3 DexClassLoa ...
- 微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录
2019独角兽企业重金招聘Python工程师标准>>> 微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录 来源:微信技术团队的公众号WeMobileDev 热 ...
- 深入解析阿里Android热修复技术原理
前言:本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简 ...
- Android热修复技术原理详解(最新最全版本)
本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...
- 【Android 修炼手册】常用技术篇 -- Android 热修复解析
这是[Android 修炼手册]第 8 篇文章,如果还没有看过前面系列文章,欢迎点击 这里 查看- 预备知识 了解 android 基本开发 了解 ClassLoader 相关知识 看完本文可以达到什 ...
- android热补丁作用,Android热修复之 - 阿里开源的热补丁
这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...
- 动态化部署:Android热修复之代码修复(一)
前记 传统发版要经过应用市场审核这一过程,但面对需要紧急修复的bug时无疑会增加时间成本,并且为了应对现在日渐强烈的运营需求,动态化部署应运而生,包括插件化和热修复,当然插件化和热修复充满了黑科技,包 ...
- 手写Android热修复
其实关于为什么会产生热修复,热修复怎么用,这些网上一大篇博客,本篇博客的内容是 :手写一个Android热修复Demo 要手写Demo ,首先需要掌握 两点:反射和ClassLoader.关于Clas ...
最新文章
- Weekly Challenges - Week 11
- replace 替换字符串
- 【Python CheckiO 题解】I Love Python!
- 浅谈Nginx性能调优
- ArcCatalog中将SQLServer中的空间数据导入到Oracle库中
- 实战:Windows Server 2008 活动目录 传送和争夺操作主控角色
- 桌面计算机怎么覆盖文件,恢复被覆盖的文件_恢复被覆盖的桌面文件
- 银行卡四元素校验接口
- 【WINRAR安装和使用教程】常用压缩软件
- iphone11的计算机在哪,苹果备份文件的路径在哪?iphone11系列itunes备份文件位置介绍...
- 利用libpcap捕获DPDK网络包
- hook koa web 码云_Doodoo.js 发布 1.1.0,Koa.js+ Nuxt.js 最佳实践
- el-upload 仅上传一张图片
- 【名企面试经验-新浪-校招提前批】【数据平台研发工程师】
- 微信小程序识别图片并提取文字_分享一个 OCR 文字识别,高效图片转文字的微信小程序...
- HarmonyOS应用开发系列课(进阶篇)综合考试参考答案
- 15/18位身份证号码正则表达式(详细版)
- 多方面了解WLAN和WIFI的区别
- SIP和ISUP协议互通的研究
- 设计模式系列----备忘录模式