Shadow

腾讯的 Android 插件框架
授权协议 BSD
开发语言 Kotlin Java
所属分类 手机/移动开发、 Android UI 组件
软件类型 开源软件
地区 国产
投 递 者 乐正乐湛
操作系统 Android
开源组织 腾讯
适用人群 未知
 软件概览

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实现
 相关资料
  • 写面经攒人品。腾讯 CSIG。 一面: 70多分钟。 自我介绍后,深挖项目。 Activity的启动方式?栈内复用时,复用Activity上面的Activity会怎样(会弹出)?弹出的这些栈执行哪些生命周期? Handle的使用?Handle在主线程为什么不需要创建looper?Looper.prepare()做了什么 IPC方式有哪些?使用过Binder吗? 。。。。。 更多的忘了。晚一些再整理

  • 笔试时间:2023年3月23日 腾讯音乐 春招实习 第一题 题目:二叉树赋值 小红拿到了一个二叉树,二叉树共有n个节点。小红希望你将所有节点赋值为1到n的正整数,且没有两个节点的值相等。需要满足:奇数层的权值和与偶数层的权值和之差的绝对值不超过1。如果有多种赋值方案,请返回任意—种方案。如果无解,请返回空树。数据范围: 1<n ≤105。给定的二叉树节点初始权值默认为-1。 示例输入一 {-1,-

  • 笔试时间:2023年3月26日 春招实习 第一题 题目:层序遍历二叉树 小红拿到一棵满二叉树,她通过层序遍历的顺序把每个节点的权值都告诉了你,保证每个节点的权值都不相同。现在小红有q次询问,每次询问一个权值,小红想知道: 1、这个节点是否存在? 2、这个节点的左儿子和右儿子的权值是多少? 输入描述 第一行输入一个正整数n,代表二叉树的层数; 第二行输入 2n-1个正整数ai,代表这个完全二叉树的层

  • 采用开源中国客户端的UI,修改了个腾讯微博客户端,需要熟悉腾讯开放平台API的同学可以看看,算是对社区的回馈吧!运行源程序需要到腾讯微博开发平台申请账号! 相关学习资料请参考我的博客: http://my.oschina.net/zhongwenhao/blog?catalog=351790 以实现的功能有: 1、Oauth2.0授权登录 2、发表微博(支持QQ表情) 3、浏览微博(支持自动下来刷

  • struct和class有什么区别? 说一下单例模式? 懒汉式的单例模式存在什么问题? 说一下.cpp和.h文件的区别? 如果直接在.h文件实现函数会有什么影响? 单继承和多继承的差异? 字节溢出有了解过吗? 两个int相乘数值溢出的原因? 可以在一个头文件里面定义多个类? define的作用? ifdefine endif在编译的时候作用? c++的编译过程? vector底层实现? lambd

  • 许多类型的组件,例如标签、菜单、照片库等等,需要内容去渲染。 就像浏览器内建的 <select> 需要 <option> 子项,我们的 <custom-tabs> 可能需要实际的标签内容来起作用。并且一个 <custom-menu> 可能需要菜单子项。 使用了 <custom-menu> 的代码如下所示: <custom-menu> <title>Candy menu</title> <i

  • 介绍如何获取腾讯云API密钥信息 如何获取腾讯云API密钥 登录腾讯云控制台,单击右上角 “云产品” 菜单项,在展开的菜单中搜索 “云API密钥” 菜单项,单击进入API密钥管理页面。 在API密钥管理页面获取APP ID、密钥ID(SecretId)、密码(SecretKey)对应的值。 管理腾讯云资源,需要云账号具备哪些权限 功能 只读权限 可读可写权限 所有功能总和 ReadOnlyAcce

  • 腾讯云 图 1.20.3.1 - 腾讯云 腾讯云 在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案。 具体包括 云服务器、云存储、云数据库、视频与CDN 和 域名注册 等基础云服务;腾讯云分析(MTA)、腾讯云推送(信鸽)等腾讯整体大数据能