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

Android守护进程——Vold (Volume Daemon)

简介

介绍:Vold 是用来管理 android 系统的存储设备,如U盘、SD卡、磁盘等移动设备的热插拔、挂载、卸载、格式化

框架结构:Vold 在系统中以守护进程存在,是一个单独的进程。处于Kernel和Framework之间,是两个层级连接的桥梁。下图是Vold在Android系统的整体架构
在这里插入图片描述

组成

重要模块

NetLinkManager(简称NM):内部建立了 socket 连接,主要作用是接收来自 Kernel 的 Uevent 消息。例如SD卡的插拔等动作都会引起 Kernel 向 NM 发送 Uevent 消息
NetlinkHandler:负责解析内核的 Uevent ,它本质上是一个SocketListener类,它们的继承关系,即:NetlinkHandler、NetlinkListener和SocketListener继承关系如下:

VolumeManager模块(简称VM):Android13 中是VM处理完从NM接收到的NetlinkEvent后,通过binder将消息传递给StorageManagerService 进行下一步处理,然后 VM 根据 StorageManagerService 返回的消息管理卷
VoldNativeService模块:主要是与 StorageManagerService 进行通信,继承 BinderService 类,启动过程中主要注册了接口,使其他服务可以通过IVold可以找到,然后启动线程
StorageManager 模块:Framework 层的API,用于APP和其它系统组件访问存储相关的功能。它是 StorageManagerService 的客户端,通过 Binder 调用 StorageManagerService 提供的 API

Vold 启动流程

与其说是Vold启动流程,更不如说是Android存储的初始化工作,Vold的主要功能,就是存储区的管理。Android 的初始化工作可以大致分为三个阶段:

  • 清理环境,因为Android是支持多用户的,启动时的可能是另一个用户,所以需要把之前的用户数据清理干净
  • 启动存储服务,如Vold、StorageManager等等
  • 挂载emulated存储(用于模拟SD卡,历史原因,下面章节会着重介绍)

第一个用户态进程init
• init.rc 启动 Vold 进程

//init.rc  片段
service vold /system/bin/vold \
--blkid_context =u:r:blkid:s0 --blkid_untrusted_context=u:r:blkid_untrusted:s0 \
--fsck_context =u:r:fsck:s0 --fsck_untrusted_context=u:r:fsck_untrusted:s0
class core
ioprio be 2
task_profiles ProcessCapacityHigh
shutdown critical
group root reserved_disk
reboot_on_failure reboot,vold-failed
// adb shell -> ps -A | grep vold
130|shenoo:/mnt/media_rw # ps -A | grep vold // vold 的父进程PID=1(init)
root           471     1 11001604  9596 binder_wait_for_work 0 S vold

Vold 启动

在这里插入图片描述
动VolumeManager:

  1. VM 会先卸载掉对应文件夹中的所有东西,使之处于一个干净的状态;
  2. 通过VolumeBase基类智能指针new了一个EmulatedVolume对象,同时构造出内置存储目录(/data/media);
  3. 在create函数中,执行了doCreate,doCreate是虚函数,在EmulatedVolume中并没有实现,所以最终还是调用了基类函数,也就直接返回了。之后的listener则是StorageManager服务,但是由于Vold启动较早,SystemServer还没有启动StorageManager,所以这里getListener()得到的是空,后面StorageManager启动完成后会重新触发。
  4. 设置了当前存储设备的状态为unmounted。
  5. 最后Vold会创建一个虚拟磁盘

• 启动VoldNativeService:VoldNativeService依赖的是aidl接口逻辑,连接着StorageManager和vold。它继承自BinderService,启动过程中主要注册了接口,使其他服务可以通过 IVold 可以找到,然后启动线程。
• 启动NetlinkManager:启动过程中内部建立了一个socket连接,用于接收所有的uevent事件,最后会new一个NetlinkHandler对象,并执行start函数。然后调用NetlinkListener父类的startListener函数去监听event。
• 总之,Vold启动完成后,后续Vold会监听kernel的uevent事件,然后处理转发通过Callback通知到StorageManager,而Framework的服务以及App则可以通过StorageManager去使用Vold处理Command

int main(int argc, char** argv) {... //忽略部分代码ATRACE_BEGIN("main");VolumeManager* vm;NetlinkManager* nm;parse_args(argc, argv); //解析传递的参数...mkdir("/dev/block/vold", 0755);...    //创建 VolumeManager 实例if (!(vm = VolumeManager::Instance())) {LOG(ERROR) << "Unable to create VolumeManager";exit(1);}//创建 NetlinkManager 实例if (!(nm = NetlinkManager::Instance())) {LOG(ERROR) << "Unable to create NetlinkManager";exit(1);}if (android::base::GetBoolProperty("vold.debug", false)) {vm->setDebug(true);}//启动 VolumeManagerif (vm->start()) {PLOG(ERROR) << "Unable to start VolumeManager";exit(1);}...VoldConfigs configs = {};if (process_config(vm, &configs)) {PLOG(ERROR) << "Error reading configuration... continuing anyways";}...android::hardware::configureRpcThreadpool(1, false /* callerWillJoin */);...//VoldNativeService它是一个binder服务,start方法会把它发布到ServiceManager中if (android::vold::VoldNativeService::start() != android::OK) {LOG(ERROR) << "Unable to start VoldNativeService";exit(1);}...//启动 NetlinkManagerif (nm->start()) {PLOG(ERROR) << "Unable to start NetlinkManager";exit(1);}...android::IPCThreadState::self()->joinThreadPool();//加入线程池LOG(INFO) << "vold shutting down";exit(0);
}

启动 storaged 服务
此外,系统还会启动与Vold息息相关的服务,比如它的上游服务——StorageManagerService,大致流程如下:

init.rc  ->  Zygote  ->  SystemServer  ->  StorageManagerService

具体:
• 开机后,安卓启动的第一个用户态进程是init,init进程会fork出zygote进程,zygote又fork出 system server
zygote fork system server

 zygoteServer = new ZygoteServer(isPrimaryZygote);

• SystemServer 启动函数入口
zygote 启动服务

     /*** The main entry point from zygote.*/public static void main(String[] args) {new SystemServer().run();}
•	SystemServer().run()会启动各种service

通过 run() 启动各种服务

779      private void run() {.......
955          // Start services.
956          try {
957              t.traceBegin("StartServices");
958              startBootstrapServices(t);.....
962          } catch (Throwable ex) {
963              Slog.e("System", "******************************************");
964              Slog.e("System", "************ Failure starting system services", ex);
965              throw ex;
966          }........

• 在startBootstrapServices函数里会启动 ActivityManager
StartActivityManager

1073      private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {.......
1144          t.traceBegin("StartActivityManager");
1145          // TODO: Might need to move after migration to WM.
1146          ActivityTaskManagerService atm = mSystemServiceManager.startService(
1147                  ActivityTaskManagerService.Lifecycle.class).getService();
1148          mActivityManagerService = ActivityManagerService.Lifecycle.startService(
1149                  mSystemServiceManager, atm);
1150          mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
1151          mActivityManagerService.setInstaller(installer);
1152          mWindowManagerGlobalLock = atm.getGlobalLock();
1153          t.traceEnd();

启动systemReady()函数

 2829          // We now tell the activity manager it is okay to run third party
2830          // code.  It will call back into us once it has gotten to the state
2831          // where third party code can really run (but before it has actually
2832          // started launching the initial applications), for us to complete our
2833          // initialization.
2834          mActivityManagerService.systemReady(() -> {
2835              Slog.i(TAG, "Making services ready");
2836              t.traceBegin("StartActivityManagerReadyPhase");
2837              mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);
2838              t.traceEnd();
2839              t.traceBegin("StartObservingNativeCrashes");

systemReady 实现

8264      /**
8265       * Ready. Set. Go!
8266       */
8267      public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
8268          t.traceBegin("PhaseActivityManagerReady");
8269          mSystemServiceManager.preSystemReady();
8392          // On Automotive / Headless System User Mode, at this point the system user has already been
8393          // started and unlocked, and some of the tasks we do here have already been done. So skip
8394          // those in that case. The duplicate system user start is guarded in SystemServiceManager.
8395          // TODO(b/242195409): this workaround shouldn't be necessary once we move the headless-user
8396          // start logic to UserManager-land.
8397          mSystemServiceManager.onUserStarting(t, currentUserId);

处理 H_BOOT_COMPLETED 消息

在这里插入图片描述

相关文章:

Android守护进程——Vold (Volume Daemon)

简介 介绍&#xff1a;Vold 是用来管理 android 系统的存储设备&#xff0c;如U盘、SD卡、磁盘等移动设备的热插拔、挂载、卸载、格式化 框架结构&#xff1a;Vold 在系统中以守护进程存在&#xff0c;是一个单独的进程。处于Kernel和Framework之间&#xff0c;是两个层级连接…...

【实体转换】mapstruct详解

大家好&#xff0c;我是jstart千语。今天来给大家讲讲在项目中经常可以使用得到的一个“工具”&#xff0c;就是mapstruct。 一、工具介绍 这个工具有些类似于spring提供的BeanUtils.copyProperties()用于对象转化。而mapstruct是通过生成高效的、类型安全的映射代码来帮助开发…...

部署路线Ubuntu_MySQL_Django_绑定域名

第 1 步&#xff1a;绑定域名&#xff08;DNS&#xff09; 在域名服务商后台&#xff08;例如阿里云 / 腾讯云 / Cloudflare&#xff09;中设置&#xff1a; A 记录 →域名 → 指向服务器公网 IP 可选&#xff1a;也加一个 www.域名 → 同样指向服务器 第 2 步&#xff1a;安…...

大屏设计与汇报:政务服务可视化实践

大屏设计与汇报:政务服务可视化实践 引言 在政务服务数字化转型浪潮中,大屏设计成为展现业务能力与数据价值的关键手段。本文围绕政务大屏设计,从设计要点、业务逻辑到汇报技巧展开深入探讨,为相关从业者提供全面参考。 一、大屏设计核心要点 (一)多维度考量 设计大…...

【MySQL】数据库和表的操作详解

目录 一、数据库&#xff1a; 1、查看数据库&#xff1a; 2、创建数据库&#xff1a; 3、删除数据库&#xff1a; 4、数据库的编码问题&#xff1a; 5、校验规则对数据库的影响&#xff1a; 6、修改数据库&#xff1a; 7、库的备份与恢复&#xff1a; 8、查看链接情况…...

从PDF到播客:MIT开发的超越NotebookLM的工具

NotebookLM是谷歌推出的更具创意的AI产品之一,几个月前刚刚推出。 许多人对它的能力感到惊叹——尤其是将长文本转化为两位播客主持人之间有趣对话的功能。 NotebookLM提供的不仅仅是这些,还包括聊天(问答)甚至生成思维导图。 如果你还没有尝试过NotebookLM,我强烈建议…...

ubuntu系统上基于RKE2部署K8S及Rancher

由于我们特殊的网络环境&#xff0c;所以只能使用国内资源来进行安装 - Rancher Releases Mirrors&#xff1a;https://mirror.rancher.cn/ - 阿里云镜像仓库&#xff1a;registry.cn-hangzhou.aliyuncs.com 1、配置资源仓库及token rootdemo-1:~# mkdir -p /etc/rancher/r…...

STM32单片机入门学习——第40节: [11-5] 硬件SPI读写W25Q64

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.18 STM32开发板学习——第一节&#xff1a; [1-1]课程简介第40节: [11-5] 硬件SPI读…...

vue3学习笔记之属性绑定

属性绑定 1. 基本语法 在 Vue 3 里&#xff0c;使用 : 或者 v-bind: 来进行属性绑定。这两种写法是等价的&#xff0c;: 是 v-bind: 的缩写形式。以下是示例代码&#xff1a; <template><!-- 使用缩写形式 --><img :src"imageUrl" alt"An exa…...

C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式

int A(参数...) override { return 某个对象.A(参数...);} 一.目标 本文将用一个简单的“数学运算器”例子&#xff0c;从零解释以下 C 语法特性&#xff1a; virtual 虚函数 override 重写关键字 函数体内部的“转发调用” 数组引用作为函数参数 适合初学者和希望加深…...

Spring_MVC 快速入门指南

Spring_MVC 快速入门指南 一、Spring_MVC 简介 1. 什么是 Spring_MVC&#xff1f; Spring_MVC 是 Spring 框架的一个模块&#xff0c;用于构建 Web 应用程序。它基于 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;将应用程序分为模型&#xff08;M…...

Starrocks 数据均衡DiskAndTabletLoadReBalancer的实现

背景 最近在研究了一下 Starrocks的tablet的Rebalance的能力&#xff0c;这里进行记录一下 本文基于 StarRocks 3.3.5 结论 数据的rebalance 主要以两种模式来进行&#xff1a; 按照磁盘的使用率进行移动&#xff0c;如果每个BE的磁盘使用率不足tablet_sched_balance_load_…...

设计模式之工厂方法模式

1. 核心思想 工厂方法模式&#xff08;Factory Method Pattern&#xff09;将对象的创建过程延迟到子类。具体来说&#xff0c;定义一个创建对象的接口&#xff08;抽象工厂&#xff09;&#xff0c;但由子类决定实例化哪个具体类。这种方式解耦了对象的创建和使用&#xff0c…...

ubuntu学习day3

3 编译与调试 3.1 gcc/g编译器 当我们进行编译的时候&#xff0c;要使用一系列的工具&#xff0c;我们称之为工具链。SDK就是编译工具链的简写&#xff0c;我们所使用的是gcc系列编译工具链。使用-v参数来查看gcc的版本&#xff0c;从而确定某些语法特性是否可用&#xff0c;…...

【从零实现高并发内存池】申请、释放内存过程联调测试 与 大于256KB内存申请全攻略

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

element-plus添加暗黑模式

main.ts文件 //引入暗黑模式样式 import "element-plus/theme-chalk/dark/css-vars.css"; style.scss文件 // 设置默认主题色 :root {--base-menu-min-width: 80px;--el-color-primary-light-5: green !important;--route--view--background-color: #fff !import…...

第八周作业

1、使用Sqlmap工具完成对DVWA数据库的注入过程&#xff0c;要求按照库、表、列、内容的顺序进行注入 使用kali自带的sqlmap工具进行 (1)爆破库名 sqlmap -u "http://10.0.0.5:8080/vulnerabilities/sqli/?id1&SubmitSubmit#" -p id --cookie "PHPSESSID…...

工作督导 | 具有边缘型人格障碍倾向的高危来访者,咨询师如何应对?

一个学校心理中心&#xff0c;可能同时有几十位乃至数百位同学在接受咨询&#xff0c;其中大约10-20%是重点难点个案&#xff0c;一次督导如果只能督导1-2个个案&#xff0c;不足以保障所有危重难个案的有如何处理恰当、方向正确、快速解决、高效工作&#xff0c;是学校心理咨询…...

c++ map与unordered_map的比较

c map与unordered_map的比较 在c的STL库中&#xff0c;有map与unordered_map这两种名字十分相似的容器&#xff0c;但是他们的区别还是很大&#xff0c;下面我们从 底层实现、性能特性 和 适用场景进行逐一比较 底层实现 std::mapstd::unordered_map底层数据结构红黑树&…...

新手蓝桥杯冲击国一练习题单(四)

2025蓝桥杯省赛已结束&#xff0c;接下来是冲击国赛的时间 此题单为算法基础精选题单&#xff0c;包含蓝桥杯常考考点以及各种经典算法&#xff0c;可以帮助你打牢基础&#xff0c;查漏补缺。 本题单目标是冲击蓝桥杯省一国一&#xff0c;团体程序天梯赛个人国三、XCPC区域赛铜…...

PyTorch深度学习框架60天进阶学习计划 - 第45天:神经架构搜索(一)

PyTorch深度学习框架60天进阶学习计划 - 第45天&#xff1a;神经架构搜索&#xff08;一&#xff09; 第一部分&#xff1a;详解DARTS的可微分搜索空间 大家好&#xff01;欢迎来到我们PyTorch深度学习框架进阶学习计划的第45天。今天我们将深入探讨神经架构搜索(Neural Arch…...

【java 13天进阶Day04】常用API、正则表达式,泛型、Collection集合API

Math类的使用。 Math用于做数学运算。Math类中的方法全部是静态方法&#xff0c;直接用类名调用即可。方法&#xff1a; public static int abs(int a) 获取参数a的绝对值public static double ceil(double a) 向上取整public static double floor(double a) 向下取整public s…...

leetcode 309. Best Time to Buy and Sell Stock with Cooldown

目录 题目描述 第一步&#xff0c;明确并理解dp数组及下标的含义 第二步&#xff0c;分析并理解递推公式 1.求dp[i][0] 2.求dp[i][1] 3.求dp[i][2] 第三步&#xff0c;理解dp数组如何初始化 第四步&#xff0c;理解遍历顺序 代码 题目描述 这道题与第122题的区别就是卖…...

RAG 实战|用 StarRocks + DeepSeek 构建智能问答与企业知识库

文章作者&#xff1a; 石强&#xff0c;镜舟科技解决方案架构师 赵恒&#xff0c;StarRocks TSC Member &#x1f449; 加入 StarRocks x AI 技术讨论社区 https://mp.weixin.qq.com/s/61WKxjHiB-pIwdItbRPnPA RAG 和向量索引简介 RAG&#xff08;Retrieval-Augmented Gen…...

Java拼团项目

一些记录 环境配置 首先是把配置安装好&#xff0c;jdk1.8&#xff0c;maven3.8.8&#xff0c;docker&#xff0c;idea&#xff0c;脚手架 然后创建工程&#xff0c;通过小傅哥的脚手架从远程把一些包&#xff0c;依赖拉过来 然后在gitcode上边创建仓库&#xff0c;把代码提交…...

力扣每日打卡 2364. 统计坏数对的数目 (中等)

力扣 2364. 统计坏数对的数目 中等 前言一、题目内容二、解题方法1. 哈希函数12. 哈希函数22.官方题解2.1 方法一&#xff1a;使用 sqrt 函数 前言 这是刷算法题的第十四天&#xff0c;用到的语言是JS 题目&#xff1a;力扣 2364. 统计坏数对的数目 (中等) 一、题目内容 给你…...

R语言之.rdata文件保存及加载

在 R 中&#xff0c;.rdata 文件是通过 save() 函数创建的。 使用 save() 函数可以将一个或多个 R 对象保存到 .rdata 文件中。使用 load() 函数可以将 .rdata 文件中的对象恢复到当前工作环境中。 1.创建并保存对象到.rdata 假设有一个基于 iris 数据集训练的线性回归模型&a…...

神经网络优化 - 小批量梯度下降之批量大小的选择

上一博文学习了小批量梯度下降在神经网络优化中的应用&#xff1a; 神经网络优化 - 小批量梯度下降-CSDN博客 在小批量梯度下降法中&#xff0c;批量大小(Batch Size)对网络优化的影响也非常大&#xff0c;本文我们来学习如何选择小批量梯度下降的批量大小。 一、批量大小的…...

开源AI守护每一杯------奶茶咖啡店视频安全系统的未来之力

连锁饮品奶茶咖啡店视频安全系统以开源AI技术为引擎&#xff0c;将后厨管理从“被动查漏”升级为“主动防控”&#xff0c;让消费者从“担心卫生”变为“放心下单”。 解决方案亮点&#xff1a;技术驱动&#xff0c;全面防护 1. 实时监控与AI识别&#xff1a;秒级捕捉隐患 亮…...

音视频元素

目录 HTMLMediaElement网络状态 (networkState)就绪状态 (readyState)错误代码 (error.code) video属性方法事件 audio HTMLMediaElement HTMLMediaElement 是 HTML5 中 和 元素的基类&#xff0c;定义了它们共享的属性、方法和事件。无论你使用的是音频还是视频元素&#xff0…...

音视频小白系统入门课-2

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 课程传送门&#xff1a;音视频小白系统入门课 音视频基础ffmpeg原理 往期课程笔记传送门&#xff1a; 音视频小白系统入门笔记-0音视频小白系统入门笔记-1 课程实践代码仓库&#xff1a;传送门 音视频编解…...

时序逻辑电路——序列检测器

文章目录 一、序列检测二、牛客真题1. 输入序列连续的序列检测&#xff08;输入连续、重叠、不含无关项、串行输入&#xff09;写法一&#xff1a;移位寄存器写法二&#xff1a;Moore状态机写法三&#xff1a;Mealy状态机 一、序列检测 序列检测器指的就是将一个指定的序列&…...

#systemverilog# 进程控制问题#(八)关于#0 问题的使用(三)

今天,我们继续研究一下上一节讨论的问题。其实,还有一个小问题,我们来探讨一下。 `timescale 1ns/10psmodule tb_top(); reg clk; reg reset;initial begin reset = 0; #10 reset = 1; #15 reset = 0; #50 $finish; endinitial beginfor(int i = 0; i < 4 ; i++)fork #…...

k8s低版本1.15安装prometheus+grafana进行Spring boot数据采集

目录 一、背景&#xff1a; 二、实施过程 1&#xff09;.安装地址&#xff1a;https://github.com/prometheus-operator/kube-prometheus 2).安装方式两种&#xff0c; 3&#xff09;.安装Prometheus需要对照k8s集群版本。 4&#xff09;.拉去prometheus 5&#xff09;.导…...

Spring-Ioc容器的加载过程?

大家好&#xff0c;我是锋哥。今天分享关于【SpringIoC的实现机制是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring-Ioc容器的加载过程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring IoC容器的加载过程是指在应用启动时&…...

kaamel Privacy agent:AI赋能的隐私保护技术解决方案

智能隐私合规解决方案 在当今数字经济环境下&#xff0c;有效的隐私合规已成为企业运营的基础要求。全球范围内已有超过120项隐私法规生效&#xff0c;这对企业的数据处理流程提出了严峻挑战。kaamel Privacy agent作为专门为隐私合规领域设计的AI引擎&#xff0c;通过自动化技…...

从零到上线!AI生成SpringBoot项目脚手架实战(含K8s+Docker配置)

在 Java 开发领域,搭建 Spring Boot 项目脚手架是一项耗时且繁琐的工作。传统方式下,开发者需要手动配置各种依赖、编写基础代码,过程中稍有疏忽就可能导致配置错误,影响开发进度。如今,随着 AI 技术的迅猛发展,飞算 JavaAI 的出现为开发者带来了全新解决方案,让自动生成 Sprin…...

VueRouter笔记

定义路由 import { createMemoryHistory, createRoute } from vue-router; import MyView1 from ./MyView1.vue; import MyView2 from ./MyView2.vue;const routes [{ path: /1, component: MyView1 },{ path: /2, component: MyView2 } ];const router createRouter({histo…...

vue3 Element-plus修改内置样式复现代码

笔者在修改Element-plus的内置样式时&#xff0c;遇到一点挫折&#xff0c;现提供需求场景与解决方案。 一、实现&#xff08;1&#xff09;透明弹窗可拖拽&#xff0c;且不影响点击弹窗外内容&#xff1b;&#xff08;2&#xff09;弹窗内置表格&#xff0c;表格需修改样式颜色…...

easyui进度条

简单打开和关闭 // 展示进度条 $.messager.progress({title: 请稍候,msg: 系统处理中...,text: 0%});//关闭进度条 $.messager.progress(close); easyui 普通提示 <!DOCTYPE html> <html> <head><meta charset"UTF-8">&l…...

vcpkg缓存问题研究

vcpkg缓存问题研究 问题描述解决方案官网给出的方案其实并不是大多数人语境中的“清除缓存”实际解决方案 问题描述 使用vcpkg管理c的库的时候&#xff0c;vcpkg会在c盘某些地方缓存下载的库&#xff0c;如果安装的库过多&#xff0c;这个缓存文件夹会过大占用磁盘空间&#x…...

优化WAV音频文件

优化 WAV 音频文件通常涉及 减小文件体积、提升音质 或 适配特定用途&#xff08;如流媒体、广播等&#xff09;。以下是分场景的优化方法&#xff0c;涵盖工具和操作步骤&#xff1a; 一、减小文件体积&#xff08;无损/有损压缩&#xff09; 1. 无损压缩 转换格式&#xff1…...

系统架构设计师:流水线技术相关知识点、记忆卡片、多同类型练习题、答案与解析

题目&#xff1a; 流水线技术中&#xff0c;若某流水线分为5段&#xff0c;每段执行时间为Δt&#xff0c;则执行100条指令的总时间为&#xff08; &#xff09; A. 100Δt B. 104Δt C. 500Δt D. 505Δt 答案&#xff1a;B‌ ‌解析&#xff1a;流水线总时间(nk-1)Δt&#…...

test ssl java

// 文件名&#xff1a;SslUtilsTest.java// 包路径&#xff1a; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import java.io.InputStream; import java.security.KeyStore; import javax.net.ssl.SSLContext; import org.apache.hc.client5…...

【系统分析师】-软件工程

考点汇总 考点详情 软件生存周期&#xff1a;可行性分析与项目开发计划&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试&#xff0c;维护 软件能力成熟度模型 CMM&#xff1a;初始级&#xff0c;可重复级&#xff0c;已定义级…...

FFmpeg 硬核指南:从底层架构到播放器全链路开发实战 基础

目录 1.ffmpeg的基本组成2.播放器的API2.1 复用器阶段2.1.1 分配解复用上下文2.1.2 文件信息操作2.1.3 综合示例 2. 2 编解码部分2.2.1 分配解码器上下文2.2.2编解码操作2.2.3 综合示例 3 ffmpeg 内存模型3.1 基本概念3.2API 1.ffmpeg的基本组成 模块名称功能描述主要用途AVFo…...

2025MathorcupD题 短途运输货量预测及车辆调度问题 保姆级教程讲解|模型讲解

2025Mathorcup数学建模挑战赛&#xff08;妈妈杯&#xff09;D题保姆级分析完整思路代码数据教学 其中更详细的思路&#xff0c;各题目思路、代码、讲解视频、成品论文及其他相关内容&#xff0c;可以点击下方群名片哦&#xff01;...

CSS 包含块

CSS 中的包含块&#xff08;Containing Block&#xff09;是一个非常重要的概念&#xff0c;它定义了元素在布局中的参考框架。元素的尺寸、位置和偏移量通常都是基于其包含块来计算的。理解包含块的概念对于掌握 CSS 布局至关重要。 1. 包含块的作用 定位元素&#xff1a;当…...

嵌入式设备网络的动态ID分配机制实现

文章目录 前言一、系统设计要点二、核心数据结构2.1 设备唯一标识(DeviceUID)2.2 节点信息(Node)2.3 节点管理器(NodeManager) 三、核心算法实现3.1 初始化与清理3.1.1 初始化节点管理器3.1.2 清理节点管理器 3.2 动态ID分配策略3.2.1 查找最小可用ID3.2.2 ID使用检查 3.3 心跳…...

(论文阅读)RNNoise 基于递归神经网络的噪声抑制库

RNNoise 是一个基于递归神经网络的噪声抑制库。 有关该算法的描述见以下论文&#xff1a; J.-M. Valin, A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech Enhancement, Proceedings of IEEE Multimedia Signal Processing (MMSP) Workshop, arXiv:1709.08…...