【Android】Instant Run原理解析
1、研究主流的热修复框架后,你会发现andfix和dexposed采用jni hook方法,不用重启就能修复,而Nuwa的ClassLoader思路因为类被虚拟机加载后,不会重新加载,所以需要重启。Instant Run是怎么实现不重启加载的呢,难道也是jni hook?
2、Instant Run原理
一个插件一个库,Instant Run用的是gradle plugin和instant-run.jar。
3、gradle plugin的两个作用
(1)第一次运行,应用transform API修改字节码。
step1:给所有的类添加$change字段,$change为IncrementalChange类型,IncrementalChange是个接口。
step2:修改类的全部方法(新的逻辑是:如果$change不为空,去调用$change的access$dispatch方法,参数为方法签名字符串和方法参数数组,否则调用原逻辑。)
(2)后续运行,dx补丁类,生成补丁dex。
step1:被修改类对应的补丁类
补丁类,并不是你修改后的类,而是由gradle plugin自动生成,实现了IncrementalChange接口的类。
该类类名在原名后面添加$override,复制修改后类的大部分方法,实现IncrementalChange 接口的access$dispatch方法,该方法会根据传递过来的方法签名,调用本类的同名方法。
只要把原类的$change字段设置为该类,那就会调用该类的access$dispatch方法,就会使用修改后的方法了。
step2:被修改类的记录类
AppPatchesLoaderImpl记录了所有被修改的类,也会被打进补丁dex。
4、instant-run.jar
设置原类的$change字段为补丁类
(1)AppPatchesLoaderImpl类不但记录了全部被修改的类,还提供load方法支持设置被修改原类$change字段.
(2)当收到补丁通知时,新建一个DexClassLoader,去反射加载补丁dex中的AppPatchesLoaderImpl类,调用load方法即可,load方法中会去加载全部补丁类,并赋值给对应原类的$change。
以上主要是探究Instant Run处理代码变化的思路,对资源变化没有分析。
【Android】Instant Run原理解析相关推荐
- Android 热修复原理解析
概述 关联文章 JVM 类加载机制 Android 中的ClassLoader 假如刚发布的版本出现了bug,我们就需要解决bug,并且重新发布新的版本,这样会浪费很多的人力物力,有没有一种可以不重新 ...
- Android 广播实现原理解析
Android 广播实现原理解析 前言 Android四大组件中的BroadcastReceiver,在我们实际工作中被频繁的使用,我们可以利用系统的开机广播,网络状态改变的广播等等实现我们的业务逻辑 ...
- Android动画-Animation原理解析
Android动画-Animation原理解析 一.概述 在android中动画分为3类,帧动画.补间动画.属性动画 今天要说的就是"补间动画",补间动画的基类是Animation ...
- (传送门)instant run原理
深入理解Android Instant Run运行机制:https://cloud.tencent.com/developer/article/1037769
- Android 插件化原理解析——Activity生命周期管理
之前的 Android插件化原理解析 系列文章揭开了Hook机制的神秘面纱,现在我们手握倚天屠龙,那么如何通过这种技术完成插件化方案呢?具体来说,插件中的Activity,Service等组件如何在A ...
- Android代码入侵原理解析(一)
Original 2017-05-06 付超红 滴滴安全应急响应中心 2017年初,在滴滴安全沙龙上,滴滴出行安全专家--付超红,针对App的攻与防进行了分享.会后大家对这个议题反响热烈,纷纷求详情求 ...
- Android 插件化原理解析——Hook机制之AMSPMS
在前面的文章中我们介绍了DroidPlugin的Hook机制,也就是代理方式和Binder Hook:插件框架通过AOP实现了插件使用和开发的透明性.在讲述DroidPlugin如何实现四大组件的插件 ...
- Android之Butterknife原理解析
转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 Butterknife是一个专注于Android系统的View注入框架, ...
- Android插件化原理解析——广播的管理
在Activity生命周期管理 以及 插件加载机制 中我们详细讲述了插件化过程中对于Activity组件的处理方式,为了实现Activity的插件化我们付出了相当多的努力:那么Android系统的其他 ...
- Android插件化原理解析——ContentProvider的插件化
目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...
最新文章
- C# 打好基础图文详解
- [node 工具] 用 Node.js 将 bugzilla 上的 bug 列表导入到 excel 表格在线版本之一(server 端)...
- php server 连接字符串,sqlServer 数据库常用连接字符串
- uuid java 重复_Java中使用UUID工具类生成唯一标志防止重复
- oracle 删除数据_2020最新最全数据库系统安全
- T-SQL连接查询,基础连接理解
- VMware11.1.2+centOS7.4虚拟机联网问题并设置静态IP
- 不规则裁剪图片css,在css中将div剪裁成不规则形状的方法
- Sublime 3 打开GBK 编码文件中文乱码 解决办法
- log日志查看软件logviewer-pro
- Microsoft SQL Server 2000 简体中文企业版 +SP4升级补丁
- linux格式化叫大硬盘命令,Linux_format命令 参数说明,格式化 格式化指定卷中的磁盘 - phpStudy...
- 关于在Unity2018中使用Vuforia实现基础图片识别AR展现效果
- CSS 多列等高的几种实现方式
- photoshop插画插件_一键生成2.5D风格插画的PS插件
- android layout html,layoutgravity
- perl脚本实战总结
- SAP 创建会计冲销凭证
- CAD开发-CAD二维配管辅助工具
- ​cmd中如何退出Python​
热门文章
- linux那些事儿 pdf,[转] linux那些事儿之我是HUB - PDF文件
- 华为公司内部控制手册(干货)
- 【FPGA】超声波测距
- 微信开发遇到的那些坑
- DSPE-PEG-TAT,磷脂-聚乙二醇-靶向穿膜肽TAT,一种磷脂PEG肽
- Vue单文件组件TypeScript写法
- win版石器和linux,石器时代私服架设教程Linux版
- 大数据处理系统,分布式存储系统和分布式计算框架介绍
- 传奇3服务器配置文件,分享传奇三架设的全部详细攻略
- python:实现newton_raphson牛顿拉夫森算法(附完整源码)