新方向!直面Shadow,零反射无Hook如何实现Android插件化?

鸿洋 2021-11-26 00:39

在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实现,代码简洁易维护
引自:https://github.com/Tencent/Shadow

总结起来,两点:
  1. 零反射,也是最大的亮点,很大程度上解决了后续系统版本升级兼容性问题;

  2. 框架动态化,插件的迭代不再受宿主打包了旧版本插件框架所限制


此外 Shadow 也充分考虑了接入的成本,大多数业务接入插件化都是对包体积有比较严格的诉求,Shadow 严重控制了这一点,对宿主包体积增加极小,仅 15KB左右。

图引自:阅文技术


另外反观市面上最厉害的VirtualApk和Replugin,对最新新版本适配并不积极,并且很久没有维护了,在项目中集成的话风险极大。

这里也显示出 Shadow 另一个极大的优势,就是几乎没有反射,这样对于新系统的兼容性有着天然的优势。

Shadow与其他插件化框架的区别:

图引自:阅文技术

其原理是在编译期间做了很多事情,产生一个 Shadow 中间层来避免掉需要 hook,而之前的插件化框架,大部分都是运行时通过 hook 系统 framework 层 API的方式来实现的,这种方案理论上兼容性也有保障。

在Shadow之前,也有一些通过代理方式实现的,但是对接入方来说,成本非常高,只能为一种思路,并不适合大规模对外推广;Shadow充分利用编译期的思路,以及将这样的框架开源,在如今系统framework  hidden API控制越来越多、越来越严格的趋势下提供了全新的思路,也是一个新的方向。 


而如果现在你还不够了解,现在想要在最短的时间里吃透,那么必须要跟着真正有实力的大佬一起学习!

这里特别邀请了前华为、OPPO 、阿里资深架构师 David为大家带来《Shadow插件化技术实战系列直播分享,在这里给大家准备了一场干货十足的插件化学习之旅,带大家深入解析插件化开发原理,手把手带你手写插件化开发框架。

原价298元《Shadow插件化技术实战》,现在限时免费即可加入学习(限量100个名额


大家手速要快,赶紧识别下方图中二维码加入学习!


报名学习后还将附赠一套系统的开发进阶资料,帮助大家在技术的道路上更进一步。



赶紧扫码报名获取资料,开启你的学习之旅!
扫码添加时记得备注:"插件化"快速通过)
【如遇扫码频繁+VX:sjsgyb6】

推荐阅读