【Linux】文件系统和软硬链接

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 前言
  • 一、认识磁盘
      • 1.1 磁盘的物理结构
      • 1.2 磁盘的存储结构
      • 1.3 磁盘的逻辑抽象结构
  • 二、EXT2文件系统
      • 2.1 分区
      • 2.1 深入理解inode
      • 2.3 如何理解目录
      • 2.4 在磁盘上创建一个文件,操作系统做了什么
      • 2.5 在磁盘上删除一个文件,操作系统做了什么
      • 2.6 在磁盘上查找一个文件,操作系统做了什么
      • 2.7 在磁盘上修改一个文件,操作系统做了什么
  • 三、软硬链接
      • 3.1 软链接
      • 3.2 硬链接
      • 3.3 为什么要有软硬链接(实际用途)

前言

  • 前面我们学习文件相关的知识,如文件操作等,文件都是被进程打开(内存文件),根据冯诺依曼体系结构,被打开的文件一定会被加载到内存,由操作系统管理。(Linux学习目录)

  • 但并不是所有的文件都会被进程打开,那么没有打开的文件就只能在磁盘上呆着(磁盘文件)。当然了,没有打开的文件也应当进行管理,我们把做这部分管理工作称之为文件系统。

  • 文件系统属于操作系统中的一部分,通常通过磁盘或其他存储介质来管理文件(路径问题,存储问题,获取问题内容+属性,删除修改等效率问题)。因此,在学习文件系统之前,我们首先需要认识磁盘。

一、认识磁盘

1.1 磁盘的物理结构

磁盘可以指代任何一种使用磁性存储介质来存储数据的设备,包括硬盘、软盘、光盘等。在许多情况下,人们使用术语"磁盘"来泛指硬盘。

以下是磁盘的构成图:

请添加图片描述

  • 盘片:磁盘通常由盘片组成,每个盘片都被涂上磁性材料。每个盘片的两面都可以用来存储数据。因此,盘片的个数决定你的磁盘容量。

  • 磁头:每面盘片的上下方都会有一个磁头,用于读写数据。这些磁头可以在盘片的表面移动,以便访问不同的磁道和扇区(在后面会详细介绍)。注意:盘片和磁头不接触。磁头与盘片直接接触会导致它们之间的摩擦,从而造成磁头和盘片表面的损坏。这种损坏可能会导致数据丢失。因此磁头与盘片之间是通过一个微小的空气垫来读取和写入数据。

  • 其他自行了解 ~

1.2 磁盘的存储结构

上面我们说过,数据存储在盘片上,但具体是如何存储的呢?接着往下看 ~

请添加图片描述

  • 磁道:盘片表面被划分成多个同心圆,每个同心圆称为一个磁道。

  • 扇区:每个磁道被划分为多个扇区,扇区是存储数据的最小单位,通常包含512字节或4KB的数据。因此,磁头之所以在盘片表面上移动,其实是根据磁头(Header)确定哪个盘面,再根据柱面 (Cylinder)定位哪个磁道,然后再确定扇区(Sector) 并进行读写数据。我们称定位方式为:CHS寻址方式

  • 柱面:柱面是垂直于盘片表面的一组磁道的集合,这些磁道位于不同盘片上但在相同半径位置上。

1.3 磁盘的逻辑抽象结构

首先我们可以将磁盘想象成一个线性的存储介质,想想磁带:

在这里插入图片描述

磁带被卷起来时,就像盘片一样是圆形的,而当我们把磁带拉直后,就是线性的。那么我们可以等同把盘片“拉直”,即想象成线性的结构。那么,我们就可以把盘片当成是数组。

请添加图片描述

盘片表面被划分成多个同心圆,即磁道。

请添加图片描述

并且每个磁道被划分为多个扇区,是用来存储数据的

请添加图片描述

因此,在我们看来,整个磁盘不就可以抽象成是以扇区为单位拼接起来的数组吗?因此对磁盘的管理,就转化成为了对数组空间的管理。

二、EXT2文件系统

2.1 分区

有了上述的知识,此时我们就可以进入文件系统的学习了,文件系统的本质就是操作系统对磁盘上的数据进行管理的方式。那么假设现在有一个磁盘的大小是800GB,操作系统该如何管理这么大的磁盘空间呢?

请添加图片描述

操作系统为了更好的管理磁盘,于是对磁盘进行了分区(将大问题分解成小问题,采用分治的思想)。例如在Windows下的磁盘一样被分为C盘D盘两个区域。

请添加图片描述

操作系统还是通过先描述再组织的方式对一个一个分区进行管理

struct partion
{int start;int end;
}

当磁盘完成分区后,我们还需要对磁盘进行格式化。磁盘格式化就是对磁盘中的分区进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被清除。简单来说,磁盘格式化就是对分区后的各个区域写入对应的管理信息。

以一个分区为例:

请添加图片描述

总结:操作系统对磁盘的管理,采用分治思想,把磁盘进行分区,然后进行区内分组,只要把一个组管理好,进而就能管理整个磁盘。

  • 启动块(Boot Block):在传统的文件系统中,磁盘上的每个分区通常都会以Boot Block开头。它包含了引导加载程序所需的信息,可以帮助计算机启动并加载操作系统,使得计算机可以正常启动。

  • 块组(Block Group):文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。如Super Block等。可以怎么理解:分区就相当于把中国分为数个省份,然后再对每个省份分组成数个市/县。那么如果将每个市/县管理好,不就把一个省管理好了吗?

  • 超级块(Super Block):存储了文件系统的整体信息,如文件系统的大小、块大小、inode数量、挂载时间等。超级块的信息被破坏,可以说整个文件系统结构就被破坏了。

  • 块组描述符(Group Descriptor Table):描述了文件系统中每个块组的布局和组织方式。

  • 块位图(Block Bitmap):记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。使用0/1状态表示。

  • inode位图(inode Bitmap):记录inode是否空闲可用,使用0/1状态表示。

  • 节点表(inode Table):实际上是一个数组,数组的每一个元素都对应一个inode编号,inode编号则对应一个inode结构,inode结构保存一个文件的所有属性。注意:每个文件都有自己的inode结构

  • 数据块(Data block):用于存储文件内容,以块的形式呈现。常见的文件系统数据块大小4KB

2.1 深入理解inode

从上我们可以得出一个结论:Linux中,文件的内容和属性是分开存储的!其中保存属性信息的结构称之为inode。除此之外,因为磁盘中一定会存在大量的文件,注定了存在大量的inode结构。因此为了区分每个文件的inode结构,操作系统给每个文件的属性集取一个唯一编号,即inode编号。总之,inode是一个文件的属性集合,但为了区分大量的inode,我们需要为每个inode设置唯一的inode编号。注意:inode编号只在自己的分区内有效。

  • inode编号的分配规则

ext2文件系统会从inode表中找到一个空闲的inode,然后标记相应的inode Bitmap位图,指示该inode已经被分配。因此,inode编号是根据inode表中的位置分配的

struct inode
{inode编号文件类型权限拥有者链接数所属组ACM时间指向文件数据块的指针...
}

在这里插入图片描述

注意:在Linux文件系统中,文件名通常不包含在文件属性集inode中。文件名只是用户用来标识和访问文件的一种便捷方式。实际上,文件系统通过inode来管理文件的属性和位置信息,而文件名只是与inode相关联的一个别名。

Linux中,我们可以使用-i选项来查看一个文件的inode编号,例如

请添加图片描述

2.3 如何理解目录

我们用户是拿文件名来对文件操作,可是操作系统只认inode编号来获取一个文件的属性,那么文件名和inode编号是如何建立关系的呢?

Linux中,我们知道一切皆文件。因此,每个目录也有自己属性,即也有自己的inode

请添加图片描述

而目录里也可以包含数据(目录/文件),因此也有自己的数据块。那么目录的数据块里存的是什么呢?

答:对于目录,数据块中存储的是该目录下文件名和该文件对应的inode编号的映射关系map<string, int>

所以文件名只是一个给用户使用的间接inode编号,用户只要拿到文件名,然后操作系统再去指定目录的数据块去找文件名和inode编号的映射关系,就可以进行对文件的读写!

总结:文件名和inode编号的关系是由目录来建立和维护的。其数据块存储着文件名和inode编号的映射关系。

2.4 在磁盘上创建一个文件,操作系统做了什么

  1. 当在Linux中创建一个新文件时,系统会拿着你新建的文件名在指定的目录下的数据块查找是否有已经存在的inode编号。如果有则创建失败。
  2. 如果在指定路径下没有同名文件,系统会检查当前分组的inode Bitmap是否有空闲的inode位,如果有并将其标记为已使用。然后根据其标记位为新文件分配一个空闲的inode编号。
  3. 找到空闲的inode后,系统会将新文件的所有属性写入inode Table中对应的inode结点当中。
  4. 此时,文件还没有分配实际的数据块用于存储内容,这就是所谓的"延迟分配"机制。文件系统会延迟分配数据块,直到用户向文件写入数据时才会触发实际的数据块分配。当用户开始向文件写入数据时,文件系统会根据需要分配适当数量的数据块,并将文件内容写入这些数据块中。这样可以更好地利用磁盘空间,避免不必要的空间浪费。

2.5 在磁盘上删除一个文件,操作系统做了什么

  1. 当要删除一个文件时,操作系统会拿着指定的文件名到指定目录下的数据块中查找inode编号。

  2. 一旦获得了要删除文件的inode编号,系统会在inode Bitmap中将对应的bit位由1置成0,来表示这个inode已经被删除。

  3. inode Bitmap中对应的bit位由1置成0并不会立即从磁盘中删除对应的inode和数据块,只是表示这个inode现在是可用的。实际上,文件系统通常会保留已删除文件的inode和数据块,以便在将来需要时能够重新分配给新创建的文件使用。这也是为了避免频繁地在磁盘上进行分配和释放操作,从而提高性能和减少磁盘碎片化。(在计算机领域中,删除并不是真的都删了,而是覆盖)

因此,我们就可以理解:为什么拷贝文件的时候很慢,而删除文件的时候很快

因为拷贝文件需要先创建文件,然后再对该文件进行写入操作,该过程需要先在inode Bitmap中将对应的bit位置成1,然后根据其标记位为新文件分配一个空闲的inode编号并填入文件的属性信息,之后还要申请数据块,最后才能进行文件内容的拷贝,而删除文件仅需将对应的inode Bitmap置为0即可。

就像建一座高楼大厦,想要完工的时间是非常长,而要拆掉一座楼,仅仅在墙上写上字即可。

2.6 在磁盘上查找一个文件,操作系统做了什么

  1. 操作系统会拿着指定的文件名到指定目录下的数据块中查找inode编号。

  2. 一旦拿到inode编号后,系统就可以通过该编号找到对应的inode,其中包含了文件的各种属性

  3. 系统会检查inode中的权限属性,确保用户是有权限来执行对应操作的

2.7 在磁盘上修改一个文件,操作系统做了什么

  1. 查找指定文件: 首先,操作系统会通过文件路径找到指定文件的inode编号,获取文件的属性信息,包括文件的权限设置、所有者信息等。

  2. 权限验证: 在进行文件修改操作之前,系统会检查当前用户的权限是否足够以及是否具有对文件的写入权限。如果用户具有足够的权限,系统将允许用户对文件进行修改;否则,修改操作将被拒绝。

  3. 分配数据块: 当需要对文件进行修改时,系统会为该文件分配足够的数据块来存储修改后的内容。如果文件已经存在且需要扩展,系统会分配额外的数据块来容纳新的内容。

  4. 更新inode 在将内容写入到数据块后,系统会更新文件的属性信息,如文件的大小、修改时间等。这样可以确保文件的属性信息与实际内容保持一致。

三、软硬链接

3.1 软链接

软链接是一种特殊的文件类型。我们可以使用以下命令来创建软连接

ln -s  [source_file] [link_name]
# ln - 建立链接
# -s - 建立软链接
# 创建名为link_name的硬链接,指向名为source_file的原始文件。

请添加图片描述

从上我们可以看出,原文件file和软连接file_sortinode编号是不一样的(各自具有独立的inode编号),说明软连接是一个独立的文件

如何理解软连接?

软连接是独立的文件,有独立的inode和独立的数据块,而软连接的数据块里面保存的是原文件路径,因此软链接类似于Windows系统中的快捷方式。它们不包含实际的数据,而只是指向原始文件或目录的路径。因此,如果删除快捷方式,即软连接,不会有任何影响;但如果软链接指向的文件或目录被删除了,软链接就会成为死链接。

3.2 硬链接

硬链接同样也是一种特殊的文件类型。我们可以使用以下命令来创建硬连接

ln <source_file> <link_name>
# 创建名为link_name的硬链接,指向名为source_file的原始文件。

请添加图片描述

当我们查看文件的属性时,发现硬链接和原文件第二列的数字都变成2了,这个数字其实是硬链接数;并且它们inode编号还是一模一样的(不具有独立的inode编号),因此硬链接不是独立的文件。

如何理解硬链接?

源文件和硬链接的inode一模一样,即文件属性是一模一样的,而在inode的结构中,存在一个指针指向对应的文件数据块,那么就注定了数据块也是一模一样,即文件的内容也是一模一样!我们可以来验证验证

向原文件写入内容

请添加图片描述

向硬链接文件写入内容

请添加图片描述

那现在假设我要将原文件删除,即将inode编号删除,那么对应的相同硬链接的inode编号是否也会被删除呢?

请添加图片描述

答案是不会的!只是将硬链接数由2变成了1

这是因为 inode结构中维护了一个称为链接计数link_count的字段。链接计数表示了指向该inode的硬链接的数量。每当创建一个新的硬链接时,相应文件的链接计数就会增加。当删除一个硬链接时,链接计数就会减少。只有当链接计数减到0时,文件的数据块才会被释放。

因此所谓的硬链接就相当于将一个文件进行重命名而已。

请添加图片描述

3.3 为什么要有软硬链接(实际用途)

  • 软连接

创建快捷方式。软链接可以让你在不同的位置引用同一个文件或目录,方便快速访问。(最常见)

比如我创建了一个cpp文件,并将其生成可执行文件myexe。内容如下:

请添加图片描述

那么我们可以为myexe创建一个快捷方式到/home/wj下(相当于Windows桌面),方便快速访问。

请添加图片描述

请添加图片描述

  • 硬链接

当创建一个普通文件时,操作系统会在文件系统中为该文件分配一个inodeinode中包含链接计数link count的字段,因此这个链接计数会初始化为1,因为此时文件只有一个文件名(inode编号)指向struct inode

但是当我们创建一个目录的时候,硬链接数却是2,这是为什么?

请添加图片描述

别忘了,一个目录就算是空目录,其还有两个隐藏目录,分别是...。一个.表示当前路径,表示的也就是dir目录,两个..表示上级目录,也就是当前目录dir的上一个目录。

请添加图片描述

此时我们将dir目录文件的inode编号和.inode编号打印出来,发现两者的inode编号是一模一样的。

请添加图片描述

所以可以得出结论:Linux系统中,每个目录下都包含一个名为.的隐藏文件,它表示当前目录本身。这个.文件实际上就是指向当前目录的硬链接,它和当前目录共享同一个inode编号。因此,.文件导致了目录的硬链接数为2。(两个..同理)

因此,现在我们就可以解释为什么我们cd ..可以返回到上级目录了,原因就是:..和上级目录的inode编号是相同的,本质就是建立了硬链接关系,又因为它们的inode编号相等,使得共享数据块。因此cd ..等价于cd 当前路径的上级路径名

需要注意的是:目录文件时不允许我们私自建立硬链接的,我们只允许对普通文件建立硬链接,而上述的隐藏文件可以是因为系统本身规定的,而用户不允许私自对目录建立硬链接原因如下:

请添加图片描述

比方说创建硬链接目录dir指向的是根目录/,假设执行find / -name test.c,当递归搜索到硬链接目录dir时,由于dir和/的inode编号一样,由于与根目录/共享相同的inode,操作系统会认为它们是同一个目录,然后继续搜索/目录下的子目录和文件,就会发生无限递归问题。

那有的人就有疑问,...同样也会发生无限递归问题啊。可是很不好意思,系统默认在做搜索时,不会对...这两个隐藏目录做搜索 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/339033.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 | springboot+vue会议室管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 随着企业规模的不断扩大&#xff0c;会议室管理愈加复杂。传统的手工预约会议室的方式已经无法满足现代企业的需求&#xff0c;因此&#xff0c;开发一套会议室系统方案变得尤为重要。会议室系统可以实现会议室的在线预约、会议室资源的有效利…

每周统计-20240531

用于测试程序的稳定性&#xff1a; 龙虎榜&#xff1a; 成交额&#xff1a; 封成比&#xff1a; 收盘前放量&#xff1a; 开盘抢筹&#xff1a; 封单额&#xff1a;

Linux下的配置工具menuconfig+配置文件(Kconfig/.config/defconfig)

我们都知道,嵌入式开发中,或者说C语言中,配置基本都是通过宏定义来决定的,在MCU开发中,代码量比较小,配置项也比较少,我们直接修改对应的宏定义即可。 但是,Linux开发中,操作系统、驱动部分还有应用部分加起来,代码量极大,配置项目也非常多,这时候,就需要对这些配…

SSMP整合案例第五步 在前端页面上拿到service层调数据库里的数据后列表

在前端页面上列表 我们首先看看前端页面 我们已经把数据传入前端控制台 再看看我们的代码是怎么写的 我们展示 数据来自图dataList 在这里 我们要把数据填进去 就能展示在前端页面上 用的是前端数据双向绑定 axios发送异步请求 函数 //钩子函数&#xff0c;VUE对象初始化…

DiffBIR论文阅读笔记

这篇是董超老师通讯作者的一篇盲图像修复的论文&#xff0c;目前好像没看到发表在哪个会议期刊&#xff0c;应该是还在投&#xff0c;这个是arxiv版本&#xff0c;代码倒是开源了。本文所指的BIR并不是一个single模型对任何未知图像degradation都能处理&#xff0c;而是用同一个…

SpringBootWeb 篇-深入了解 Spring 异常处理、事务管理和配置文件参数配置化、yml 配置文件

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 配置文件 1.1 yml 配置文件 1.2 参数配置化 1.2.1 使用 Value 注解注入单个配置参数 1.2.2 使用 ConfigurationProperties 注解将一组相关配置参数注入到一个类中…

算法(十三)回溯算法---N皇后问题

文章目录 算法概念经典例子 - N皇后问题什么是N皇后问题&#xff1f;实现思路 算法概念 回溯算法是类似枚举的深度优先搜索尝试过程&#xff0c;主要是再搜索尝试中寻找问题的解&#xff0c;当发生不满足求解条件时&#xff0c;就会”回溯“返回&#xff08;也就是递归返回&am…

【数据结构与算法 | 队列篇】力扣102, 107

1. 力扣102 : 二叉树的层序遍历 (1). 题 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3]…

树莓集团:构筑全国数字影像生态链

在数字化浪潮席卷全球的今天&#xff0c;数字影像技术正以前所未有的速度改变着我们的生活。成都树莓集团以远见卓识和坚定步伐&#xff0c;专注于全国数字影像生态链的建设&#xff0c;不断推动着文创产业的创新与发展。 树莓集团致力于打造一个完整的数字影像生态链&#xff…

FreeRTOS基础(三):动态创建任务

上一篇博客&#xff0c;我们讲解了FreeRTOS中&#xff0c;我们讲解了创建任务和删除任务的API函数&#xff0c;那么这一讲&#xff0c;我们从实战出发&#xff0c;规范我们在FreeRTOS下的编码风格&#xff0c;掌握动态创建任务的编码风格&#xff0c;达到实战应用&#xff01; …

解决kettle界面右上角的connect消失——且使用admin登录不上Kettle资源库

一、问题描述 1.1、Kettle界面右上角的connect消失了 当我们配置Kettle界面的资源库(Other Repositories)内容后,Kettle界面右上角的connect消失了;如下图所示: 1.2、使用默认的账户【admin】和密码【admin】登录不上kettle资源库 当我们切换到我们配置的数据库使用超管账…

AGM DAP-LINK 离线烧录报错信息分析

DAP-LINK 支持离线烧录。 即&#xff1a;先把要烧录的bin 烧录到DAP-LINK 中&#xff1b;然后DAP-LINK 可以脱离PC&#xff0c;上电后通过按键对目标板进行烧录。 CMSIS-DAP模式 跳线JGND断开&#xff0c;状态LED D4快闪&#xff0c;D3常亮&#xff08;串口状态&#xff09;。…

Android关闭硬件加速对PorterDuffXfermode的影响

Android关闭硬件加速对PorterDuffXfermode的影响 跑的版本minSdk33 编译SDK34 import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Port…

LabVIEW与欧陆温控表通讯的实现与应用:厂商软件与自主开发的优缺点

本文探讨了LabVIEW与欧陆温控表通讯的具体实现方法&#xff0c;并对比了使用厂商提供的软件与自行开发LabVIEW程序的优缺点。通过综合分析&#xff0c;帮助用户在实际应用中选择最适合的方案&#xff0c;实现高效、灵活的温控系统。 LabVIEW与欧陆温控表通讯的实现与应用&#…

【Linux】网络高级IO

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Linux 目录 &#x1f449;&#x1f3fb;五种IO模型&#x1f449;&#x1f3fb;消息通信的同步异步与进程线程的同步异步有什么不同&#xff1f;&#x1f449…

YOLOv8改进(一)-- 轻量化模型ShuffleNetV2

文章目录 1、前言2、ShuffleNetV2代码实现2.1、创建ShuffleNet类2.2、修改tasks.py2.3、创建shufflenetv2.yaml文件2.4、跑通示例 3、碰到的问题4、目标检测系列文章 1、前言 移动端设备也需要既准确又快的小模型。为了满足这些需求&#xff0c;一些轻量级的CNN网络如MobileNe…

【2024新版】银系统源码/超市收银系统/智慧新零售/ERP进销存管理/线上商城/商户助手

>>>系统简述&#xff1a;本系统适用于超吃便利店&#xff0c;美妆母婴行业&#xff0c;服装鞋帽行业&#xff0c;食品零售行业&#xff0c;3C数码电子行业&#xff0c;食品生鲜等一切零售行业&#xff0c;产品功能角色介绍如下 合伙人&#xff1a;无限发展代理商和商…

OpenMV学习笔记3——画图函数汇总

画图&#xff0c;即在摄像头对应位置画出图形&#xff0c;对于需要反馈信息的程序来说很直观。就如上一篇文章颜色识别当中的例子一样&#xff0c;我们在识别出的色块上画出矩形方框&#xff0c;并在中间标出十字&#xff0c;可以直观的看到OpenMV现在识别出的色块。 目录 一…

Nginx源码编译安装

Nginx NginxNginx的特点Nginx的使用场景Nginx 有哪些进程 使用源码编译安装Nginx准备工作安装依赖包编译安装Nginx检查、启动、重启、停止 nginx服务配置 Nginx 系统服务方法一&#xff1a;方法二&#xff1a; 访问Nginx页面 升级Nginx准备工作编译安装新版本Nginx验证 Nginx N…

安卓启动 性能提升 20-30% ,基准配置 入门教程

1.先从官方下载demohttps://github.com/android/codelab-android-performance/archive/refs/heads/main.zip 2.先用Android studio打开里面的baseline-profiles项目 3.运行一遍app&#xff0c;这里建议用模拟器&#xff0c;&#xff08;Pixel 6 API 34&#xff09;设备运行&a…