frameworks 之 AMS与ActivityThread交互

frameworks 之 AMS与ActivityThread交互

  • 1. 类关系
  • 2. 流程
    • 2.1 AMS流程
    • 2.1 ActivityThread流程
  • 3. 堆栈

讲解AMS 如何和 ActivityThread 生命周期调用流程
涉及到的类如下

  • frameworks/base/core/java/android/app/servertransaction/ResumeActivityItem.java
  • frameworks/base/core/java/android/app/Activity.java
  • frameworks/base/core/java/android/app/ActivityThread.java
  • frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
  • frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java
  • frameworks/base/core/java/android/app/ClientTransactionHandler.java

1. 类关系

  1. TransactionItem** 以及其子类都为 具体执行的对象
  2. ClientTransaction 作为 AMS 和 ActivityThread 交互的对象,里面包含 ActivityLifecycleItemmLifecycleStateRequest 和 List<ClientTransactionItem> mActivityCallbacks 成员变量。
  3. ActivityThread 继承自 ClientTransactionHandler,里面包含了内部类 ApplicationThread 该类实现了 IApplicationThread.AIDL 方法。当服务端调用该AIDL方法执行app逻辑, 该内容类又会调用 ActivityThread 下的方法,部分方法实现 在 ClientTransactionHandler 中
		@Overridepublic void scheduleTransaction(ClientTransaction transaction) throws RemoteException {//在父类 ClientTransactionHandlerActivityThread.this.scheduleTransaction(transaction);}

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

2. 流程

2.1 AMS流程

startActivity 最后会调用到 realStartActivityLocked 方法。

  1. 构建 ClientTransaction 负责传递给 界面端调用,第一个参数为客户端IApplicationThread AIDL传递给变量mClient
  2. 通过 addCallback添加对应的执行对象
  3. // 将 生命周期要执行的状态 lifecycleItem 传递给对应的 mLifecycleStateRequest 属性
  4. 调用 scheduleTransaction 方法,里面会调用 clientTransaction 的schedule 方法,schedule方法又会调用 mClient 的scheduleTransaction,这时候调用到客户端
				// 构建 ClientTransaction 负责传递给 界面端调用,第一个参数为客户端IApplicationThread AIDL传递给变量mClientfinal ClientTransaction clientTransaction = ClientTransaction.obtain(proc.getThread(), r.appToken);final boolean isTransitionForward = r.isTransitionForward();// 添加对应执行的LaunchActivityItem对象,用于给客户端执行clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),System.identityHashCode(r), r.info,// TODO: Have this take the merged configuration instead of separate global// and override configs.mergedConfiguration.getGlobalConfiguration(),mergedConfiguration.getOverrideConfiguration(), r.compat,r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor,proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(),results, newIntents, r.takeOptions(), isTransitionForward,proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController,r.createFixedRotationAdjustmentsIfNeeded(), r.shareableActivityToken,r.getLaunchedFromBubble()));// Set desired final state.final ActivityLifecycleItem lifecycleItem;// 设置对应的状态if (andResume) {lifecycleItem = ResumeActivityItem.obtain(isTransitionForward);} else {lifecycleItem = PauseActivityItem.obtain();}// 将 生命周期要执行的状态 lifecycleItem 传递给对应的 mLifecycleStateRequest 属性clientTransaction.setLifecycleStateRequest(lifecycleItem);// Schedule transaction.// 里面会调用 clientTransaction 的schedule 方法,schedule方法又会调用 mClient 的scheduleTransactionmService.getLifecycleManager().scheduleTransaction(clientTransaction);
	void scheduleTransaction(ClientTransaction transaction) throws RemoteException {final IApplicationThread client = transaction.getClient();transaction.schedule();if (!(client instanceof Binder)) {// If client is not an instance of Binder - it's a remote call and at this point it is// safe to recycle the object. All objects used for local calls will be recycled after// the transaction is executed on client in ActivityThread.transaction.recycle();}}public void schedule() throws RemoteException {mClient.scheduleTransaction(this);}

2.1 ActivityThread流程

调用了 scheduleTransaction aidl 方法后,就到了 客户端ApplicationThread 执行的方法, 该方法又会调用 scheduleTransaction,该方法在 ClientTransactionHandler

 private class ApplicationThread extends IApplicationThread.Stub {@Overridepublic void scheduleTransaction(ClientTransaction transaction) throws RemoteException {// 在父类 ClientTransactionHandlerActivityThread.this.scheduleTransaction(transaction);}
}

查看 ClientTransactionHandler 的 scheduleTransaction 方法。

  1. 执行对应的 preExecute并将对应的 ActvityThread传递进去
  2. 发送了对应 handler 消息,该消息的接收在 ActvityThread
void scheduleTransaction(ClientTransaction transaction) {// 执行对应的 preExecute并将对应的 ActvityThread传递进去transaction.preExecute(this);// 发送消息sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);}

收到消息后,执行对应的 TransactionExecutor 的 execute 方法,并和咨询

case EXECUTE_TRANSACTION:// 该回调在其父类触发 scheduleTransaction 发送消息final ClientTransaction transaction = (ClientTransaction) msg.obj;mTransactionExecutor.execute(transaction);if (isSystem()) {// Client transactions inside system process are recycled on the client side// instead of ClientLifecycleManager to avoid being cleared before this// message is handled.transaction.recycle();}// TODO(lifecycler): Recycle locally scheduled transactions.break;

该方法 会通过 executeCallbacks, executeLifecycleState 依次调用 服务端赋值给对应的执行实现类 。

public void execute(ClientTransaction transaction) {...executeCallbacks(transaction);// 调用对应的生命周期回调executeLifecycleState(transaction);mPendingActions.clear();if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction");}

onResume 对应的是 executeLifecycleState 方法,该方法会又会调用 对应 实现类的 **execute 和 postExecute ** 方法。从服务端知道 onResume 实现类为 ResumeActivityItem

private void executeLifecycleState(ClientTransaction transaction) {....// Execute the final transition with proper parameters.lifecycleItem.execute(mTransactionHandler, token, mPendingActions);lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);}

ResumeActivityItem 的 execute 会执行 ActivityThread 的 handleResumeActivity 方法,开始进行对应 activity的 onResume 回调

	@Overridepublic void execute(ClientTransactionHandler client, ActivityClientRecord r,PendingTransactionActions pendingActions) {Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityResume");// 执行 ActivityThread 的 handleResumeActivityclient.handleResumeActivity(r, true /* finalStateRequest */, mIsForward,"RESUME_ACTIVITY");Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);}

handleResumeActivity 方法又会调用对应的 performResumeActivity方法,这样就开始了 onResume回调的触发

@Overridepublic void handleResumeActivity(ActivityClientRecord r, boolean finalStateRequest,boolean isForward, String reason) {// If we are getting ready to gc after going to the background, well// we are back active so skip it.unscheduleGcIdler();mSomeActivitiesChanged = true;// TODO Push resumeArgs into the activity for consideration// skip below steps for double-resume and r.mFinish = true case.if (!performResumeActivity(r, finalStateRequest, reason)) {return;}...}

3. 堆栈

追踪Activity 生命周期调用 如 onResume 可以在 Activity 添加堆栈

01-16 06:26:45.387  1265  1265 E traceResume: traceResume
01-16 06:26:45.387  1265  1265 E traceResume: java.lang.NullPointerException
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.Activity.onResume(Activity.java:1951)
01-16 06:26:45.387  1265  1265 E traceResume: 	at com.android.launcher3.BaseActivity.onResume(BaseActivity.java:182)
01-16 06:26:45.387  1265  1265 E traceResume: 	at com.android.launcher3.BaseDraggingActivity.onResume(BaseDraggingActivity.java:114)
01-16 06:26:45.387  1265  1265 E traceResume: 	at com.android.launcher3.statemanager.StatefulActivity.onResume(StatefulActivity.java:175)
01-16 06:26:45.387  1265  1265 E traceResume: 	at com.android.launcher3.Launcher.onResume(Launcher.java:1133)
01-16 06:26:45.387  1265  1265 E traceResume: 	at com.android.launcher3.BaseQuickstepLauncher.onResume(BaseQuickstepLauncher.java:133)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1488)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.Activity.performResume(Activity.java:8196)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4814)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4857)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2253)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.os.Handler.dispatchMessage(Handler.java:106)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.os.Looper.loopOnce(Looper.java:201)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.os.Looper.loop(Looper.java:288)
01-16 06:26:45.387  1265  1265 E traceResume: 	at android.app.ActivityThread.main(ActivityThread.java:7870)
01-16 06:26:45.387  1265  1265 E traceResume: 	at java.lang.reflect.Method.invoke(Native Method)
01-16 06:26:45.387  1265  1265 E traceResume: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
01-16 06:26:45.387  1265  1265 E traceResume: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

onResume 的时候 执行 IApplicationThread.aidl 的 scheduleTransaction 堆栈

01-16 07:37:38.101   576  1055 E traceReumeService: traceReumeServiceResumeActivityItem{procState=-1,updateProcState=false,isForward=true}
01-16 07:37:38.101   576  1055 E traceReumeService: java.lang.NullPointerException
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.ActivityTaskSupervisor.realStartActivityLocked(ActivityTaskSupervisor.java:878)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.RootWindowContainer.startActivityForAttachedApplicationIfNeeded(RootWindowContainer.java:2013)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.RootWindowContainer.$r8$lambda$auelgeOhCvbItmS_07q5VFEb1ac(Unknown Source:0)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda2.apply(Unknown Source:8)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.internal.util.function.pooled.PooledLambdaImpl.doInvoke(PooledLambdaImpl.java:318)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.internal.util.function.pooled.PooledLambdaImpl.invoke(PooledLambdaImpl.java:204)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.internal.util.function.pooled.OmniFunction.apply(OmniFunction.java:78)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.ActivityRecord.forAllActivities(ActivityRecord.java:4260)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.WindowContainer.forAllActivities(WindowContainer.java:1449)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.WindowContainer.forAllActivities(WindowContainer.java:1442)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.RootWindowContainer.lambda$attachApplication$15$RootWindowContainer(RootWindowContainer.java:1991)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda20.accept(Unknown Source:6)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.Task.forAllRootTasks(Task.java:3197)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1825)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:1818)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.RootWindowContainer.attachApplication(RootWindowContainer.java:1977)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.wm.ActivityTaskManagerService$LocalService.attachApplication(ActivityTaskManagerService.java:6032)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:4591)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:4672)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2404)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2518)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at android.os.Binder.execTransactInternal(Binder.java:1179)
01-16 07:37:38.101   576  1055 E traceReumeService: 	at android.os.Binder.execTransact(Binder.java:1143)

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

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

相关文章

Jmeter 简单使用、生成测试报告(一)

一、下载Jmter 去官网下载&#xff0c;我下载的是apache-jmeter-5.6.3.zip&#xff0c;解压后就能用。 二、安装java环境 JMeter是基于Java开发的&#xff0c;运行JMeter需要Java环境。 1.下载JDK、安装Jdk 2.配置java环境变量 3.验证安装是否成功&#xff08;java -versio…

网络编程 - - TCP套接字通信及编程实现

概述 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。在网络编程中&#xff0c;TCP常用于实现客户端和服务器之间的可靠数据传输。本文将基于C语言实现TCP服务端和客户端建立通信的过程。 三次握手 在…

2023-2024 学年 广东省职业院校技能大赛(高职组)“信息安全管理与评估”赛题一

2023-2024 学年 广东省职业院校技能大赛(高职组“信息安全管理与评估”赛题一&#xff09; 模块一:网络平台搭建与设备安全防护第一阶段任务书任务 1&#xff1a;网络平台搭建任务 2&#xff1a;网络安全设备配置与防护DCRS:DCFW:DCWS:DCBC:WAF: 模块二&#xff1a;网络安全事件…

thinkphp6 + redis实现大数据导出excel超时或内存溢出问题解决方案

redis下载安装&#xff08;window版本&#xff09; 参考地址&#xff1a;https://blog.csdn.net/Ci1693840306/article/details/144214215 php安装redis扩展 参考链接&#xff1a;https://blog.csdn.net/jianchenn/article/details/106144313 解决思路&#xff1a;&#xff0…

PT8M2302 触控 A/D 型 8-Bit MCU

1. 产品概述 PT8M2302 是一款可多次编程&#xff08; MTP &#xff09; A/D 型 8 位 MCU &#xff0c;其包括 2K*16bit MTP ROM 、 256*8bit SRAM、 ADC 、 PWM 、 Touch 等功能&#xff0c;具有高性能精简指令集、低工作电压、低功耗特性且完全集 成触控按键功能。为…

Nvidia Blackwell架构深度剖析:深入了解RTX 50系列GPU的升级

在CES 2025上&#xff0c;英伟达推出了基于Blackwell架构的GeForce RTX 50系列显卡&#xff0c;包括RTX 5090、RTX 5080、RTX 5070 Ti和RTX 5070。一段时间以来&#xff0c;我们已经知晓了该架构的各种细节&#xff0c;其中许多此前还只是传闻。不过&#xff0c;英伟达近日在20…

计算机网络 (45)动态主机配置协议DHCP

前言 计算机网络中的动态主机配置协议&#xff08;DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;主要用于自动分配IP地址和其他网络配置参数给连接到网络的设备。 一、基本概念 定义&#xff1a;DHCP是一种网络协议&#xf…

RV1126+FFMPEG推流项目(7)AI音频模块编码流程

一、AI 模块和外设麦克风的关系 AI 模块是 RV1126 芯片的一个重要组成部分。它的主要功能是将外部接入的麦克风采集到的模拟信号通过内置的驱动程序转换为数字信号。这意味着麦克风作为外设&#xff0c;提供音频输入信号&#xff0c;AI 模块通过其硬件和软件的结合&#xff0c…

第十二章:算法与程序设计

文章目录&#xff1a; 一&#xff1a;基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二&#xff1a;程序设计 基础 1.常数 …

【k8s面试题2025】2、练气初期

在练气初期&#xff0c;灵气还比较稀薄&#xff0c;只能勉强在体内运转几个周天。 文章目录 简述k8s静态pod为 Kubernetes 集群移除新节点&#xff1a;为 K8s 集群添加新节点Kubernetes 中 Pod 的调度流程 简述k8s静态pod 定义 静态Pod是一种特殊类型的Pod&#xff0c;它是由ku…

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…

运输层安全协议SSL

安全套接字层 SSL (Secure Socket Layer) SSL 作用在端系统应用层的 HTTP 和运输层之间&#xff0c;在 TCP 之上建立起一个安全通道&#xff0c;为通过 TCP 传输的应用层数据提供安全保障。 应用层使用 SSL 最多的就是 HTTP&#xff0c;但 SSL 并非仅用于 HTTP&#xff0c;而是…

【Sql递归查询】Mysql、Oracle、SQL Server、PostgreSQL 实现递归查询的区别与案例(详解)

文章目录 Mysql 5.7 递归查询Mysql 8 实现递归查询Oracle递归示例SQL Server 递归查询示例PostgreSQL 递归查询示例 更多相关内容可查看 Mysql 5.7 递归查询 MySQL 5.7 本身不直接支持标准 SQL 中的递归查询语法&#xff08;如 WITH RECURSIVE 这种常见的递归查询方式&#xf…

【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注

13.2.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发&#xff0c;而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中&#xff0c;我们会讨论 Rust 的一…

【JavaScript】比较运算符的运用、定义函数、if(){}...esle{} 语句

比较运算符 !><> < 自定义函数&#xff1a; function 函数名&#xff08;&#xff09;{ } 判断语句&#xff1a; if(判断){ }else if(判断){ 。。。。。。 }else{ } 代码示例&#xff1a; <!DOCTYPE html> <html> <head><meta charset&quo…

WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现)

WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09; 目录 WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现WOA-Transformer鲸鱼算法优化编…

25/1/15 嵌入式笔记 初学STM32F108

GPIO初始化函数 GPIO_Ini&#xff1a;初始化GPIO引脚的模式&#xff0c;速度和引脚号 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引脚0 GPIO输出控制函数 GPIO_SetBits&#xff1a;将指定的GPIO引脚设置为高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将GPIO…

mac m4 安装 node

brew install node // 安装 node //安装的路径在&#xff1a; /opt/homebrew/bin/node brew install node14 // brew install node22 // 安装指定版本 如果需要设置环境变量&#xff1a;通过&#xff1a; which node 查找路径 export PATH"/usr/local/opt/…

haproxy+nginx网站架构,实现负载均衡实验笔记

前提准备&#xff1a; 两台nginx&#xff0c;一台haproxynginx1&#xff1a;192.168.180.120nginx2&#xff1a;192.168.180.130&#xff0c;NFShaproxy&#xff1a;192.168.180.110 nginx&#xff08;两台nginx的操作是一样的&#xff09;&#xff1a; 1. 安装nginx #先安…

【C++篇】红黑树的实现

目录 前言&#xff1a; 一&#xff0c;红黑树的概念 1.1&#xff0c;红黑树的规则 1.2&#xff0c;红黑树的最长路径 1.3&#xff0c;红黑树的效率分析 二&#xff0c;红黑树的实现 2.1&#xff0c;红黑树的结构 2.2&#xff0c;红黑树的插入 2.2.1&#xff0c;大致过程…