theme: cyanosis
Shadow简介
Shadow是最近腾讯开源的一款插件化框架。原理是使用宿主代理的方式实现组件的生命周期。目前的插件化框架,大部分都是使用hook系统的方式来做的。使用代理的基本上没有成体系的框架,只是一些小demo,Shadow框架的开源,在系统api 控制越来越严格的趋势下,算是一个新的方向。Shadow最大的两个亮点是:
- 零反射
- 框架自身动态化
Shadow主要具有以下特点:
- 复用独立安装App的源码:插件App的源码原本就是可以正常安装运行的。
- 零反射无Hack实现插件技术:从理论上就已经确定无需对任何系统做兼容开发,更无任何隐藏API调用,和Google限制非公开SDK接口访问的策略完全不冲突。
- 全动态插件框架:一次性实现完美的插件框架很难,但Shadow将这些实现全部动态化起来,使插件框架的代码成为了插件的一部分。插件的迭代不再受宿主打包了旧版本插件框架所限制。
- 宿主增量极小:得益于全动态实现,真正合入宿主程序的代码量极小(15KB,160方法数左右)。
- Kotlin实现:core.loader,core.transform核心代码完全用Kotlin实现,代码简洁易维护。
支持特性
- 四大组件
- Fragment(代码添加和Xml添加)
- DataBinding(无需特别支持,但已验证可正常工作)
- 跨进程使用插件Service
- 自定义Theme
- 插件访问宿主类
- So加载
- 分段加载插件(多Apk分别加载或多Apk以此依赖加载)
- 一个Activity中加载多个Apk中的View
Shadow框架的原理示意图如下:
本文主要解析Shadow插件化原理;更多Android核心技术可以参考《Android核心技术手册》,需要可以点击查看获取;类目如下:
集成Shadow
环境准备
第一次clone Shadow的代码到本地后,建议先在命令行编译一次。
- 在编译前,必须设置ANDROID_HOME环境变量。
- 在编译时,必须使用gradlew脚本,以保证采用了项目配置的Gradle版本。
在命令行测试编译时可以执行如下编译任务:
./gradlew build
如果没有出错,再尝试用Android Studio打开工程。
1.必须使用3.4或更高版本的Android Studio打开工程。 2.必须关闭Android Studio的Instant Run功能。
然后就可以在IDE中选择sample-host模块直接运行即可,如下:
Shadow的所有代码都位于projects目录下的3个目录:
- sdk包含SDK的所有代码
- test包含SDK的自动化测试代码
- sample包含演示代码