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.pswp.cn/web/66218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66218.shtml
英文地址,請注明出處:http://en.pswp.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…

如何使用淘寶URL采集商品詳情數據及銷量

一、通過淘寶開放平臺&#xff08;如果有資質&#xff09; 注冊成為淘寶開發者 訪問淘寶開放平臺官方網站&#xff0c;按照要求填寫開發者信息&#xff0c;包括企業或個人身份驗證等步驟。這一步是為了獲取合法的 API 使用權限。 了解商品詳情 API 淘寶開放平臺提供了一系列…

Unity3D中的Lua、ILRuntime與HybridCLR/huatuo熱更對比分析詳解

前言 在游戲開發中&#xff0c;熱更新技術是一項重要的功能&#xff0c;它允許開發者在不重新發布游戲客戶端的情況下&#xff0c;更新游戲內容。Unity3D作為廣泛使用的游戲引擎&#xff0c;支持多種熱更新方案&#xff0c;包括Lua、ILRuntime和HybridCLR/huatuo。本文將詳細介…

QT加載Ui文件信息方法(python)

在 PyQt 或 PySide 中&#xff0c;加載 Qt Designer 生成的 .ui 文件有兩種常見方法&#xff1a; 使用 pyuic 將 .ui 文件轉換為 Python 代碼。動態加載 .ui 文件。 以下是兩種方法的詳細說明和示例代碼。 方法 1&#xff1a;使用 pyuic 將 .ui 文件轉換為 Python 代碼 步驟…

javascript基礎從小白到高手系列一十二:JSON

本章內容 ? 理解JSON 語法 ? 解析JSON ? JSON 序列化 正如上一章所說&#xff0c;XML 曾經一度成為互聯網上傳輸數據的事實標準。第一代Web 服務很大程度上 是以XML 為基礎的&#xff0c;以服務器間通信為主要特征。可是&#xff0c;XML 也并非沒有批評者。有的人認為XML 過…

網絡編程 - - 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;具有高性能精簡指令集、低工作電壓、低功耗特性且完全集 成觸控按鍵功能。為…

如何使用策略模式并讓spring管理

1、策略模式公共接口類 BankFileStrategy public interface BankFileStrategy {String getBankFile(String bankType) throws Exception; } 2、策略模式業務實現類 Slf4j Component public class ConcreteStrategy implements BankFileStrategy {Overridepublic String ge…

前端開發:盒子模型、塊元素

1.border邊框 *{box-sizing:border-box; } //使所有邊框不再撐大盒子模型 粗細 : border-width 樣式 : border-style, 默認沒邊框 . solid 實線邊框 dashed 虛線邊框 dotted 點線邊框 顏色 : border-color div { width : 200px ; height : 200px ; border : …

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…

“扣子”開發之四:與千帆AppBuilder比較

上一個專題——“扣子”開發——未能落地&#xff0c;開始抱著極大的熱情進入&#xff0c;但迅速被稚嫩的架構模型折磨打擊&#xff0c;硬著頭皮堅持了兩周&#xff0c;終究還是感覺不實用不趁手放棄了。今天詢問了下豆包&#xff0c;看看還有哪些比較好的AI開發平臺&#xff0…

RV1126+FFMPEG推流項目(7)AI音頻模塊編碼流程

一、AI 模塊和外設麥克風的關系 AI 模塊是 RV1126 芯片的一個重要組成部分。它的主要功能是將外部接入的麥克風采集到的模擬信號通過內置的驅動程序轉換為數字信號。這意味著麥克風作為外設&#xff0c;提供音頻輸入信號&#xff0c;AI 模塊通過其硬件和軟件的結合&#xff0c…

遺傳算法 (Genetic Algorithm) 算法詳解及案例分析

遺傳算法 (Genetic Algorithm) 算法詳解及案例分析 目錄 遺傳算法 (Genetic Algorithm) 算法詳解及案例分析1. 引言2. 遺傳算法的基本概念2.1 遺傳算法的定義2.2 遺傳算法的核心思想2.3 遺傳算法的應用領域3. 遺傳算法的主要步驟3.1 初始化種群3.2 選擇3.3 交叉3.4 變異3.5 更新…

Rust 強制類型轉換和動態指針類型的轉換

在 Rust 中的強制類型轉換&#xff08;Coercion&#xff09;語義&#xff0c;與 Java 或 C 中的子類到父類的轉換有某些相似之處&#xff0c;但兩者的實現機制和使用場景有很大的區別。 我們將從 Java/C 的子類到父類轉換 和 Rust 的強制類型轉換 的角度進行比較&#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.常數 …

【后端面試總結】tls中.crt和.key的關系

tls中.crt和.key的關系 引言 在現代網絡通信中&#xff0c;特別是基于SSL/TLS協議的加密通信中&#xff0c;.crt和.key文件扮演著至關重要的角色。這兩個文件分別代表了數字證書和私鑰&#xff0c;是確保通信雙方身份認證和數據傳輸安全性的基石。本文旨在深入探討TLS中.crt和…

【k8s面試題2025】2、練氣初期

在練氣初期&#xff0c;靈氣還比較稀薄&#xff0c;只能勉強在體內運轉幾個周天。 文章目錄 簡述k8s靜態pod為 Kubernetes 集群移除新節點&#xff1a;為 K8s 集群添加新節點Kubernetes 中 Pod 的調度流程 簡述k8s靜態pod 定義 靜態Pod是一種特殊類型的Pod&#xff0c;它是由ku…