最近几年,安卓热门技术中,有关热修复、插件化、双开等等技术应用的比较广泛。本文从最简单直接的一个例子入手,分析其中的技术原理和构建思路。有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 热修复、插件化、双开基本原理相关推荐

  1. Android面试之百题经典Android答案——cookie,session,JNI,AIDL,Binder,ClassLoader,AMS,WMS,PWS,热更新,插件化,Hook,dex

    一.Activity生命周期 实际面试中可能会以实例形式出现,比如:启动A,再从A启动B,请描述各生命周期 二.Activity的启动模式 Activity的启动模式有4种,分别是Standard.S ...

  2. Android 热修复使用Gradle Plugin1.5改造Nuwa插件

    随着谷歌的Gradle插件版本的不断升级,Gradle插件现在最新的已经到了2.1.0-beta1,对应的依赖为com.android.tools.build:gradle:2.0.0-beta6,而 ...

  3. 58同城Android端-最小插件化框架实战和原理分析

    目录 背景 插件化需要了解的知识 2.1 类加载过程和类加载器 2.2 ClassLoader 的 findClass.findLibrary.findResource 2.3 DexClassLoa ...

  4. 微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录

    2019独角兽企业重金招聘Python工程师标准>>> 微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录 来源:微信技术团队的公众号WeMobileDev 热 ...

  5. 深入解析阿里Android热修复技术原理

    前言:本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简 ...

  6. Android热修复技术原理详解(最新最全版本)

    本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结   通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...

  7. 【Android 修炼手册】常用技术篇 -- Android 热修复解析

    这是[Android 修炼手册]第 8 篇文章,如果还没有看过前面系列文章,欢迎点击 这里 查看- 预备知识 了解 android 基本开发 了解 ClassLoader 相关知识 看完本文可以达到什 ...

  8. android热补丁作用,Android热修复之 - 阿里开源的热补丁

    这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...

  9. 动态化部署:Android热修复之代码修复(一)

    前记 传统发版要经过应用市场审核这一过程,但面对需要紧急修复的bug时无疑会增加时间成本,并且为了应对现在日渐强烈的运营需求,动态化部署应运而生,包括插件化和热修复,当然插件化和热修复充满了黑科技,包 ...

  10. 手写Android热修复

    其实关于为什么会产生热修复,热修复怎么用,这些网上一大篇博客,本篇博客的内容是 :手写一个Android热修复Demo 要手写Demo ,首先需要掌握 两点:反射和ClassLoader.关于Clas ...

最新文章

  1. Weekly Challenges - Week 11
  2. replace 替换字符串
  3. 【Python CheckiO 题解】I Love Python!
  4. 浅谈Nginx性能调优
  5. ArcCatalog中将SQLServer中的空间数据导入到Oracle库中
  6. 实战:Windows Server 2008 活动目录 传送和争夺操作主控角色
  7. 桌面计算机怎么覆盖文件,恢复被覆盖的文件_恢复被覆盖的桌面文件
  8. 银行卡四元素校验接口
  9. 【WINRAR安装和使用教程】常用压缩软件
  10. iphone11的计算机在哪,苹果备份文件的路径在哪?iphone11系列itunes备份文件位置介绍...
  11. 利用libpcap捕获DPDK网络包
  12. hook koa web 码云_Doodoo.js 发布 1.1.0,Koa.js+ Nuxt.js 最佳实践
  13. el-upload 仅上传一张图片
  14. 【名企面试经验-新浪-校招提前批】【数据平台研发工程师】
  15. 微信小程序识别图片并提取文字_分享一个 OCR 文字识别,高效图片转文字的微信小程序...
  16. HarmonyOS应用开发系列课(进阶篇)综合考试参考答案
  17. 15/18位身份证号码正则表达式(详细版)
  18. 多方面了解WLAN和WIFI的区别
  19. SIP和ISUP协议互通的研究
  20. 设计模式系列----备忘录模式

热门文章

  1. SOLID原则:单一职责原则(SRP)
  2. 联想“推翻”常程:杨元庆“杯酒释兵权”?
  3. HFSS激励类型----入射波激励
  4. Oracle常用指令总结
  5. 基于STM32的简易电子秒表仿真设计(仿真+程序+设计报告+讲解)
  6. SpreadJS 纯前端表格控件应用案例:生产采购管理软件
  7. 三菱QD77MS追剪案例程序
  8. C++求直线方程并求直线延长线上的某点的算法
  9. 客户关系管理挑战:如何保持客户满意度并提高业绩?
  10. Study Flex《强引用与弱引用》