国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

窗口子系統基本概念與流程分析

王程 ? 來源:jf_75796907 ? 作者:jf_75796907 ? 2024-03-05 09:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

窗口子系統位于 fundationwindowmanager 目錄下,提供對窗口與 Display 管理的基礎能力

概覽

窗口是什么

每個 Ability 在創建時都會創建一個主窗口,并且為該窗口設置 ACE 中的 UIContent 用于加載展示 UI 界面?;旧纤械?UI 視圖都是在窗口中展示的,比如彈窗、toast、系統狀態欄導航欄、應用等。因此窗口子系統是系統圖形界面顯示所需的基礎子系統。

窗口的種類

  • 主窗口: 應用顯示的主窗口,即每個 Ability 持有的主窗口
  • 子窗口: 必須依附于主窗口來創建與顯示
  • 系統窗口 :其他窗口均屬于系統窗口

窗口的屬性

WindowFlag
flag 指定窗口的部分測量規則:

WINDOW_FLAG_NEED_AVOID 是否避開區域,默認避開,比如狀態欄導航欄區域

WINDOW_FLAG_PARENT_LIMIT 是否受到父窗口的限制,默認不限制,如果限制,則寬高不能超過父窗口,需與 WINDOW_MODE_FLOATING 配合使用
WindowMode
mode 指定窗口的布局規則:

WINDOW_MODE_UNDEFINED 默認模式,默認寬高為 display 寬高減去狀態欄導航欄等的寬高

WINDOW_MODE_FULLSCREEN 全屏模式,但需要與 * * * WINDOW_FLAG_NEED_AVOID 一起使用,默認寬高為 display 寬高

WINDOW_MODE_SPLIT_PRIMARY 分屏主窗口模式,如果是橫屏則位于左側,豎屏位于上方

WINDOW_MODE_SPLIT_SECONDARY 分屏副窗口模式,如果是橫屏則位于右側,豎屏位于下方

WINDOW_MODE_FLOATING 懸浮模式,懸浮窗口可以通過窗口邊緣改變窗口大小,默認寬高為 display 寬高的 3/4
應用主窗口可以通過啟動 ability 時的參數 Want::PARAM_RESV_WINDOW_MODE(ohos.aafwk.param.windowMode)來側面指定 WindowMode 的值

priority
窗口優先級決定了窗口的層級,priority 越大窗口越靠近頂部。該屬性位于 WindowNode 內,且只能由 WindowType 決定。

WindowType
窗口類型的改變會引起 flag、mode、priority 或其他屬性的改變,從而達到改變窗口的測量、排列與層級的目的。如:

  • WINDOW_TYPE_STATUS_BAR
property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
property_->SetFocusable(false);

?

  • WINDOW_TYPE_KEYGUARD
RemoveWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID);
SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
?

層級則是由 WindowType 的 Priority 值與類型共同決定,同類型取值越大層級越高,WindowType 的 Priority 定義位于 foundationwindowmanagerwmserverincludewindow_zorder_policy.h 中,如:

WINDOW_TYPE_WALLPAPER = 0

WINDOW_TYPE_DESKTOP = 1

WINDOW_TYPE_APP_MAIN_WINDOW = 0

WINDOW_TYPE_APP_SUB_WINDOW = 1

WINDOW_TYPE_STATUS_BAR = 110

WINDOW_TYPE_KEYGUARD = 114

WINDOW_TYPE_BOOT_ANIMATION = 117
WindowType 的類型則有三種:

BelowApp 位于底層,如桌面、壁紙等

App 位于中間,如應用主窗口、子窗口

AboveApp 位于上方,如鎖屏、狀態欄等

WindowType 是在這幾個屬性中,開發者目前唯一能直接修改的窗口屬性:

window.setWindowType(type: WindowType): Promise
?

Window、Display、Screen 的關系
Screen 是物理屏幕,Display 是邏輯屏幕,Window 則依附于 Display。Screen 與 Display 之間是多對多的關系,Display 與 Window 也是多對多的關系。在普通的單屏場景下,Screen 與 Display 是一對一,Display 與 Window 則是一對多。

WindowManagerService
WMS 主要負責 Window 的管理,比如創建、銷毀、布局、層級的管理,并提供窗口布局、焦點、事件分發的能力,但不負責繪制。主要職責如下:

  • 管理 Window 的創建與銷毀、窗口的屬性的維護
  • 窗口樹的維護
  • 窗口焦點的管理
  • 窗口的層級管理以及輸入法窗口的層級提升
  • 窗口布局與策略的管理
  • 提供窗口的縮放與拖拽能力
    避開區域的管理
  • 加載 ACE 布局并觸發布局回調事件

DisplayManagerService

DMS 提供 Display 信息、Display 事件通知以及管理 Display 與 Screen 映射關系,其他能力主要通過 RenderService 實現。主要職責如下:

  • 通過 RenderService 獲取并管理 Screen
  • ScreenGroup 的管理
  • Display 的管理,以及其與 Screen 的映射管理
  • 對外提供顯示信息,如寬高、虛擬像素比等
  • 提供截屏、量滅屏、橫豎屏、亮度等屏幕相關能力
  • 提供擴展屏幕或鏡像屏等多屏能力
  • 虛擬屏幕的管理
  • Display 事件的通知,如屏幕亮滅、顯示大小、橫豎屏、凍結等事件

窗口管理流程分析

創建窗口

窗口的創建從 Ability 的 OnStart 聲明周期函數中觸發。

  • Ability 持有 AbilityWindow,AbilityWindow 則持有 WindowScene
  • WindowScene 在初始化階段會創建一個主窗口
  • 窗口的創建會調用 Window::Create 函數創建 WindowImpl 對象,并調用 WindowManagerService::CreateWindow 函數
  • 在 WindowManagerService 中,則通過 WindowController 生成 windowId 并創建 WindowNode
  • 最后通過 WindowRoot 將 WindowNode 管理起來

AbilityWindow 與 WindowScene 的關系

AbilityWindow 是 Ability 持有用來在生命周期函數中生成或調用窗口生命周期的類,操作窗口的類則是 WindowScene。WindowScene 由 WindowManager client 端提供,用于屏蔽元能力與窗口管理之間強耦合,方便后續無屏幕的小型設備裁剪顯示系統。

WindowImpl 與 WindowNode 的區別

WindowImpl 是 IWindow 的實現,是提供給上層操作窗口的接口。WindowNode 與 WindowImpl 一一對應,是 WMS 中操作窗口的實體,其通過 WindowRoot 管理。* WindowNode 內部維護了一個 windowToken_對象,該對象的指向就是 WindowImpl。

  • WindowImpl 負責對應用于其他子模塊提供操作窗口的能力,能力通過 WMS 與 RenderService 實現。WindowImpl 在創建時會創建 RSSurfaceNode 對象,該對象則會向 RenderService 提交一條窗口創建的事務。
  • 在 WindowNode 創建時,WindowImpl 會將 RSSurfaceNode 的引用傳遞給 WindowNode。
  • WindowNode 則是 WMS 中對窗口的抽象,內部維護了父子關系、顯示隱藏、布局大小等。

WindowRoot 的作用

顧名思義,WindowRoot 管理著所有的窗口。其內部維護著 WindowNode 與 WindowId 的 map,提供了對 WindowNode 的增刪改查操作,并且提供了最小化所有窗口、最大化窗口、設置布局策略等能力。

WindowImpl 的管理

主窗口的 WindowImpl 由 WindowScene 持有,子窗口則由主窗口自己管理維護。在 Ability 銷毀時,會通知 WindowScene 銷毀主窗口,主窗口則會銷毀所有的子窗口,并通知 WMS 中的 WindowRoot 銷毀相應的 WindowNode。

窗口的顯示

創建的流程僅僅是創建了 WindowImpl 與 WindowNode,并未涉及布局與渲染,那么窗口是如何顯示的呢?

  • 窗口的顯示也是通過 Ability 觸發,在其生命周期函數 OnActive/OnForground 內,會調用到 WindowScene::GoForeground 中。
  • 窗口的顯示也可以通過在 ets 中手動調用 window.show()觸發
  • 調用主窗口的 show 方法,即 WindowImpl::Show
  • 在其中會做一些判斷,比如桌面的顯示,會將其他 app 都最小化
  • 接著 WindowImpl 通過 WMS 調用 WindowRoot 的 AddWindowNode 函數,并將 windowId 傳遞過來
  • WindowRoot 通過 windowId 查找 WindowNode,并通過 diaplayId 創建或者獲取 WindowNodeContainer 對象,并調用其 AddWindowNode 函數
  • 在 WindowNodeContainer 內,會判斷 window 類型并將 window 加入到相應的父窗口中(appRoot、belowRoot、aboveRoot)
  • 接著會處理 WindowNode 中父子關系的映射,并調用 DMS 服務的 UpdateRSTree
  • 處理所有窗口的 z 值,并按規則設置到每個窗口的 surfaceNode 中,該操作會向 RenderService 提交一條事務。
  • z 值的規則為:從 belowRoot->appRoot->aboveRoot,z 值越來越大。同一類型中,window 的 priority 越大,z 值越大。同一 priority 的情況下,窗口被添加的越晚,z 值越大。z 值越大,排列越靠上。
  • WindowNodeContainer 維護著兩種布局策略,CASCADE 與 TILE,在維護完 z 值與父子關系等操作后,會調用布局策略的 AddWindowNode 函數
  • 下面的流程均基于 CASCADE 策略
  • 判斷窗口 Visibility,為 false 則不布局
  • 判斷避開區域,限制窗口大小。如果是全屏窗口,則寬高與 display 一致。
  • 如果是懸浮窗口,默認大小設置為 display 的 3/4,并設置一個 Decorate 矩形,該矩形為窗口增加了 37vp、5vp、5vp、5vp(上右下左),該矩形用于拖拽與平移
  • 如果設置了 WINDOW_FLAG_PARENT_LIMIT 標記并且是子窗口,限制子窗口的大小不能超過父窗口
  • 為懸浮窗口設置 hotZone,上下左右均增加 20vp。該區域用于多模輸入模塊判斷手指是否落在 window 內,也就是增加判斷范圍。
  • 調用窗口的 surfaceNode 的 SetBounds 函數,指定窗口的坐標與大小。該函數也會向 RenderService 提交一條事務。
  • 迭代子窗口,為其執行同樣的流程
  • 總結下來,窗口的顯示就是處理了父子關系、窗口先后關系,以及確定了坐標與大小,最后向 RenderService 提交事務,等待下個 vsync 的繪制

WindowNodeContainer 的作用

WindowNodeContainer 與 Display 一一對應,其管理了單個 Display 中的所有窗口,WindowRoot 則管理了所有的窗口與 WindowNodeContainer。WindowNodeContainer 提供了布局策略的決策與設置、窗口焦點設置、窗口排列、避開區域管理、窗口分屏顯示等能力。

布局策略

OH 目前支持兩種策略,CASCADE(層疊)與 TILE(平鋪)。默認的布局策略是 CASCADE,分屏顯示也會將策略切換至 CASCADE。布局策略的主要能力就是決定窗口的排列布局方式、位置與大小。兩種策略的區別如下:

wKgaomXlvAWALf5cAAAWJdArVoE132.png

總結

wKgZomXlvAyAHfszAABY-5gLjRM805.png

設置全屏

設置全屏可以通過 ets 調用 window.setFullScreen(true),window 會占滿全屏,并且狀態欄與導航欄會消失。接下來來看看底層是如何實現的。

setFullScreen 會走到 WindowImpl 中,其中主要做了 3 件事

  • SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN)
  • RemoveWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID)
  • 通過 SetSystemBarProperty 將狀態欄與導航欄的 enable 置為 false

SetWindowMode
代碼會調用到 WindowController::SetWindowMode 內,其中會對 mode 做一些判斷。針對 FULLSCREEN 的情況,會最小化其他 app 的 window
接著調用 WindowNodeContainer::UpdateWindowNode,其中會調用布局策略來更新窗口的布局

RemoveWindowFlag
為窗口的 property 這是 flag 后,同樣會走到 WindowNodeContainer::UpdateWindowNode 中
與窗口顯示流程一樣,其判斷為全屏窗口后,不會避開狀態欄與導航欄區域

SetSystemBarProperty
SetSystemBarProperty 同樣會在 WindowNodeContainer 中更新窗口
迭代所有窗口,遇到全屏窗口,就將窗口內的 SystemBarProperty 與默認的對比,有變化(enable 值不同)就通知訂閱了 systemBarTintChange 事件的組件
即 ets 中:window.on(‘systemBarTintChange’)
systemui 訂閱了該事件,在收到事件后,根據 enable 的值,去調用 statusBar/navigationBar 窗口的 hide 方法,來達到隱藏狀態欄導航欄的目的

如何設置全屏并且顯示狀態欄導航欄

只需要在調用 window 的 setFullScreen 函數后,在調用其 setSystemBarEnable 即可:

window.setSystemBarEnable(['status', 'navigation']).then(() => {})

加載 ui

在 Stage 模式中,我們通過 WindowStage 的 setUIContent 來加載頁面,這個過程是如何實現的?WindowStage 是 WMS 提供給前端的一套 api,其通過調用 WindowImpl 的 setUIContent 來實現:

uiContent_ = Ace::UIContent::Create(context_.get(), engine)
uiContent_->Initialize(this, contentInfo, storage)

WindowImpl 會在合適的時機,調用 UIContent 內的回調:

  • uiContent_->UpdateViewportConfig(config, reason) 寬高位置等變化
  • uiContent_->UpdateWindowMode(mode)
  • uiContent_->ProcessBackPressed()
  • uiContent_->ProcessKeyEvent(keyEvent)
  • uiContent_->ProcessPointerEvent(pointerEvent)
  • uiContent_->ProcessVsyncEvent(static_cast(timeStamp))
  • uiContent_->UpdateConfiguration(configuration) 系統語言、顏色模式等變化

觸摸事件的傳遞

觸摸事件由多模輸入模塊傳遞到窗口,經過處理后,傳遞給 ACE 中的 UIContent 中。

通過 InputManager 注冊為窗口輸入事件消費者
觸摸事件會回調至 WindowInputChannel::HandlePointerEvent 中
如果調用了窗口的 AddInputEventListener 設置觸摸監聽,轉發事件至監聽內,并且只將 POINTER_ACTION_DOWN 與 POINTER_ACTION_BUTTON_DOWN 傳遞給窗口。
如果是 POINTER_ACTION_MOVE 事件,在下一幀將事件傳遞給窗口。如果是其他事件,立即傳遞給窗口。
在窗口內,如果是懸浮窗口:

  • POINTER_ACTION_DOWN
    • 判斷手指是否落在窗口之外,窗口 Decorate 矩形內,如果是,開啟拖拽模式
    • 如果觸摸的 window 類型為 WINDOW_TYPE_DOCK_SLICE,開始移動模式
  • POINTER_ACTION_MOVE
    • 如果開啟拖拽模式,根據手指移動的距離,通過 WindowNodeContainer 修改窗口大小
    • 如果開啟移動模式,根據手指移動的距離,通過 WindowNodeContainer 修改窗口位置
  • 如果開啟了開啟拖拽或移動模式,事件不會繼續傳遞,如果未開啟,則會傳遞給 ACE 的 UIContent

Display 管理流程分析

DMS 啟動流程

DMS 在啟動時的主要工作就是從 RenderService 獲取屏幕信息,并創建 ScreenGroup 與 Display

通過 RSInterface 注冊屏幕連接回調,在屏幕連接后,創建 AbsScreen

再通過 RSInterface 獲取屏幕支持的分辨率、刷新率等信息,設置到 AbsScreen 中

創建 ScreenGroup,將 AbsScreen 添加到 group 中

添加后會為 AbstractScreen 初始化 RSDisplayNode,并向 RenderService 提交一條 RSDisplayNode 創建的事務

ScreenGroup 與 AbsScreen 初始化完畢后,會為 * *

AbsScreen 創建一個 AbstractDisplay
AbstractDisplay 保存了 AbsScreen 中的分辨率刷新率等信息,并且根據屏幕寬與高,決定虛擬像素比。

通知感興趣的部件,Display 已經創建好

WMS 也會通過 DMS 監聽 Display 的變化,比如大小變化、橫豎屏變化,WMS 會通知到 WindowNodeContainer 去更新 Display 的狀態并重新布局所有窗口

如果遇到 BEFORE_SUSPEND 事件,比如進入鎖屏狀態,WMS 會通過 WindowNodeContainer 通知每個窗口(WindowImpl)更新其狀態為 STATE_FROZEN,并告知 AMS,讓持有窗口的 Ability 進入后臺狀態

ScreenGroup 是什么

ScreenGroup 顧名思義是屏幕組,屏幕組中定義了多個屏幕的連接方式,如擴展或鏡像。每個物理屏幕在連接后都會加入到默認的屏幕組中。屏幕組也可以包含虛擬屏幕。ScreenGroup 與 AbsScreen 都由 AbstractScreenController 管理。

UpdateRSTree

UpdateRSTree 會在窗口節點顯示或隱藏時調用,其作用就是為 AbsScreen 中的 RSDisplayNode 添加或刪除窗口的 RSSurfaceNode,并向向 RenderService 提交增加或刪除子節點的事務。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 子系統
    +關注

    關注

    0

    文章

    115

    瀏覽量

    13501
  • DMS
    DMS
    +關注

    關注

    0

    文章

    99

    瀏覽量

    17109
  • WMS
    WMS
    +關注

    關注

    1

    文章

    123

    瀏覽量

    6172
  • 鴻蒙
    +關注

    關注

    60

    文章

    2963

    瀏覽量

    45883
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    大語言模型如何處理上下文窗口中的輸入

    本博客介紹了五個基本概念,闡述了大語言模型如何處理上下文窗口中的輸入。通過明確的例子和實踐中獲得的見解,本文介紹了多個與上下文窗口有關的基本概念,如詞元化、序列長度和注意力等。
    的頭像 發表于 12-03 13:48 ?592次閱讀
    大語言模型如何處理上下文<b class='flag-5'>窗口</b>中的輸入

    TVS二極管的基本概念和主要作用

    芝識課堂的全新內容又和大家見面啦!從本期開始,我們將用四節課為大家系統介紹一位在電路設計中默默奉獻的“無名英雄”——TVS二極管。我們會從它的基本概念、工作原理,聊到如何為電路挑選合適的型號、布局
    的頭像 發表于 11-28 09:27 ?1.7w次閱讀
    TVS二極管的<b class='flag-5'>基本概念</b>和主要作用

    CoWoP封裝的概念、流程與優勢

    本文介紹了CoWoP(Chip?on?Wafer?on?Substrate)封裝的概念、流程與優勢。
    的頭像 發表于 08-12 10:49 ?2882次閱讀
    CoWoP封裝的<b class='flag-5'>概念</b>、<b class='flag-5'>流程</b>與優勢

    電壓波動與閃變的基本概念

    如果您是電力系統工程師、電氣設備維護人員或者相關專業的學生,應該注意到了有關電能質量的國家標準GB/T 12326-2008是有關電壓波動和閃變的,那這兩個參數的考核意義是什么?國家標準規定這兩個參數如何計算、測量和考核?這篇文章帶您全面了解電壓波動和閃變的基本概念、重要
    的頭像 發表于 07-22 14:10 ?2991次閱讀
    電壓波動與閃變的<b class='flag-5'>基本概念</b>

    RK3128 Android 7.1 進入深度休眠流程分析

    RK3128 Android 7.1 進入深度休眠流程分析RK3128是瑞芯微電子推出的一款低功耗四核Cortex-A7處理器,運行Android 7.1系統時進入深度休眠(Deep Sleep
    發表于 07-22 10:45

    群延遲的基本概念和仿真實例分析

    在高速數字通信和射頻系統中,信號從發送端到接收端的傳輸過程中會遇到各種失真和畸變。群延遲(Group Delay)作為描述系統相位線性度的重要參數,直接影響著信號保真度和系統性能。本文將深入淺出地介紹群延遲的
    的頭像 發表于 07-08 15:14 ?2305次閱讀
    群延遲的<b class='flag-5'>基本概念</b>和仿真實例<b class='flag-5'>分析</b>

    技術干貨 | AD/DA動態分析中的信號窗口處理技術

    前一章詳解了TX7006上的線性計算,AD/DA動態分析中的傅里葉變換和動態參數計算。本期文章將為大家繼續介紹AD/DA動態分析中的信號窗口。
    的頭像 發表于 07-03 13:39 ?1100次閱讀
    技術干貨 | AD/DA動態<b class='flag-5'>分析</b>中的信號<b class='flag-5'>窗口</b>處理技術

    迅為RK3568開發板新增topeet子系統-在產品中新增子系統

    build/subsystem_config.json文件中增加名為topeet的子系統,在3.4節已經新建了topeet 文件夾存放子系統代碼。添加 topeet 子系統進行一個登記,說明
    發表于 06-16 10:43

    迅為RK3568開發板驅動指南GPIO子系統GPIO子系統API函數的引入

    迅為RK3568開發板驅動指南GPIO子系統GPIO子系統API函數的引入
    的頭像 發表于 05-29 14:05 ?1014次閱讀
    迅為RK3568開發板驅動指南GPIO<b class='flag-5'>子系統</b>GPIO<b class='flag-5'>子系統</b>API函數的引入

    RK3568驅動指南|第十二篇 GPIO子系統-第135章 GPIO子系統與pinctrl子系統相結合實驗

    RK3568驅動指南|第十二篇 GPIO子系統-第135章 GPIO子系統與pinctrl子系統相結合實驗
    的頭像 發表于 05-23 13:47 ?1015次閱讀
    RK3568驅動指南|第十二篇 GPIO<b class='flag-5'>子系統</b>-第135章 GPIO<b class='flag-5'>子系統</b>與pinctrl<b class='flag-5'>子系統</b>相結合實驗

    第十三章 通訊的基本概念

    本章介紹通訊基本概念,包括串行/并行、全雙工/半雙工/單工、同步/異步通訊,還提及通訊速率中比特率與波特率的概念。
    的頭像 發表于 05-22 17:29 ?2062次閱讀
    第十三章 通訊的<b class='flag-5'>基本概念</b>

    一文帶你了解KaihongOS標準系統的技術架構、子系統系統應用、典型特性以及支持的設備類型

    文本Y 4. 支持移動輸入光標Y5. 支持輸入事件訂閱,包括光標變化、文本變化、文本選擇變化等Y7窗口子系統/1. 獲取屏幕屬性,監聽屏幕變化Y2. 窗口管理Y3. 獲取屏幕截圖,截屏數據保存
    發表于 04-23 07:17

    飛凌嵌入式ElfBoard ELF 1板卡-input子系統之input子系統簡介

    在Linux系統中,Input子系統是一個用于處理輸入設備的軟件框架。它提供了一種統一的接口和機制,使得各種輸入設備(如鍵盤、鼠標、觸摸屏、游戲手柄等)能夠與Linux系統進行交互。Input
    發表于 04-15 10:27

    射頻基礎知識培訓(華為)—PPT版

    資料介紹 射頻子系統位于整個基站的最前端,是整個NodeB系統正常運行的關鍵環節之一。本膠片主要講述射頻基本概念和知識,以便大家更加深入理解NodeB系統。 學習完本課程,您將能夠:
    發表于 03-22 16:30

    本周三晚7點!《手把手教你做PC》第四課:驅動子系統開發流程上-KHDF

    本周三晚七點,《KaihongOS筆記本電腦開發實戰④——驅動子系統開發流程上-KHDF》即將啟動!本次課程旨在幫助開發者了解KaihongOS驅動子系統開發流程、理解HDF和KHDF
    的頭像 發表于 03-10 17:32 ?646次閱讀
    本周三晚7點!《手把手教你做PC》第四課:驅動<b class='flag-5'>子系統</b>開發<b class='flag-5'>流程</b>上-KHDF