Shadow

Project Url: Tencent/Shadow
Introduction: 零反射全动态 Android 插件框架
More: Author   ReportBugs   
Tags:

Shadow 的设计细节将在掘金持续分享:https://juejin.im/user/5d12faee6fb9a07ed8425178/posts

介绍

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
  • 等等……

编译与开发环境

环境准备

第一次 clone Shadow 的代码到本地后,建议先在命令行编译一次。

  • 在编译前,必须设置ANDROID_HOME环境变量。
  • 在编译时,必须使用gradlew脚本,以保证采用了项目配置的 Gradle 版本。

在命令行测试编译时可以执行这个任务:

./gradlew build

如果没有出错,再尝试用 Android Studio 打开工程。

  • 必须使用 3.4 或更高版本的 Android Studio 打开工程。(业务插件开发时没有限制)
  • 必须关闭 Android Studio 的Instant Run功能。

然后就可以在 IDE 中选择sample-host模块直接运行了。

选择 sample-host 直接运行

Shadow 的所有代码都位于projects目录下的 3 个目录,分别是:

  • sdk包含 SDK 的所有代码
  • test包含 SDK 的自动化测试代码
  • sample包含演示代码

其中sample应该是大家体验 Shadow 的最佳环境。 详见sample目录中的README介绍。

自己写的测试代码出错?

以我们多年的插件环境下业务开发经验,插件框架是不可能一步到位实现完美的。 因此,我们相信大部分业务在接入时都是需要一定的二次开发工作。 Shadow 现有的代码满足的是我们自己的业务现在的需求。得益于全动态的设计, 插件框架和插件本身都是动态发布的,插件包里既有插件代码也有插件框架代码, 所以可以根据新版本插件的需要同时开发插件框架。

例如,ShadowActivity 没有实现全所有 Activity 方法,你写的测试代码可能用到了, 就会出现 Method Not Found 错误,只需要在 ShadowActivity 中实现对应方法就可以了。 大部分方法的实现都只是需要简单的转调就能工作正常。

如果遇到不会实现的功能,可以提 Issue。最好附上测试代码。

后续开发

  • 原理与设计说明文档
  • 多插件支持的演示工程
  • 自动化测试用例补充
  • 开源包含下载能力的 manager 实现

贡献代码

详见CONTRIBUTING.md

许可协议

Tencent Shadow 采用BSD 3-Clause License,详见LICENSE

Apps
About Me
Google+: Trinea trinea
GitHub: Trinea