当前位置: 首页 > news >正文

探究Android插件化开发的新思路——Shadow插件化框架

Shadow插件化框架是什么?

Shadow是一种Android App的插件化框架,它利用类似于ClassLoader的机制来实现应用程序中的模块化,并让这些模块可以在运行时灵活地进行加载和卸载。Shadow框架主张将一个大型的Android App拆分成多个小模块,在运行时动态地根据需要进行加载,从而实现应用程序的优雅扩展。它将一个大型的应用拆分成一个宿主App和多个子App,每个子App都相互独立,只有当需要时才会被加载到内存中。

Shadow提供了插件化架构下的Activity、Service、BroadcastReceiver以及ContentProvider等核心组件,并为开发者提供了方便的API来调用这些组件,从而使得Android的插件化变得更加容易和自然。

Shadow插件化框架原理

Shadow是一款Android插件化框架,采用了宿主和插件分离的方式来实现插件化。被插件化的组件可以是 Activity、Service、BroadcastReceiver、ContentProvider 等,实现了Android应用在不重启情况下扩展和更新的可能。

Shadow的插件化原理主要包括以下几个方面:

宿主和插件的分离

宿主和插件需要通过安装包区分,并且互相独立。宿主是主应用,负责插件的管理和使用,插件则对主应用一无所知。

加载插件

插件需要先被加载进入内存才能运行。Shadow框架通过DexClassLoader技术,在运行时动态加载插件,并使用ClassLoader来确保宿主和插件ClassLoader的隔离性。

组件的生命周期管理

Shadow框架通过对插件的解析、管理和调度,实现了对组件的生命周期管理。例如,当插件运行在宿主进程中时,宿主会通过代理的形式调用插件中的组件生命周期方法。

资源加载

Shadow框架也为插件化支持了资源加载机制。在运行时,宿主能够正常从插件中加载所需资源,从而完成各项功能。

特点:

Shadow框架具有以下几个特点:

  • 绝大多数的Android组件都支持插件化,包括Activity、Service、BroadcastReceiver、ContentProvider等;
  • 通过类似于ClassLoader的机制实现插件加载,可以让应用在不重启的情况下加载和卸载插件;
  • 支持宿主和插件之间的数据共享,如通过Intent或Bundle传递数据。

应用场景:

Shadow插件化框架适用于需要动态更新或扩展业务的应用,如社交、电商、游戏等场景。

使用方式:

使用Shadow插件化框架开发应用需要以下几个步骤:

  • 拆分业务模块,将每个业务模块打包成apk并部署到服务器或市场;
  • 安装插件,并在宿主中进行配置,以便宿主能够正确加载和启动插件;
  • 编写业务代码,使用Shadow框架提供的API来实现插件化功能,如启动插件Activity、调用插件Service等。

Shadow使用步骤与代码分析

Shadow插件化框架的使用步骤如下:

引入Shadow插件化框架

在工程中引入Shadow插件化框架依赖,可以通过Gradle或其他方式进行集成。

将插件添加到宿主工程

将需要添加的插件工程打包成apk,并通过网络或其他方式将其下载到宿主工程中,并进行插件的安装。

在宿主工程中配置插件

在宿主工程的Application的onCreate()方法中使用Shadow框架提供的API对插件进行配置。以下是一个简单的示例代码:

// 加载插件APK
File pluginFile = new File(Environment.getExternalStorageDirectory() + File.separator + "plugin.apk");
​
// 安装插件APK
Shadow.getApplicationContext().installPlugin(pluginFile);
​
// 启动插件Activity
Intent intent = new Intent();
intent.setClassName("com.example.plugin", "com.example.plugin.PluginActivity");
Shadow.getApplicationContext().startActivity(intent);

使用插件中的组件

使用Shadow框架提供的API来启动插件中的组件,例如:启动插件的Activity、调用插件的Service等。以下是一个简单的示例代码:

// 启动插件Activity
Intent intent = new Intent();
intent.setClassName("com.example.plugin", "com.example.plugin.PluginActivity");
Shadow.getApplicationContext().startActivity(intent);
​
// 调用插件Service
Intent serviceIntent = new Intent();
serviceIntent.setComponent(new ComponentName("com.example.plugin", "com.example.plugin.PluginService"));
startService(serviceIntent);

Shadow插件化框架的使用流程是:引入框架依赖、将插件添加到宿主工程、配置插件、使用插件中的组件。开发者可以根据具体的业务需求和场景进行相应的调整和使用。

入学Shadow插件化框架源码

Shadow插件化框架源码分析可以从以下几个方面入手:

Core Module

Core Module 是 Shadow 插件化框架的核心模块,包括插件管理器、组件代理管理器、插件加载器、资源管理器等重要组件。可以通过阅读 Core Module 的源码,了解 Shadow 插件化框架的插件化原理。

Plugin Module

Plugin Module 是 Shadow 插件化框架的插件模块,用于组织插件的代码和资源。可以通过分析 Plugin Module 的源码,了解 Shadow 插件化框架如何实现插件的独立性和可扩展性。

Sample Module

Sample Module 是 Shadow 插件化框架的示例模块,包含了一些示例代码和示例插件。可以通过阅读 Sample Module 的源码,了解如何在实际项目中使用 Shadow 插件化框架进行插件开发。

测试代码

在阅读 Shadow 插件化框架源码时,需要注意到测试代码的存在。测试代码可以帮助开发者快速了解框架的使用方法和使用场景,并且可以方便地进行单元测试和集成测试。

Shadow 插件化框架的源码分析需要从不同的模块入手,通过深入了解各个组件的功能和实现方式来掌握 Shadow 插件化框架的原理和使用方法。同时,还需要关注框架的测试代码,了解如何利用测试代码进行开发和测试。

建议开发者在实践中学习和掌握 Shadow 插件化框架的使用,并结合源码进行深入学习和分析。更多有关Android架构师进阶的技术,可以参考《Android架构核心技术文档》里面记录了Android开发中的30多个技术板块,上千个技术知识点。

总结

Shadow框架的插件化原理是将应用程序按照模块化拆分,通过动态加载技术实现在运行时动态卸载和加载插件,最终实现应用程序的动态扩展和更新。同时,Shadow框架还实现了完善的插件化支持,如插件组件生命周期管理、资源加载等,让开发者可以更加方便地进行Android应用开发。

相关文章:

探究Android插件化开发的新思路——Shadow插件化框架

Shadow插件化框架是什么? Shadow是一种Android App的插件化框架,它利用类似于ClassLoader的机制来实现应用程序中的模块化,并让这些模块可以在运行时灵活地进行加载和卸载。Shadow框架主张将一个大型的Android App拆分成多个小模块&#xff…...

SimpleDateFormat和DateTimeFormatter的区别及使用详解

目录 1.简介2.区别3.SimpleDateFormat3.1 字符串转日期3.2 日期转字符串 4.DateTimeFormatter4.1 字符串转日期4.2 日期转字符串 扩展 1.简介 DateTimeFormatter 和 SimpleDateFormat 都是用于格式化日期和时间的类,但是它们有一些区别。 SimpleDateFormat 是 Jav…...

边缘人工智能——nanodet模型实践指引,从标注数据集到实现部署文件

内容概述 首先获得一个合适的nanodet模型版本,配置nanodet适用的环境,然后对网上公开的生数据集进行重新标注,配置nanodet并进行训练,.pth到.onnx的模型转化及简化,编写推理文件。 文章着重于实践方向指引,…...

SASS的用法指南

一、什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护。 本文总结了SASS的主要用法。我的目标是,有了这篇文章,日常的一般使用就不需要去…...

MCSM面板一键搭建我的世界服务器-外网远程联机【内网穿透】

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 转载自远程穿透文章&…...

( 数组和矩阵) 565. 数组嵌套 ——【Leetcode每日一题】

❓565. 数组嵌套 难度:中等 索引从 0 开始长度为N的数组 A,包含 0 到 N - 1 的所有整数。找到最大的集合 S并返回其大小,其中 S[i] {A[i], A[A[i]], A[A[A[i]]], ... } 且遵守以下的规则。 假设选择索引为 i 的元素 A[i] 为 S 的第一个元…...

linux内核网络子系统初探---概述

linux内核网络子系统初探—概述 一、网络模型 简单介绍 学习网络时,必定能在各种教材资料里见到以下三种网络模型: 三种模型间的差异: OSI七层模型是理论上的网络模型,从功能方面分成了相对独立的7个层次,由于太复…...

java版工程项目管理系统源代码-功能清单 图文解析

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…...

【chapter30】【PyTorch】[动量与学习率衰减】

前言: SGD的不足: ①呈“之”字型,迂回前进,损失函数值在一些维度的改变得快(更新速度快),在一些维度改变得慢(速度慢)- 在高维空间更加普遍 ②容易陷入局部极小值和鞍点…...

【键入网址到网页显示】

文章目录 HTTPDNS五层协议TCPIPMAC网卡(物理层)交换机路由器 HTTP 对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。 http://www.server.com/dir1/file1.html http:访问数…...

Nacos配置中心、配置热更新、及配置共享的记录

Nacos除了提供了注册中心的功能,同样也提供了配置中心的功能,用于管理一些叫常改动的配置 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中…...

MATLAB | 绘图复刻(八) | 堆叠柱状图+哑铃图

本次复刻的是Nature Communications中Friedman, S.T., Muoz, M.M. A latitudinal gradient of deep-sea invasions for marine fishes. Nat Commun 14, 773 (2023). https://doi.org/10.1038/s41467-023-36501-4的Fig1图像: 复刻效果: 文章可在如下网站下…...

Scala之集合(2)

目录 集合基本函数: (1)获取集合长度 (2)获取集合大小 (3)循环遍历 (4)迭代器 (5)生成字符串 (6)是否包含 衍生集合…...

【图像分割】视觉大模型SEEM(Segment Everything Everywhere All at Once)原理解读

文章目录 摘要(效果)二、前言三、相关工作四、method4.1 多用途4.2 组合性4.3 交互式。4.4 语义感知 五、实验 论文地址:https://arxiv.org/abs/2304.06718 测试代码:https://github.com/UX-Decoder/Segment-Everything-Everywher…...

Linux: command: ibstat; infiniband

文章目录 如何在Linux上安装infiniband相关的软件。ibstat相关资料 如何在Linux上安装infiniband相关的软件。 https://access.redhat.com/solutions/301643 https://docs.oracle.com/cd/E19436-01/820-3522-10/ch3-linux.html yum groupinstall “Infiniband Support” Pack…...

UML简介与类图详解

1 UML简介 1.1 UML是什么 UML,全称为Unified Model Language,即统一建模语言,是由一整套图表组成的,为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。UML 代表了一组最佳工程实践,这些实践已被证明在…...

【每日一题】1994.好子集的数目

1994.好子集的数目 题目描述解决方案:状态压缩动态规划代码:Python 题目来源:LeetCode 原文链接:https://mp.weixin.qq.com/s/myI7_ZwJM7kizrwUtWgAZQ 难度级别:困难 题目描述 给你一个整数数组 nums。如果 nums 的一…...

坚持伙伴优先,共创数据存储新生态

4 月 26 日,2023 阿里云合作伙伴大会上,阿里巴巴集团董事会主席兼 CEO、阿里云智能集团 CEO 张勇表示,阿里云的核心定位是一家云计算产品公司,生态是阿里云的根基。让被集成说到做到的核心,是要坚定走向“产品被集成”…...

树形结构的三级分类如何实现?

概述: 本三级联动分类服务端使用的是: Springboot MyBatis-plus,前端使用的是:VueElementUI,树形控件使用的是el-tree。本三级联动分类可以把任一子项拖拽到其它目录,可以添加、编辑、删除分类。 效果图&#xff1a…...

SSM整合完整流程

🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公司实习&#x1f…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

Spring Boot面试题精选汇总

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...