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

[Android] Android文件系统中存储的内容有哪些?

文章目录

  • 前言
  • root 文件系统
  • /system 分区
    • 稳定性:
    • 安全性:
  • /system/bin
    • 用来提供服务的二进制可执行文件:
    • 调试工具:
    • UNIX 命令:
    • 调用 Dalvik 的脚本(upall script):
      • /system/bin中封装的app_process脚本
    • 厂商定制的二进制可执行文件:
  • /system/xbin
  • /system/lib[64]
  • /system/etc
  • /data 分区
    • /data与 Android 操作系统版本之间低合
    • 在用户需要时,/data 可以被加密起来。
    • /data 也可以被设为不可执行
  • /data/data
  • /data/misc
  • /data/system
  • /cache 分区
  • /vendor 目录
  • SD卡
  • 参考

前言

如果不考虑厂商造成的差异,Android 标准的分区还是能构成一个定义良好的文件系统层的。

纵观全文,虽然没有太多技术性和需要逻辑推理的内容,但是看完之后,相信对于Android文件系统会有更深入的理解。例如我们Android开发的时候经常需要使用到的data/data目录,例如进入shell之后看到的一些root目录,sd卡目录和其他等等一些常见的文件目录。相信无论对于Android应用开发,抑或是Android系统开发都有一定的启发性。

root 文件系统

Android的root 文件系统(/)是mount 自一个RAM Disk (initramfs)的。每次启动时,启动加载器 (fastboot)从 boot 分区中把这个文件系统的镜像加载到内存(RAM)中,并把它交给内核。

就目前的讨论而言,最关键的一点是除非知道设备被“刷机”(flashed),否则 root 文件系统(/)是不能被修改的。这是很重要的,因为 root文件系统中含有系统最重要的组件/init,它能以 root 权限执行任何操作,并控制着系统的启动过程。

一般 Linux 在启动过程中,通常是用 initramfs(以内核模块的形式)把驱动加载到内核中,而且最终会在它被真正的文件系统取代后把它丢弃掉。

不过在 Android 中却不是这样,Android的 initramfs 还会驻留在内存中,并提供 root 文件系统(/)的功能。

initramfs(initial RAM filesystem)是一个用于在Linux启动过程中提供初始根文件系统的临时文件系统。它是一个包含一些必需工具和驱动程序的轻量级文件系统,用于引导操作系统,以便在真正的根文件系统(通常是硬盘上的文件系统)准备好之前执行一些必要的初始化和准备工作。

在Linux启动时,内核被加载到内存中并开始初始化系统。在这个过程中,内核需要访问一些必要的文件和工具,例如驱动程序、文件系统工具等。而这些文件和工具通常存储在硬盘上的根文件系统中。然而,如果根文件系统存储在某些类型的存储设备上,例如RAID、LVM、加密设备,或者在网络上,那么内核可能无法直接访问根文件系统,因为相关的驱动程序和工具可能需要在根文件系统挂载之后才能使用。

这时就引入了initramfs的概念。initramfs被挂载到内存中,并包含了一些必要的驱动程序和工具,以便内核能够继续系统初始化过程。一旦initramfs完成其任务,它就会被卸载,而真正的根文件系统会被挂载到内存中,系统将继续启动过程。

/system 分区

/system 分区是存放所有谷歌或厂商提供的 Android 组件的地方。该目录及其中存储的内容都是属于root:root的,所有的权限都是 0755(rwxr-xr-x),但是该文件系统是以只读方式 mount的。这样做,主要是基于以下两个方面的考虑。

稳定性:

由于文件系统是以只读方式 mount 的,所以其中的内容也就不会受到破坏,即便是在设备突然断电时也是如此。这降低了因为该分区受到破坏而导致 Android 系统不能启动、使手机“变砖”的风险。

安全性:

以只读方式 mount 也是保护 Android 的系统组件不会被恶意修改的手段之一。尽管在真实情景中,只要以读-写参数重新 mount 一下这个分区就能搞定它了。

从 KitKat 开始,谷歌开始不再对/system 分区的完整性进行校验了,转而改用 Linux 内核中的dm-verity 特性保护/system分区的完整性。

/system/bin

/system/bin 目录中含有 Android 使用的各种原生可执行文件,此外,它也是存放各种调试工具的地方。具体来说,这些二进制可执行文件可以被分成 5 类。

用来提供服务的二进制可执行文件:

这类二进制可执行文件都是在系统运行过程中由/init 调用的,它们的调用路径会被写进/init 使用的rc 文件中。这类二进制可执行文件并非完全来自AOSP。部分截图:
在这里插入图片描述

调试工具:

被归入这一类的是一些用于调试的原生二进制可执行文件。
下面列出的这些二进制可执行文件在模拟器上都能找到,但是厂商(出于安全谨慎的考虑)可能会把它们从真实销售的设备中删掉。部分截图:
在这里插入图片描述

UNIX 命令:

为了让 shell 用户也能在 Android 上玩,UNIX 命令都被封装在一个单独的二进制可执行文件/system/bin/toolbox中。

busybox是嵌入式系统中常见的多合一工具集,而 toolbox 则是它在 Android 中的定制版。toolbox 和 busybox 并不是逐条提供各个UNIX命令的,它们只含有这些命令的基本功能。

toolbox中精简了 busybox 中的命令集,只提供其中的一部分常用命令,但也加上了一些 Android特有的命令(如getprop/setprop/watchprop)

调用 Dalvik 的脚本(upall script):

这些调用 Dalvik 的脚本让用户通过 shell 与 Dalvik运行时框架交互,这多半是为了进行调试。

这些脚本调用/system/bin/app_process,用它们在/system/framework 目录中的同名JAR框架,加载 Dalvik 类。

在使用时,脚本会把用户传给它的参数直接传递给 Dalvik 类。
调用Dalvik的脚本模板:
在这里插入图片描述

/system/bin中封装的app_process脚本

在这里插入图片描述
在这里插入图片描述

厂商定制的二进制可执行文件:

从本质上讲,这类二进制可执行文件可以完全由厂商控制,但是这类二进制可执行文件通常都是些提供服务的程序或调试工具。

/system/xbin

/system/xbin目录类似于UNIX 中的/sbin 目录,其中含有管理员会觉得非常有用的二进制可执行文件。但是普通用户最好还是离这个目录远一些。目录名中用的是“x”而不是原来的“s”,是为了避免与 Android 自身的/sbin (这个目录是 root 文件系统的一部分,其中含有系统操作时必须使用的二进制可执行文件)冲突。

这个目录中的二进制可执行文件是从AOSP的system/extras 目录中编译得来的。因为这个目录不是普通操作所必须的,所以这个目录是不是会出现在设备中完全取决于厂商的意愿。

有些厂商会干脆把这个目录删掉,或只保留一个 dexdump 二进制可执行文件。

/system/lib[64]

/system/lib(在64位系统中则是/system/lib64)目录中含有供/system/bin 和/system/xbin目录中的二进制可执行文件使用的共享库。

在大多数设备中,/system/lib 中有多个子目录,其中的一些是根据设备的不同而不同的,但是下面这些子目录一般都会存在:

  • drm/(提供DRM引擎)
  • egI/ (Android 版的 OpenGLES)
  • hw/(各个HAL 模块)
  • ssl/engines(含有 libkeystore.so,该共享库使得OpenSSL能使用Android的Keystore机制)

在Intel设备中,/system/lib
通常还另外含有一个名为arm/的子目录,其中含有为ARM体系结构的处理器编译的共享库的拷贝。这些共享库会被用在 Intel
的二进制执行环境转换层(binary translation layer) Houdini上,用来为要执行的ARM 的二进制可执行文件提供一个完整的运行时环境。

/system/etc

就像它在UNIX系统中的同名目录一样,Android 的/system/etc 目录中也存放着各种配置文件之类的东西。/etc 也是该目录的符号链接,这样做是为了保持兼容性,因为有些 AOSP 外部项目会到这里去查找配置文件。

在这里插入图片描述

/data 分区

/data 分区是所有用户个人数据的存放地点。为此单独提供一个分区,有这么几个重要的好处:

/data与 Android 操作系统版本之间低合

系统升级和恢复时会擦除或者重写整个/system 分区,但却不会以任何方式影响用户数据。反之,通过格式化/data 分区,也可以快速重置设备,并擦除所有用户个人数据。实际上这就是在“恢复出厂设置”过程中所做的工作。

在用户需要时,/data 可以被加密起来。

加密,不论怎么优化,由于在读写过程中分别要进行解密和加密操作,所以总会在一定程度上增加系统延迟。而在设计上,/system 分区中是没有敏感数据的,所以也就没有必要加密这个分区,因而也就规避了因加密这一分区而带来的延迟。

/data 也可以被设为不可执行

尽管到 KitKat 为止,这还不是默认选项。不过这样做,不光能使它更名副其实,还能极大地加大恶意软件的攻击难度。因为,这样恶意软件就没有一个可写又可执行的分区,让它能把恶意的可执行文件写在该分区中然后再执行了。

因为 DEX 和OAT 是运行在虚拟机里的,所以这对正常的 Dalvik/ART app 不会有任何影响。

OAT 是 Android 运行时(ART)使用的一种编译后的文件格式。ART 是 Android 系统中的应用程序运行时环境,取代了之前的 Dalvik 虚拟机。OAT 文件包含了应用程序的本机机器代码,它是通过预先编译应用的 DEX(Dalvik Executable)文件而生成的。在运行 Dalvik/ART 虚拟机时,Android 应用程序的 Java 源代码首先被编译成 DEX 文件,然后在运行时通过 JIT(Just-In-Time)编译或者 AOT(Ahead-Of-Time)编译方式转换成本机机器代码,最终生成 OAT 文件。
OAT 文件的作用是加速应用程序的启动和执行过程,因为本机机器代码相对于解释执行的 DEX 文件能够更快地执行。这种预先编译的方式有助于提高 Android 应用的性能。

但是对 root 可能会有一定的影响,例如,需要重新 mount /data 以及/system 分区。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

/data目录的权限和/data/data 的一样,都被设为 chmod 771system。这一做法源于Android安全模型的要求:对于所有的应用而言,目录都是可执行的(即可以用 cd 命令切换),但同时又是不可读的(这样,应用或者不受信任的进程就不能将“相邻”目录一一列出)。这也就意味着,在 uidshell 里,也就是没有 root 权限的 adb 会话中,你可以把当前目录切换到/data 目录或者它的大多数子目录上,但没有必要让你能读取其中的内容。system子目录及其子目录(即/data/system和/data/misc)是可读的,但是/data/data
和/data 本身是拒绝执行 ls 命令的。从 KitKat 起,这一做法通过 SELinux标签被引入,你要想遍历各个子目录就得有 root
权限才行。

/data/data

/data/data 这个名字看上去有些罗嗦的目录是所有应用 (不论是系统应用还是用户安装的应用)存储它们的信息的地方。

每个应用都有一个单独的、以逆 DNS 格式命名的子目录。其权限设置为chmod 751(rwxr-x–x),前二者为应用拥有者的 uid 和gid 的权限。

/data/data 目录本身的权限设置为chmod 771 system system,这使得所有的应用都能列出其中的子目录,但却不能读取除了 system 拥有的应用外的其他数据。

不过应用中,文件的安全防护措施的设置还是要交给每个应用自己来完成,因为尽管除了应用的拥有者外,其他人都不能读取各个应用目录中的内容,但是这些应用目录本身还是可执行的。

/data/data 下各个应用的子目录是各个应用在整个文件系统中唯一能写入数据的地方。再加上很多市面上能找到的,而且也会被装到很多手机里去的应用都能定位 GPS 位置,收发短信和打电话,这就使得这个目录中的一些地方能够成为电子取证时的“聚宝盆”。我们特别关心的一些子目录:
在这里插入图片描述

应用也可以把数据保存在 SD 卡上(如果它们有权限的话),但是大多数与应用状态相关的数据一般还是能在/data/data
中的对应目录里找到的。如果你想手动保存和恢复应用的状态的话(比如,在游戏中作弊),这是非常有用的。应用也可以注册 Android的备份服务,自动进行备份(备份可以放在本地,也可以放在谷歌的云服务器上)。

/data/misc

/data/misc 目录中含有各个 Android 子系统的各种五花八门的 (miscellaneous)数据和配置目录。和它的名字所暗示的相反,该目录中也含有一些系统中最重要的文件。

在这里插入图片描述

/data/system

/data 分区中另一个重要的子目录是/data/system,因为该目录中含有对维护设备状态非常重要的文件。这个目录的访问权限也是被限制为 system:system 的。所以如果你的设备没有被 root,是看不到下表中给出的任何一个文件的:
在这里插入图片描述

/cache 分区

Android 是在系统升级的过程中使用/cache 分区的。系统升级包会被下载到这里,启动管理器(boot manager)特别是在 recovery/升级模式下启动时,会要使用这个分区。但除此之外,在正常情况下,这个分区是空的。
如果你最近下载过 OTA 升级包,在它被安装之前,你都能在这个分区里看到它。另外,recovery这个二进制可执行文件和系统(特别是android.os.RecoverySystem类)在启动到recovery(或系统升级)模式时,也会使用这个分区交换信息。

/vendor 目录

/vendor 目录是用来存储厂商对 Android 系统的修改的。这样做是为了在必要时能有效地进行系统的更新或升级操作(同时不至于把厂商对系统的修改一起抹除)。专门指定的系统组件在添加/system 路径之前时,会先去检查事先被写死在程序中的/vendor 中的路径。

SD卡

Android 最棒的一个特性就是: 它内置支持 SD 卡,这是许多 ioS 用户梦寐以求的东西。现在大多数手机已经都自带一个 SD 卡插口了 (尽管插-拔都不是很方便),平板电脑上也已经有了插-拔都很方便的扩展插口了。

大多数 SD卡都会被格式化成 vFAT 或者 FAT32文件系统,但是这个类型的文件系统是不支持权限的。为了能强制实现权限,以及支持(从JellyBean 开始提供的) 多用户配置,Android通过 FUSE(用户态下的文件系统)模拟SD 卡的方式,算是强解决了这个问题。

FUSE 使我们能在一个用户态user mode,这也是 FUSE 的名称后半部分的由来,前面的F 表示文件系统(File system)]进程中,而不需要在内核中实现文件系统。

FUSE会在内核中安装一个用于支持通用文件系统的小模块,通过它和 VFS 对接并实现基本的注册文件系统功能。

而真正的文件系统是在一个用户态进程/system/bin/sdcard 中实现的。

在Android 的演化过程中,SD卡的 mount点被改过好几次,新版的 Android 中,该 mount 点在/storage/ext_sd。对于没有 SD卡的设备,这个mount 点通常会指向/data 分区中的某个目录,它一般是/data/media/0。

上面这些标准目录已经在androids.Environment 类中被定义为常量了。第三方应用也能(而且经常会)在SD 卡中创建它们自己的文件和目录。

Android 还提供了一个模拟 SD 卡文件系统,可以在设备中没有 SD 卡时使用,也可以和“真正的”SD 卡文件系统同时使用。使用 mount 命令,可以观察到SD卡目录结构:
在这里插入图片描述

参考

《Android最强Android书:架构大剖析》

相关文章:

[Android] Android文件系统中存储的内容有哪些?

文章目录 前言root 文件系统/system 分区稳定性:安全性: /system/bin用来提供服务的二进制可执行文件:调试工具:UNIX 命令:调用 Dalvik 的脚本(upall script):/system/bin中封装的app_process脚本 厂商定制的二进制可执行文件: /system/xbin/system/lib[64]/system/…...

透明拼接屏在汽车领域的应用

随着科技的进步,透明拼接屏作为一种新型的显示技术,在汽车领域的应用越来越广泛。尼伽小编将围绕透明拼接屏在汽车本身、4S店、展会、工厂等方面的应用进行深入探讨,并展望未来的设计方向。 一、透明拼接屏在汽车本身的应用 车窗显示&#x…...

“深入理解RabbitMQ交换机的原理与应用“

深入理解RabbitMQ交换机的原理与应用 引言1. RabbitMQ交换机简介介绍1.1 什么是RabbitMQ?1.1.1 消息中间件的作用1.1.2 RabbitMQ的特点和优势 1.2 RabbitMQ的基本概念1.2.1 队列1.2.2 交换机1.2.3 路由键 1.3 交换机的作用和分类1.3.1 直连交换机(direct…...

Programming Abstractions in C阅读笔记:p248-p253

《Programming Abstractions in C》学习第69天,p248-p253总结,总计6页。 一、技术总结 “A generalized program for two-player games”如标题所示,该小节强调要学会从一个复杂的程序中抽象出通用的内容——这也是本书的主旨——“Program…...

面试题目,你对前端工程化的了解

前端工程化是通过工具和流程来提高软件开发效率、降低维护成本以及改善项目可维护性的方法。在前端领域,前端工程化通常包括以下方面内容 版本控制 使用 git 来管理代码的版本,追踪变更,协作开发等项目脚手架 使用项目的脚手架进行项目的初始…...

2023年春秋杯网络安全联赛冬季赛 Writeup

文章目录 Webezezez_phppicup Misc谁偷吃了外卖modules明文混淆 Pwnnmanagerbook Reupx2023 CryptoCF is Crypto Faker 挑战题勒索流量Ezdede 可信计算 Web ezezez_php 反序列化打redis主从复制RCE&#xff1a;https://www.cnblogs.com/xiaozi/p/13089906.html <?php c…...

docker安装Rabbitmq教程(详细图文)

目录 1.下载Rabbitmq的镜像 2.创建并运行rabbitmq容器 3.启动web客户端 4.访问rabbitmq的微博客户端 5.遇到的问题 问题描述&#xff1a;在rabbitmq的web客户端发现界面会弹出如下提示框Stats in management UI are disabled on this node 解决方法 &#xff08;1&#…...

java web mvc-05-JSF JavaServer Faces 入门例子

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …...

yolov8 训练voc数据集

yolov8训练 from ultralytics import YOLO# 加载模型 # model YOLO(yolov8n.yaml) # 从YAML构建新模型 # model YOLO(yolov8n.pt) # 加载预训练模型&#xff08;推荐用于训练&#xff09; model YOLO(yolov8n.yaml).load(yolov8n.pt) # 从YAML构建并转移权重# 训练模型…...

Python笔记12-多线程、网络编程、正则表达式

文章目录 多线程网络编程正则表达式 多线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程&#xff1a; 就是一个程序&#xff0c;运行在系统之上&#xff0c;那么便称之这个程序为一个运…...

X射线中关于高频高压发生器、高清晰平板探测器、大热容量X射线球管、远程遥控系统的解释

高频高压发生器&#xff08;High Frequency High Voltage Generator&#xff09; 在医用诊断X射线设备中扮演着关键角色&#xff0c;它主要用于产生并控制用于X射线成像的高压电能。 这种发生器采用高频逆变技术&#xff0c;通过将输入的低电压、大电流转换为高电压、小电流&am…...

【算法】最短路计数(搜索)复习

题目 给出一个 N 个顶点 M 条边的无向无权图&#xff0c;顶点编号为 1 到 N。 问从顶点 1 开始&#xff0c;到其他每个点的最短路有几条。 输入格式 第一行包含 2 个正整数 N,M&#xff0c;为图的顶点数与边数。 接下来 M 行&#xff0c;每行两个正整数 x,y&#xff0c;表…...

html火焰文字特效

下面是代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5火焰文字特效DEMO演示</title><link rel"stylesheet" href"css/style.css" media"screen" type&quo…...

Redis双写一致性

所有的情况都是再并发情况下存在温蒂 一、先更新数据库&#xff0c;再更新缓存场景-不推荐 当有两个线程A、B&#xff0c;同时对一条数据进行操作&#xff0c;一开始数据库和redis的数据都为1&#xff0c;当线程A去修改数据库&#xff0c;将1改为2&#xff0c;然后线程A在修改…...

html+css+javascript实现贪吃蛇游戏

文章目录 一、贪吃蛇游戏二、JavaScript三、HTML四、CSS五、热门文章 一、贪吃蛇游戏 这是一个简单的用HTML、CSS和JavaScript实现的贪吃蛇游戏示例。 HTML部分&#xff1a; <!DOCTYPE html> <html> <head><title>贪吃蛇游戏</title><styl…...

【K8S】Kubernetes 中滚动发布由浅入深实战

目录 一、Kubernetes中滚动发布的需求背景1.1 滚动发布1.2 滚动发布、蓝绿发布、金丝雀发布的区别 二、Kubernetes中实现滚动发布2.1 定义Kubernetes中的版本2.2 创建 Deployment 资源对象2.2.1 在 Yaml 中定义 Deployment 资源对象2.2.2 执行命令创建 Deployment 资源对象 三、…...

MSP430仿真器使用常见问题

一、 主要是驱动安装问题 有用户反应驱动安装不上&#xff0c;按照用户手册操作一直不能安装成功。 可以尝试如下步骤进行安装。 1. 双击设备管理器中无法安装或者提示有错误的430仿真器设备 选择驱动程序——更新驱动程序 选择手动安装 选择从电脑设备驱动列表中安装 弹出下…...

芯驰E3340软件编译以及更新步骤

打开已有工程File->Open Solution: 东南项目&#xff1a;e3340\boards\e3_324_ref_display\proj\jetour-t1n-fl3\sf\SES 编译&#xff1a;build->build sf 增加头文件和宏定义&#xff1a; 编译完成sf后&#xff0c;进行编译bootloader 东南项目&#xff1a;e3340\boa…...

HCIA——18实验:NAT

学习目标&#xff1a; NAT 学习内容&#xff1a; NAT 1.要求——基本的 2.模型 3.IP分配、规划、优化 1&#xff09;思路 R2为ISP路由器&#xff0c;其上只能配置ip地址&#xff0c;不得冉进行其他的任何配置—ospf配置 认证 、汇总、沉默接口、加快收敛、缺省路由 PC1-PC2…...

在VBA中使用SQL

VBA在处理大量的数据/计算时如果使用常规方法会比较慢,因此需要对其进行性能优化以提高运行速度,一般的方法是数组计算或者sql计算。SQL计算的速度最快,限制也是最多的,数组速度其次,灵活性也更高 如果要在vba中调用sql处理数据基本可以遵循一个套路,只要修改其中的SQL语…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...