新方向 直面Shadow,零反射无Hook如何实现Android插件化?
Posted River_ly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新方向 直面Shadow,零反射无Hook如何实现Android插件化?相关的知识,希望对你有一定的参考价值。
在android开发中,插件化已不是一门刚出炉的技术了。在稍大的平台型App上已成为了标配。
但纵观各大插件框架,都是基于自身App的业务来开发的,目标或多或少都有区别,所以很难有一个插件框架能一统江湖解决所有问题。除了每个插件化业务不同外,兼容性也是个令人头疼的问题。
Android每次版本升级都会给各个实现插件化的项目带来不少冲击,都要费劲心思适配一番,更别提国内各个厂商对在ROM上做的定制了,正如VirtualAPK的作者任玉刚所说:“完成一个插件化框架的 Demo 并不是多难的事儿,然而要开发一款完善的插件化框架却并非易事。“
在Android 9.0出现限制非公开SDK的接口访问之后,可以说当时我们已知的所有插件框架实现都或多或少的出现了适配问题。大家的应对方式基本上还是一种对抗的思想,有的去破解限制,有的通过和Google沟通浅灰名单有效期暂时续命,但毕竟不是长远之计。
而腾讯开源的Shadow完美的解决了这个问题,无需担心兼容,完美的通过框架动态化解决插件化难题。
Shadow官方号称 零反射无Hook实现插件技术、全动态插件框架,基本上将能够动态下发的全部动态下发了,从而实现宿主代码增量极少,并且可以非常灵活的控制插件的下发。
与市面上其他插件框架相比,Shadow主要具有以下特点:
- **复用独立安装App的源码:**插件App的源码原本就是可以正常安装运行的
- **零反射无Hack实现插件技术:**从理论上就已经确定无需对任何系统做兼容开发,更无任何隐藏API调用,和Google限制非公开SDK接口访问的策略完全不冲突
- **全动态插件框架:**一次性实现完美的插件框架很难,但Shadow将这些实现全部动态化起来,使插件框架的代码成为了插件的一部分。插件的迭代不再受宿主打包了旧版本插件框架所限制
- **宿主增量极小:**得益于全动态实现,真正合入宿主程序的代码量极小(15KB,160方法数左右)
- **Kotlin实现:**core.loader,core.transform核心代码完全用Kotlin实现,代码简洁易维护
总结起来,两点:
- 零反射,也是最大的亮点,很大程度上解决了后续系统版本升级兼容性问题;
- 框架动态化,插件的迭代不再受宿主打包了旧版本插件框架所限制;
此外 Shadow 也充分考虑了接入的成本,大多数业务接入插件化都是对包体积有比较严格的诉求,Shadow 严重控制了这一点,对宿主包体积增加极小,仅 15KB左右。
另外反观市面上最厉害的VirtualApk和Replugin,对最新新版本适配并不积极,并且很久没有维护了,在项目中集成的话风险极大。
这里也显示出 Shadow 另一个极大的优势,就是几乎没有反射,这样对于新系统的兼容性有着天然的优势。
Shadow与其他插件化框架的区别:
其原理是在编译期间做了很多事情,产生一个 Shadow 中间层来避免掉需要 hook,而之前的插件化框架,大部分都是运行时通过 hook 系统 framework 层 API的方式来实现的,这种方案理论上兼容性也有保障。
在Shadow之前,也有一些通过代理方式实现的,但是对接入方来说,成本非常高,只能为一种思路,并不适合大规模对外推广;Shadow充分利用编译期的思路,以及将这样的框架开源,在如今系统framework hidden API控制越来越多、越来越严格的趋势下提供了全新的思路,也是一个新的方向。
而如果现在你还不够了解,现在想要在最短的时间里吃透,那么必须要跟着正确的学习路线一步步深挖!
前段时间收集整理了Android高工必备技能知识脑图和核心知识点笔记文档!既能够夯实底层原理核心技术点,又能够掌握普通开发者,难以触及的架构设计方法论。那你在工作中、团队里、面试时,也就拥有了同行难以复制的核心竞争力。
相关的一些知识点和面试题的答案都已经做了收录整理上传至公号中:Android开发之家,大家可以自行访问查阅。
以上是关于新方向 直面Shadow,零反射无Hook如何实现Android插件化?的主要内容,如果未能解决你的问题,请参考以下文章
Android 插件化Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )
Android 插件化Hook 插件化框架 ( Hook Activity 启动流程 | 反射获取 IActivityManager 对象 )