[Android]用架构师角度看插件化(2)-Replugin 唯一hook点
Replugin,为何我选择要研究这个的插件呢?很大的原因是因为它的介绍中说明,他只会有一个hook点。
一.Hook
hook点是什么?
我们入门Android的时候,一定会看到过这个图,但是你确定深刻了解到这个图的吗?
我们试着换着思维,用组件化的角度去看这张图,你会发现其层级依赖关系,与组件化的工程是非常类似的。(当然你看得角度不同,我只能说是类似)
倘若你用插件的思想来看,我们上层的众多应用(Applications)就是作为framewrok层的插件一样的存在。(Framework作为宿主一样的存在,只是它是对于应用们,他说了算,基于安全管理和效率,他能限制你们获取资源的权限和方法)
然后我们想要在独自的应用中做得像Framework层一样的加载应用,我们本身就享用了Framework层对资源等的加载机制。如果我们想要将某些资源加载,加载验证,权限限制等绕开,运用到手机本身Framework来完成,就会涉及到hook了。
以我理解:hook,当Framework运行时,拦截并替换掉Framework层中某些原生的方法或对象,让其运行到我们想要的效果。
滴滴的VirtualApk 会hook掉AMS(ActivityManagerService)和Instumentation,这两个Framework的文件非常重要,AMS是四大组件的入口,管理生命周期,管理应用通信等,Instumentation管理了Activity的生命周期的调用。有兴趣可以深入去看这两个Framework文件。而其他旧式插件化,还会hook掉一下Service,Broadcast的机制。
而Replugin却走的是完全和传统插件化不同的路,它hook掉的是ClassLoader,而且它只有唯一的hook点。
hook为何会不安全?
就是拦截和替换原生机制,因为Android的机型太多了,而且是开源的,那么各个厂商定制Rom的修改,不同版本的适配也是非常大的阻碍,倘若替换掉某些厂商修改Google原生Android的源码里面的方案,2️⃣刚好hook点没有兼容这方面的源码,就有引起hook失败或者崩溃的可能性。
意味着hook点越少,其可能产生修改的代码会变小,维护的代价会变小,耗损的人力资源就会变少,整个用户体验就会提升。
架构的标准,是要懂得,衡量 时间+空间+效率。唯一hook点,暂时Replugin应该是插件化hook点的极致了。
二.ClassLoader
对于Android 的ClassLoader,请认真仔细看下图,一张图为你解答各种疑问。
此图非常形象的说明Android里面ClassLoader的架构。
这里一般插件化框架,都是使用DexClassLoader动态加载dex文件。
DexClassLoader可以加载apk,dex,jar,还有zip后缀格式的文件,其最终应该是加载dex文件,这也是我QQ群中验证问题的答案。
BaseDexClassLoader,里面有一个DexPathList对象,是用来保存dex的列表的,而查询dex里面的资源、class都是在这个列表中遍历dex对象。
而Replugin是特别的其使用自定义的PathClassLoader来加载apk中的dex,其有别于其他插件框架。
三.唯一hook点
我们看一下Replugin的加载过程。
用的是官网的replugin-host-library为例子
Application中attachBaseContext是最快执行的,其调用了Replugin.App.attachBaseContext方法
他会调用到PMF这个类init方法,PMF是框架和住程序接口
其里面会调用pluginManger的初始化,还有PatchClassLoaderUtils.patch的方法。
PatchClassLoaderUitls这个类是修改宿主和私有属性的位置,其实就是那个唯一的hook点的位置
可以看到在patch中需要获取到整个application的context对象。
然后生成自己的classLoader对象,去hook掉mClassLoader对象,FieldUtils是对Java反射机制的封装,以后使用到发射的时候,可以参考一下这里的封装,感觉是迄今看到众多插件化的封装最完善的。
这里的对参数的说明很清晰,最终会返回RePluginClassLoader对象。
这里调用到RepluginClassLoader里面,copyFromOrginal会将一些需要更改的属性去掉final属性,才能开始修改。initMethods,反射来替换掉ClassLoader的方法
里面替换掉四个方法,findResource和findResources是资源的获取,findLibrary是库获取,getPackage就是获取包信息了。
这里MethodUtils是方法反射的封装,也是封装得非常好。
在Android源码中,是通过DexPathList中读取资源,Resource是以URL格式返回,而lib库是用String返回
包获取是在classLoader中完成的
这里你会发现有点矛盾的地方,因为有可能不是那么容易一下子能看明。
我们前面看到需要反射出一些BaseDexLoader的一些方法
但是你看到其继承调用的时候,却使用了一模一样的方法,这样不就用了一模一样的流程了?这有何意义?
这里其实意义就在于其传入的mOrig参数,这个参数是classLoader的对象,而不同插件间都有classloader,那么其分别调用插件间的classloader资源的时候,就需要在这里拦截调用。
以上就是对Replugin的唯一hook点的分析。
值得借鉴的地方。
(1)唯一hook点,是用hook掉足够大的ClassLoader对象,来让资源加载得到更加便利。
(2)Java反射机制的整合FieldUtils域反射封装和MethodUtils方法反射封装。
作者:Cang_Wang
链接:https://juejin.im/post/596c1fcdf265da6c436741fd
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
[Android]用架构师角度看插件化(2)-Replugin 唯一hook点相关推荐
- [Android]用架构师角度看插件化(3)-Replugin 需要占坑跳转?
一.占坑 什么是占坑?为什么要占坑? Android插件化中,从一个插件Activity跳转到不同插件的Activity的时候,是否可以能正常跳转成功? 声明Activity需要配置什么? 声明Act ...
- [Android]用架构师角度看插件化(1)-Replugin入门剖析
多谢一直以来的支持,组件化的内容,应该会有一段时间不再更新,一些非常关键的技术将会在我将要出版的组件化书籍中提及. 组件化模块化的开发适合于中小型企业的业务叠加,和代码重用.而插件化的开发将组件化和模 ...
- 从业务架构师角度看区块链为什么以及如何改变世界
前言 区块链技术是当前炙手可热的新兴技术,关于该技术的介绍比比皆是,但是介绍往往是从技术实现的角度来阐述区块链的优势,本文是从一个业务架构师的角度,来努力说明因为区块链,这个世界将会看到的新变化,或者 ...
- 阿里Android高级架构师:一个牛逼的插件又双叒诞生了!
作者:鸿洋 原文链接:https://mp.weixin.qq.com/s/GdDkzR8AvgHROUiGwYtfOg 前言 大家在写 Android 项目的时候,免不了要引入各种 Google 提 ...
- java定义dll文件位置,生成网站时如何设置固定的dll文件名?-Java架构师必看
在用VS2005发布网站项目时,默认生成bin目录下的.dll文件名是随机命名的; 如果要固定生成文网络 在用VS2005发布网站项目时,默认生成bin目录下的.dll文件名是随机命名的; 如果要固定 ...
- Java架构师必看的10本书
转载自 Java架构师必看的10本书 1.大型网站系统与JAVA中间件实践 本书围绕大型网站和支撑大型网站架构的Java中间件的实践展开介绍. 从分布式系统的知识切入,让读者对分布式系统有基本的了解: ...
- 进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式
进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式 优知学院 2018-09-05 07:21:00 1.大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大 ...
- java绘制图表控件_画图控件 Chart Control -Java架构师必看
.NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用,一直网络 .NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用 ...
- 成为Java高级架构师必看的15本书
成为Java高级架构师必看的15本书 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐 ...
最新文章
- URL/URI/URN的认识
- TestNG测试框架之TestNG.xml/YAML
- linux下file命令使用技巧
- fms3 NetConnection.Connect.Rejected 问题
- Java黑皮书课后题第7章:**7.23(游戏:储物柜难题)一个学校有100个储物柜和100个学生。所有的储物柜在上学的第一天都是关着的。…在所有学生都经过教学楼并且改变柜子之后,哪些柜子是开着的?
- 在eclipse4.5.1官方英文版利用官方语言包汉化的方法
- 数据挖掘学习之路一:数据挖掘认识
- mtk平台耳机检测流程记录
- rose服务器系统,Rose HA for windows
- dell主板恢复出厂设置_DELL戴尔电脑BIOS怎么恢復初始状态
- Qt导航栏 QListWidget
- UWB测距原理详细解答
- 反反爬技术,破解猫眼网加密数字
- 如何修改 Kubernetes 节点 IP 地址?
- 微服务:同步与异步的抉择。
- 关于阿里云服务器的使用(入门级)
- vue所有页面刷新一次mounted(以及所有生命周期函数)执行两次的解决方法
- heatmap.js来绘制热力图
- android 动态渐变,Android 动态修改渐变 GradientDrawable
- python unix时间戳_Python 获得13位unix时间戳的方法
热门文章
- AndroidStudio-引用jar包及so文件
- Android应用开发基础篇(1)-----Button
- SQL的四种连接-左外连接、右外连接、内连接、全连接
- [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution)
- flex学习笔记--关于拖动
- 2020年终总结暨组会PPT20201229《复现chen密度径向分布结果》
- [云炬创业基础笔记]第七张创业资源测试13
- Go协程池设计思路(Task-Job-Worker)
- 3DSlicer27:OpenIGTLinkIF
- SQL SERVER 跨服务器查询