自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(203)
  • 收藏
  • 关注

原创 【鸿蒙南向开发】鸿蒙轻内核A核源码分析系列三 物理内存(1)

鸿蒙轻内核A核的物理内存采用了段页式管理,每个物理内存段被分割为物理内存页。在头文件中定义了物理内存页结构体,以及内存页数组及数组大小。物理内存页结构体LosVmPage可以和物理内存页一一对应,也可以对应多个连续的内存页,此时使用nPages指定内存页的数量。/**< 物理内存页节点,挂在VmFreeList空闲内存页链表上 *//**< 物理内存页内存开始地址*//**< 物理内存页引用计数 *//**< 物理内存页标记 *//**< 物理内存页所在的链表数组的索引,总共有9个链表 */

2025-04-02 17:33:19 904

原创 【鸿蒙南向开发】鸿蒙轻内核A核源码分析系列二 数据结构-位图操作

位操作模块提供对32位无符号整数数值的bit位进行操作,bit位取值为0-31,以0开始计算,从左向右,第0位,第1位。。。第31位等。⑴处定义的宏如下,也就是十进制31。如果传入的比特位pos大于31,会通过逻辑与运算截断,只取低5位,确保不会大于31,避免溢出。⑵处定义的位图掩码全是1。在文件中定义了常用的位操作相关的宏。宏根据参数x计算出需要操作第几个状态字,由于计算状态字的使用的是UINTPTR,状态字可以是32位、也可以是64位。后文,我们默认以32位进行讲解。宏传入的参数是位操作的开始bit。

2025-04-02 15:39:44 901

原创 【鸿蒙南向开发】鸿蒙轻内核A核源码分析系列一 数据结构-双向循环链表

所属的链表,插入后老双向链表的尾结点和新双向链表的头节点相连,老双向链表的头节点与新双向链表的尾节点相连。使用该方法插入的新的双向链表的尾部靠近老双向链表的头部,即从头部开始遍历时会首先遍历到新链表的尾部节点。所属的双向链表,插入后老双向链表的头结点和新双向链表的尾节点相连,老双向链表的尾节点与新双向链表的头节点相连。使用该方法插入的新的双向链表靠近双向链表的头部,即从头部开始遍历时会首先遍历到新链表的头部节点。更安全,如果是空的双向链表,调用后者,返回的内存地址不是业务结构体的地址,会发生踩内存错误。

2025-04-02 13:39:14 890

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列二十 Newlib C

以open函数的钩子函数_open为例来介绍newlib的钩子函数的调用过程。open()函数实现在newlib-cygwin\newlib\libc\syscalls\sysopen.c中,该函数会进一步调用函数_open_r,这是个可重入函数Reentrant Function,支持在多线程中运行。int ret;return ret;

2025-04-01 22:28:51 779

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十九 Musl LibC

支持的参数定义在third_party\musl\porting\liteos_m\kernel\include\sys\mount.h,如MNT_FORCE、MNT_DETACH、MNT_EXPIRE和UMOUNT_NOFOLLOW。参数path指定文件或设备的路径,参数oflag需要使用下面的访问模式O_RDONLY, O_WRONLY, O_RDWR中的一个,这几个定义在文件third_party\musl\porting\liteos_m\kernel\include\fcntl.h。

2025-04-01 20:32:01 954

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十八 Fault异常处理

本章节将从原理角度分析,通过ArkUI框架的执行流程,以及自定义组件的生命周期两个角度,来分析组件过度嵌套对性能的影响。如上图所示,自定义组件创建完成之后,在build函数执行之前,将先执行aboutToAppear()生命周期回调函数。执行完build函数后,还会有一些事件监听函数,例如可以使用onPageShow监听页面显示事件,onPageHide函数可以监听页面隐藏事件。最终在自定义组件析构销毁前执行aboutToDisappear函数。

2025-04-01 17:00:30 840

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十八 Fault异常处理

⑶记录异常类型,⑷处如果记录了有效的故障地址,则获取故障地址。⑸处如果当前运行任务存在时,若标记了异常发生在中断,则记录中断号,并记录异常发生在中断内,否则记录任务编号,并记录异常发生在任务内。如下图中的Fault类型表格所示,Fault表示各种故障,Handler表示故障处理机制,Bit Name标记故障的寄存器的Bit位,Fault status register故障状态寄存器。⑴处读取活跃位寄存器的数值,然后执行⑵比较寄存器数值与0的大小,如果相等,说明该活跃位寄存器对应的中断均不活跃,然后跳转到。

2025-04-01 15:24:10 784

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十七(3) 异常信息ExcInfo

在文件定义了异常信息的相关宏定义、枚举和结构体。如下所示的宏定义为各种异常信息的大小,可以参考下面的异常信息存储区域分布图进行直观的理解,前4字节保存异常信息存储区域的大小,然后分别是异常上下文、任务、队列,中断寄存器,任务切换,内存分配情况的数据信息,最后4字节保存的是异常类型的最大值。异常上下文存储区域的详细分布如下图所示,保存异常信息类型和信息大小,然后分别存储ExcInfo和上下文信息。其他异常信息类似,不再提供。

2025-04-01 13:29:20 626

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十七(2) 异常钩子函数的注册操作

如果⑷成立,说明遍历到的节点不是第一个,把之前的节点执行当前要解除注册的节点的下一个节点,这样把要解除注册的节点从链表中进行删除。否则说明遍历到的节点为第一个,则执行⑸,把遍历到的下一个节点作为第一个节点,这样把要解除注册的节点从链表中进行删除。⑶处设置节点的钩子函数成员变量为传入的钩子函数,然后设置其下一个节点为该异常类型对应的钩子函数链表的第一个节点,然后把最后注册的钩子函数节点设置为第一个节点。因此,可以看得出,注册早的钩子函数在链表的尾部最先执行,注册晚的函数在链表的头部,最后执行。

2025-03-31 22:23:51 712

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十七(1) 异常钩子函数类型介绍

和上述几个异常类型的钩子函数不一样,中断异常钩子函数不需要用户来注册,内核已经注册了中断异常钩子函数。我们看下具体如何异常钩子函数的,关于全局异常钩子函数底层的细节后文会详细分析。该函数在发生中断异常时汇编代码中调用执行,用于处于系统异常,该函数宏定义在不同芯片架构实现的文件。注册的也是全局的异常钩子函数,它实质上对应的其实是个异常钩子函数数组。本节我们先看下如何调用和注册异常钩子函数,异常钩子函数的注册和调用的函数API定义在。用于标记中断异常时的钩子函数,发生中断异常时调用注册的中断异常钩子函数。

2025-03-31 20:29:42 735

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十六 MPU内存保护单元

在文件定义MPU相关的结构体。⑴处定义MPU内存区域的访问权限,有关访问权限见下图,或者可以访问官网https://developer.arm.com/documentation/dui0552/a/cortex-m3-peripherals/optional-memory-protection-unit/mpu-access-permission-attributes,特别是上述页面的表格Table 4.47. AP encoding了解更多。

2025-03-31 17:37:07 708

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十五 CPU使用率CPUP

在文件定义的CPUP控制块结构体为OsCpupCB,结构体源代码如下,allTime记录该任务自系统启动以来运行的cycle数,startTime记录任务开始运行的时间,历史运行时间数组的10个元素记录最近10秒中每一秒中每个任务自系统启动以来运行的cycle数,其他结构体成员的解释见注释部分。/**< 任务编号 *//**< 任务状态 *//**< 总共运行的时间 *//**< 任务开始时间 *//**< 历史运行时间数组,其中OS_CPUP_HISTORY_RECORD_NUM为10 */

2025-03-31 15:56:39 833

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十四 软件定时器Swtmr

在文件定义的定时器控制块结构体为,结构体源代码如下。定时器状态.ucState取值或,定时器模式.mode取值或。其他结构体成员的解释见注释部分。/* 指向下一个定时器结构体的指针 *//* 定时器状态,取值枚举SwtmrState *//* 定时器模式,取值枚举enSwTmrType *//* 唤醒开关 *//* 对齐开关 */#endif/* 定时器编号Id *//* 定时器运行的次数 *//* 周期定时器超时间隔 (单位: tick) *//* 定时器超时回调函数参数 */

2025-03-31 13:40:38 773

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十三 消息队列Queue

在文件中定义队列控制块结构体为LosQueueCB,结构体源代码如下。队列状态取值,其他结构体成员见注释部分。/**< 队列内存空间的指针 *//**< 队列的使用状态 *//**< 队列长度,即消息数量 *//**< 消息节点大小 *//**< 队列编号 *//**< 消息头节点位置 *//**< 消息尾节点位置 *//**< 2维数组,可读、可写的消息数量, 0:可读, 1:可写 *//**< 2维双向链表数组,阻塞读、写任务的双向链表, 0:读链表, 1:写链表 */

2025-03-30 21:52:15 532

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十二 事件Event

在文件定义的事件控制块结构体为EVENT_CB_S,结构体源代码如下,结构体成员的解释见注释部分。/**< 事件ID,每一位标识一种事件类型 *//**< 读取事件的任务链表 */在读事件时,可以选择读取模式。读取模式由如下几个宏定义:所有事件():逻辑与,基于接口传入的事件类型掩码eventMask,只有这些事件都已经发生才能读取成功,否则该任务将阻塞等待或者返回错误码。任一事件():逻辑或,基于接口传入的事件类型掩码eventMask。

2025-03-30 20:22:04 531

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十一 (2)信号量Semaphore

在文件定义的信号量控制块结构体为LosSemCB,结构体源代码如下。信号量状态.semStat取值,其他成员变量的注释见注释部分。/**< 信号量状态 *//**< 可用的信号量数量 *//**< 可用的信号量最大数量 *//**< 信号量Id *//**< 阻塞在该信号量的任务链表 */} LosSemCB;系统支持创建多少信号量是根据开发板情况使用宏定义的,每一个信号量semId是UINT32类型的,取值为,表示信号量池中各个的信号量的编号。

2025-03-30 19:13:31 682

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十一(1) 信号量Semaphore

在文件定义的信号量控制块结构体为LosSemCB,结构体源代码如下。信号量状态.semStat取值,其他成员变量的注释见注释部分。/**< 信号量状态 *//**< 可用的信号量数量 *//**< 可用的信号量最大数量 *//**< 信号量Id *//**< 阻塞在该信号量的任务链表 */} LosSemCB;系统支持创建多少信号量是根据开发板情况使用宏定义的,每一个信号量semId是UINT32类型的,取值为,表示信号量池中各个的信号量的编号。

2025-03-28 21:55:51 714

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列十 软件定时器Swtmr

在文件定义的定时器控制块结构体为,结构体源代码如下。定时器状态.ucState取值或,定时器模式.mode取值或。其他结构体成员的解释见注释部分。/* 指向下一个定时器结构体的指针 *//* 定时器状态,取值枚举SwtmrState *//* 定时器模式,取值枚举enSwTmrType *//* 唤醒开关 *//* 对齐开关 */#endif/* 定时器编号Id *//* 定时器运行的次数 *//* 周期定时器超时间隔 (单位: tick) *//* 定时器超时回调函数参数 */

2025-03-28 20:47:29 927

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列九 互斥锁Mutex

在文件定义的互斥锁控制块结构体LosMuxCB,源代码如下,结构体成员的解释见注释部分。/**< 互斥锁状态:OS_MUX_UNUSED, OS_MUX_USED *//**< 锁被持有的次数 *//**< 互斥锁Id *//**< 互斥锁双向链表 *//**< 当前持有锁的任务 *//**< 当前持有锁的任务的优先级,为避免优先级翻转,可能会更改任务的优先级,此时有备份的作用 */} LosMuxCB;系统支持创建多少互斥锁是根据开发板情况使用宏定义的,互斥锁muxId是UINT32类型的,

2025-03-28 17:32:11 792

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列八 静态内存MemoryBox

静态内存结构体在文件中定义。源代码如下,⑴处定义的是静态内存节点结构体,⑵处定义的静态内存的结构体池信息结构体为,,结构体成员的解释见注释部分。/**< 静态内存池中空闲节点指针,指向下一个空闲节点 *//**< 静态内存池中空闲节点指针,指向下一个空闲节点 *//**< 静态内存池的内存块总数量 *//**< 静态内存池的已分配的内存块总数量 *//**< 指向下一个静态内存池 */#endif/**< 静态内存池的空闲内存块单向链表 */

2025-03-28 15:13:54 697

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列七 动态内存Dynamic Memory

动态内存的结构体有动态内存池信息结构体,动态内存池头结构体、动态内存节点头结构体,已使用内存节点结构体,空闲内存节点结构体。这些结构体定义在文件中,下文会结合上文的动态内存管理结构示意图对各个结构体的成员变量进行说明。

2025-03-28 13:49:06 1001

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列六 任务及任务调度(3)任务调度模块

⑷处获取就绪队列中优先级最高的任务,⑸处如果当前运行任务和就绪队列汇总优先级最高的任务不是同一个任务,把当前任务状态设置为非运行状态,新任务设置为运行状态,并设置新任务的开始时间为当前任务的开始时间,然后执行⑹标记是否需要任务切换。⑺处把新任务从就绪队列中出队,⑻处计算新任务的运行结束时间,然后执行⑼设置任务到期时间。我们看下该函数的源码,⑴处调用函数获取就绪队列中优先级最高的任务,⑵把该任务状态设置为运行状态,接着把当前运行任务和新任务都设置为就绪队列中优先级最高的那个任务。寄存器表示新任务的栈指针。

2025-03-27 22:13:25 690

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列六 任务及任务调度(2)任务模块

在文件定义的任务控制块结构体LosTaskCB,源代码如下,结构体成员的解释见注释部分。/* 任务栈指针 *//* 任务状态 *//* 任务优先级 *//* 剩余的时间片 *//* 任务超时排序链表节点 *//* 任务栈大小 *//* 栈顶指针 *//* 任务编号Id *//* 任务入口函数 *//* 任务持有的信号量 *//* 导致任务阻塞的互斥锁 */UINT32 arg;/* 任务入口函数的参数 *//* 任务名称 *//* 就绪队列等链表节点 */

2025-03-27 20:30:24 930

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列六 任务及任务调度(1)任务栈

在文件中,定义的上下文的结构体如下,主要是浮点寄存器,通用寄存器。UINT32 S16;UINT32 S17;UINT32 S18;UINT32 S19;UINT32 S20;UINT32 S21;UINT32 S22;UINT32 S23;UINT32 S24;UINT32 S25;UINT32 S26;UINT32 S27;UINT32 S28;UINT32 S29;UINT32 S30;UINT32 S31;#endif。

2025-03-27 17:29:57 888

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列五 时间管理

时间管理模块为任务调度提供必要的时钟节拍,会向应用程序提供所有和时间有关的服务,如时间转换、统计、延迟功能。后续也会陆续推出更多的分享文章,敬请期待,也欢迎大家分享学习、使用鸿蒙轻内核的心得,有任何问题、建议,都可以留言给我们: https://gitee.com/openharmony/kernel_liteos_m/issues。看下具体的代码,⑴处校验参数是否为空指针,⑵处检查系统时钟是否配置。下面,我们剖析下时间管理模块的源代码,若涉及开发板部分,以开发板工程。时,会使用系统定义的中断。

2025-03-27 15:14:24 682

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列四 中断Hwi

中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。当外设需要CPU时,将通过产生中断信号使CPU立即中断当前任务来响应中断请求。在剖析中断源代码之前,下面介绍些中断相关的硬件、中断相关的概念。与中断相关的硬件可以划分为三类:设备、中断控制器、CPU本身。设备发起中断的源,当设备需要请求CPU时,产生一个中断信号,该信号连接至中断控制器。中断控制器中断控制器是CPU众多外设中的一个,它一方面接收其它外设中断引脚的输入。另一方面,它会发出中断信号给CPU。

2025-03-27 13:36:22 990

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列三 数据结构-任务排序链表

在头文件中定义了排序链表属性的结构体。该结构体定义了排序链表的头节点,游标,还有一个保留字段,暂时没有使用。在文件中定义了排序链表属性结构体类型的全局变量,该全局变量的成员变量sortLink作为排序链表的头结点,指向一个长度为32的环状的双向链表数组,成员变量cursor作为游标记录环状数组的当前游标位置。源代码如下。我们使用示意图来讲述一下。任务排序链表是环状双向链表数组,长度为32,每一个元素是一个双向链表,挂载任务LosTaskCB的链表节点timerList。任务LosTaskCB。

2025-03-26 21:56:14 579

原创 【鸿蒙南向开发】鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS

会分2部分来介绍结构体部分,先介绍LittleFS文件系统的结构体,然后介绍LiteOS-M内核中提供的和LittleFS相关的一些结构体。

2025-03-26 20:27:29 803

原创 【鸿蒙南向开发】OpenHarmony轻内核M核源码分析系列二 数据结构-任务就绪队列

在文件中定义了和任务就绪队列相关的主要变量。其中⑴表示任务就绪队列,是一个双向链表数组,后文初始化该数组时会将数组长度设置为⑷处定义的;⑵表示优先级位图,标识了任务就绪队列中已挂载的就绪任务所在的优先级;⑶表示优先级为0的比特位;⑷表示任务就绪队列支持的优先级个数32,所以鸿蒙轻内核优先级的取值范围为0-31,数值越小优先级越大。优先级位图的bit位和优先级的关系为,优先级数组包含了个数组元素,每个数组元素都是一个双向链表,同一优先级的处于就绪状态的所有任务都会挂载到对应优先级的双向链表中。

2025-03-26 17:09:16 642

原创 【鸿蒙南向开发】OpenHarmony轻内核M核源码分析系列一 数据结构-双向循环链表

第二个入参是要遍历的双向链表的起始节点,第三个入参是要获取的结构体类型名称,第四个入参是该结构体中的双向链表成员变量的名称。在链表的应用场景上,业务结构体包含双向链表作为成员,当知道双向链表成员变量的内存地址和相对于业务结构体的偏移时,就可以进一步获取业务结构体的内存地址,具体见下面。遍历双向链表,将每次循环获取的链表节点保存在第一个入参中,第二个入参是要遍历的双向链表的起始节点。如果双向链表的前驱/后继节点均为自身,只有一个链节点,没有挂载业务结构体的链表节点,称该链表为空链表。从所在的双向链表中删除。

2025-03-26 15:27:38 603

原创 OpenHarmony实战—— 手撕 NAPI框架

NAPI是JavaScript与C++交互的桥梁。在OpenHarmony中,Javascript代码在运行时由ArkUI的JS引擎解释执行,C++代码则通过NAPI接口访问JS引擎中的Javascript上下文,从而实现与JS变量、方法之间的相互调用。

2025-03-26 13:40:20 512

原创 OpenHarmony实战—— 三方库创建

然后利用依赖检测分析发现项目、软件依赖关系,帮助企业发现使用的开源包(开源库)的依赖项,以及当前存在的已知安全漏洞,提高三方库的透明度和安全性。完整性检查将基于创建三方库的具体要求进行三方库目录、内容审核,如果您提交的三方库缺少必要性文件,三方库将被退回,请您根据提示完善三方库内容后再次提交上架审核;指定的私钥存储目录必须存在。人工复审会对提交的三方库进行功能性测试,如果三方库没有真正的功能实现或其功能无法在OpenHarmony上验证,将被视为无效三方库,三方库将被退回,并提示审核不通过的原因。

2025-03-25 22:10:28 720

原创 OpenHarmony实战—— 基于OpenAtom OpenHarmony ArkUI深度定制的组件框架(Easyui)

Easyui是一套基于ArkTS语言开发的轻量、可靠的移动端组件库,它是对OpenAtom OpenHarmony(以下简称“OpenHarmony”) ArkUI进行深度定制的组件框架。Easyui可扩展性较强,可以基于源码进行二次开发,修改原有组件以及新增部分组件,以满足具体项目的开发需求。该框架适用大部分OpenHarmony应用的开发 ,能够更加完善OpenHarmony 的应用开发能力,使我们的应用开发更简单。通过本篇文章介绍,您对easyui组件框架应该有了初步的了解。

2025-03-25 20:34:32 808

原创 OpenHarmony实战——状态变量更改通知:@Watch 装饰器

Watch 用于监听状态变量的变化,当状态变量变化时,@Watch 的回调方法将被调用。@Watch 在 ArkUI 框架内部判断数值有无更新使用的是严格相等(===),遵循严格相等规范。当在严格相等为 false 的情况下,就会触发 @Watch 的回调。以下示例展示组件更新和 @Watch 的处理步骤。count 在 CountModifier 中由 @State 装饰,在 TotalView 中由 @Prop 装饰。

2025-03-25 16:22:54 951

原创 OpenHarmony实战——设备环境查询:Environment

Environment的所有属性都是不可变的(即应用不可写入),所有的属性都是简单类型。@StorageProp关联的环境参数可以在本地更改,但不能同步回AppStorage中,因为应用对环境变量参数是不可写的,只能在Environment中查询。开发者如果需要应用程序运行的设备的环境参数,以此来作出不同的场景判断,比如多语言,暗黑模式等,需要用到Environment设备环境查询。设备环境到Component的更新链:Environment --> AppStorage -->Component。

2025-03-25 15:27:04 299

原创 OpenHarmony实战——持久化存储UI状态:PersistentStorage

PersistentStorage将选定的AppStorage属性保留在设备磁盘上。应用程序通过API,以决定哪些AppStorage属性应借助PersistentStorage持久化。UI和业务逻辑不直接访问PersistentStorage中的属性,所有属性访问都是对AppStorage的访问,AppStorage中的更改会自动同步到PersistentStorage。PersistentStorage和AppStorage中的属性建立双向同步。

2025-03-25 13:51:56 894

原创 OpenHarmony实战——应用全局的UI状态存储:AppStorage

AppStorage是在应用启动的时候会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这些状态数据在应用级别都是可访问的。AppStorage将在应用运行过程保留其属性。属性通过唯一的键字符串值访问。AppStorage可以和UI组件同步,且可以在应用业务逻辑中被访问。AppStorage中的属性可以被双向同步,数据可以是存在于本地或远程设备上,并具有不同的功能,比如数据持久化(详见 PersistentStorage )。

2025-03-24 21:51:35 772

原创 OpenHarmony实战——页面级UI状态存储:LocalStorage

LocalStorage是ArkTS为构建页面级别状态变量提供存储的内存内“数据库”。● 应用程序可以创建多个LocalStorage实例,LocalStorage实例可以在页面内共享,也可以通过GetShared接口,获取在UIAbility里创建的GetShared,实现跨页面、UIAbility内共享。● 组件树的根节点,即被@Entry装饰的@Component,可以被分配一个LocalStorage实例,此组件的所有子组件实例将自动获得对该LocalStorage实例的访问权限。

2025-03-24 20:24:10 622

原创 OpenHarmony实战——@Observed装饰器和@ObjectLink装饰器

ObjectLink和@Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步:● 被@Observed装饰的类,可以被观察到属性的变化;● 子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中的属性,这个属性同样也需要被@Observed装饰。

2025-03-24 17:40:36 664

原创 OpenHarmony实战——@Provide装饰器和@Consume装饰器

Provide/@Consume装饰的状态变量有以下特性:● @Provide装饰的状态变量自动对其所有后代组件可用,即该变量被“provide”给他的后代组件。由此可见,@Provide的方便之处在于,开发者不需要多次在组件之间传递变量。● 后代通过使用@Consume去获取@Provide提供的变量,建立在@Provide和@Consume之间的双向数据同步,与@State/@Link不同的是,前者可以在多层级的父子组件之间传递。

2025-03-24 15:18:11 733

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除