[Android]用架构师角度看插件化(2)-Replugin 唯一hook点

大家好,我系苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[Android]用架构师角度看插件化--章节列表


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方法反射封装。


这里发一条广告,我创立了一个小密圈。

每天会分享java基础,组件化插件化相关,音视频开源项目分享。

最重要,带有群员们珍贵的分析和点评。

还有最新插件化框架的分析和运用,组件化架构技巧的分享,都尽在这里。

不需要一顿饭的价钱 ,68/一整年的学习资料。

付费是真干货,真正节省时间的通往技术的途径。

来到这里希望影响你的不只是技术提升,而且是人生的架构的导向。

成立两周已经有超过190+的小伙伴加入了我们的行列了,并且持续增加,让我们一起成长,群内还有不定时福利,包括原创书籍的福利哦。

我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习的交流。

群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,749评论 25 707
  • 最近几年移动开发业界兴起了「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优...
    斜杠时光阅读 3,944评论 1 36
  • 时间都去那儿了?现在很多人抱怨,时间不够用。工作效率低下,注意力不集中。 那时间都花哪儿了呢?手机成了罪魁祸首。每...
    励恩阅读 328评论 0 0
  • 设*可以匹配0~n个任意字符,?可以匹配一个任意字符,实现字符串含通配符的匹配算法,查找算法 参考阅读 c语言实现...
    yuansip阅读 1,850评论 0 0
  • 哈哈,今天作业是简单的水果。
    始于初见2017阅读 212评论 1 1