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 项目有较为完善的自动化测试,因此最新代码对外部环境的版本兼容性可以参考自动化测试的配置。
- pr-check.yml 虚拟机自动化测试,包含 Android 测试机版本和编译环境 JDK 等版本。
- pr-check-gradle-plugin.yml AGP 兼容性测试。 其中指向的test_JDK17.sh和 test_JDK11.sh中定义了被测试的 AGP 版本。
自己写的测试代码出错?
以我们多年的插件环境下业务开发经验,插件框架是不可能一步到位实现完美的。 因此,我们相信大部分业务在接入时都是需要一定的二次开发工作。 Shadow 现有的代码满足的是我们自己的业务现在的需求。得益于全动态的设计, 插件框架和插件本身都是动态发布的,插件包里既有插件代码也有插件框架代码, 所以可以根据新版本插件的需要同时开发插件框架。
例如,ShadowActivity 没有实现全所有 Activity 方法,你写的测试代码可能用到了, 就会出现 Method Not Found 错误,只需要在 ShadowActivity 中实现对应方法就可以了。 大部分方法的实现都只是需要简单的转调就能工作正常。
如果遇到不会实现的功能,可以提 Issue。最好附上测试代码。
后续开发
- 原理与设计说明文档
- 多插件支持的演示工程
- 自动化测试用例补充
- 开源包含下载能力的 manager 实现
贡献代码
许可协议
Tencent Shadow 采用BSD 3-Clause License
,详见LICENSE。