腾讯的 Android 插件框架 Shadow

BSD
Kotlin Java
Android
腾讯
2019-06-26
红薯

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模块直接运行了。

 

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

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

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

自己写的测试代码出错?

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

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

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

后续开发

  • 原理与设计说明文档
  • 多插件支持的演示工程
  • 自动化测试用例补充
  • 开源包含下载能力的manager实现
的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

关于box-shadow一些知识

text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果。随着html5和CSS3的普及,这一特殊效果使用越来越普遍。 基本语法是{box-shadow:[inset] x-offset y-offset blur-...

2013/12/26 23:55
19
0
CSS3阴影 box-shadow的使用和技巧总结

text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果。随着html5和CSS3的普及,这一特殊效果使用越来越普遍。 基本语法是{box-shadow:[inset] x-offset y-offset blur-...

2016/03/07 23:07
70
1
CSS3阴影 box-shadow的使用和技巧总结

text-shadow是给文本添加阴影效果。 box-shadow是给元素块添加周边阴影效果。 随着HTML5和CSS3的普及,这一特殊效果使用越来越普遍。 语法: box-shadow [inset] x-offset y-offset blur-ra...

2016/12/23 18:12
241
0
放大镜效果

###普及知识:放大镜特效涉及到的几个值 offsetWidth 获取元素的宽度 offsetHeight 获取元素的高度 offsetLeft父元素没有定位时,获取元素距离页面的左边距,父元素有定位时,获取元素距离父...

2016/12/08 16:07
1
0
今日一练习

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <met...

2013/01/07 16:27
17
0
ie-css3.htc(让IE支持box-shadow,圆角,text-shadow)

ie-css3.htc(让IE支持box-shadow,圆角,text-shadow) IE本身是shadow滤镜可以实现类似效果的,还有一些js和.htc的hack文件可以帮助你在IE中实现这一效果。我也无法一一都去尝试,这里只介绍...

2012/05/17 18:44
3.6K
1
passwd: Authentication token manipulation error

passwd: Authentication token manipulation error

2016/08/03 10:51
10
1
box-shadow属性详解

1.box-shadow属性语法 box-shadow 属性接受值最多由五个不同的部分组成。 box-shadow: offset-x offset-y blur spread color position; 换句说: 对象选择器 {box-shadow:X轴偏移量 Y轴偏移量...

2018/07/06 17:05
390
0
CSS3-阴影参数基础

本文转载于:猿2048网站https://www.mk2048.com/blog/blog.php?id=hh1bjbab&title=CSS3-%E9%98%B4%E5%BD%B1%E5%8F%82%E6%95%B0%E5%9F%BA%E7%A1%80 box-shadow 语法:text-shadow: x-shadow y...

昨天 08:32
0
0
ss shadow$socks

Note: $ 可替换 留一个备份而已 Python shadow$socks-python is the initial version written by @clowwindy. It aims to provide a simple-to-use and easy-to-deploy implementation with...

05/22 11:04
4
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部