Shadow
介绍
Shadow 是一个腾讯自主研发的 Android 插件框架,经过线上亿级用户量检验。 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
- 等等……
编译与开发环境
环境准备
建议直接用最新的稳定版本 Android Studio 打开工程。目前项目已适配Android Studio Arctic Fox | 2020.3.1
,
低版本的 Android Studio 可能因为 Gradle 版本过高而无法正常打开项目。
然后在 IDE 中选择sample-app
或sample-host
模块直接运行,分别体验同一份代码在正常安装情况下和插件情况下的运行情况。
Shadow 的所有代码都位于projects
目录下的 3 个目录,分别是:
sdk
包含 SDK 的所有代码test
包含 SDK 的自动化测试代码sample
包含演示代码
其中sample
应该是大家体验 Shadow 的最佳环境。
详见sample
目录中的README介绍。
自己写的测试代码出错?
以我们多年的插件环境下业务开发经验,插件框架是不可能一步到位实现完美的。 因此,我们相信大部分业务在接入时都是需要一定的二次开发工作。 Shadow 现有的代码满足的是我们自己的业务现在的需求。得益于全动态的设计, 插件框架和插件本身都是动态发布的,插件包里既有插件代码也有插件框架代码, 所以可以根据新版本插件的需要同时开发插件框架。
例如,ShadowActivity 没有实现全所有 Activity 方法,你写的测试代码可能用到了, 就会出现 Method Not Found 错误,只需要在 ShadowActivity 中实现对应方法就可以了。 大部分方法的实现都只是需要简单的转调就能工作正常。
如果遇到不会实现的功能,可以提 Issue。最好附上测试代码。
后续开发
- 原理与设计说明文档
- 多插件支持的演示工程
- 自动化测试用例补充
- 开源包含下载能力的 manager 实现
贡献代码
许可协议
Tencent Shadow 采用BSD 3-Clause License
,详见LICENSE。