Shadow插件框架学习

本文深入探讨Shadow插件框架,一个由腾讯研发的Android动态加载解决方案。框架特点包括源码复用、零反射实现、全动态插件加载等。文章通过分析Demo工程,详细解释了编译期间的字节码注入、配置生成,以及运行时的插件初始化、加载过程,展示了如何实现在宿主应用中动态加载和运行插件。
摘要由CSDN通过智能技术生成

Shadow插件框架学习

简介

Shadow是一个腾讯自主研发的Android插件框架,与市面上其他插件框架相比,Shadow主要具有以下特点:

  • 复用独立安装App的源码:插件App的源码原本就是可以正常安装运行的。
  • 零反射无Hack实现插件技术:从理论上就已经确定无需对任何系统做兼容开发,更无任何隐藏API调用,和Google限制非公开SDK接口访问的策略完全不冲突。
  • 全动态插件框架:一次性实现完美的插件框架很难,但Shadow将这些实现全部动态化起来,使插件框架的代码成为了插件的一部分。插件的迭代不再受宿主打包了旧版本插件框架所限制。
  • 宿主增量极小:得益于全动态实现,真正合入宿主程序的代码量极小(15KB,160方法数左右)。
  • Kotlin实现:core.loader,core.transform核心代码完全用Kotlin实现,代码简洁易维护。
    用网上的一个图表示就是:
    在这里插入图片描述

Demo工程分析

部分Module的注释

  • sample-host是宿主应用

  • sample-manager是插件管理器的动态实现

  • sample-plugin/sample-loader是loader的动态实现,业务主要在这里定义插件组件和壳子代理组件的配对关系等。

  • sample-constant是在前3者中共用的相同字符串常量。

  • sample-plugin/sample-runtime是runtime的动态实现,业务主要在这里定义壳子代理组件的实际类。

  • sample-plugin/sample-app-lib是业务App的主要代码,是一个aar库。

  • sample-plugin/sample-normal-app是一个apk模块壳子,将sample-app-lib打包在其中,演示业务App是可以正常安装运行的。

  • sample-plugin/sample-plugin-app也是一个apk模块壳子,同样将sample-app-lib打包在其中,但是额外应用了Shadow插件,生成的apk不能正常安装运行。

工程编译

运行sample-host开始编译,Release版和Debug流程一样,这里只分析Debug版。

在/sdk/core/gradle-plugin目录下有个自定义的gradle插件ShadowPlugin,在sample-plugin-app的build.gradle中apply进来。ShadowPlugin主要做了以下几件事:

  1. 在编译期间通过字节码注入的方式将插件apk中一些类(比如Activity、Service等等)转成指定的一些类(比如ShadowActivity、ShadowService等等)
plugin.extension.registerTransform(ShadowTransform(
                   project,
                   classPoolBuilder,
                   {
    shadowExtension.transformConfig.useHostContext }
           ))
  1. 创建shadow以及packagePlugin属性,并在sample-plugin-app的build.gradle中配置好runtime、loader、plugin的相关信息。
  2. 通过createPackagePluginTask以及createGenerateConfigTask创建两个gradle任务。createGenerateConfigTask任务的作用是将sample-runtime-debug.apk、sample-loader-debug.apk、sample-plugin-app-debug.apk的信息写到配置文件config.json中;createPackagePluginTask的作用是将sample-runtime-debug.apk、sample-loader-debug.apk、sample-plugin-app-debug.apk以及config.json打包成一个zip压缩包。

config.json长这样子:

{
   "compact_version":[1,2,3],"pluginLoader":{
   "apkName":"sample-loader-debug.apk","hash":"3BED30B04F62AFC50DAC0E936FDFB6DC"},"plugins":[{
   "partKey":"sample-plugin-app","apkName":"sample-plugin-app-debug.apk","businessName":"sample-plugin-app","hash":"36FA91
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值