成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OHOS標(biāo)準(zhǔn)系統(tǒng)的IPC和RPC代碼解讀(一)

系統(tǒng) OpenHarmony
在Linux命令行下進(jìn)入 //foundation/communication/ipc/ 目錄,通過(guò)tree命令將目錄樹結(jié)構(gòu)打印出來(lái)并重定向到文本文件中。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

本想接著前文《OHOS標(biāo)準(zhǔn)系統(tǒng)的SAMGR代碼解讀》繼續(xù)分析dmsfwk組件的實(shí)現(xiàn)細(xì)節(jié),但發(fā)現(xiàn)涉及太多的IPC/RPC的內(nèi)容了,如果對(duì)OHOS的IPC/RPC沒(méi)有足夠的理解,很難把dmsfwk組件理解透徹,因此我花了點(diǎn)時(shí)間,先整理了一下IPC/RPC相關(guān)的代碼和部分流程,作為理解SAMGR相關(guān)組件的預(yù)備知識(shí)。

IPC/RPC的代碼倉(cāng)庫(kù),在OHOS 3.1分支上,分為ipc和ipc_lite兩個(gè)倉(cāng)庫(kù),在master分支上,ipc_lite倉(cāng)庫(kù)已經(jīng)合并到ipc倉(cāng)庫(kù)中,因此本文在整理ipc倉(cāng)庫(kù)代碼目錄樹結(jié)構(gòu)時(shí),是以當(dāng)前的master分支代碼為準(zhǔn)整理的。

但由于我當(dāng)前工作主要還是在OHOS 3.1分支上,所以在后面整理相關(guān)的流程圖或數(shù)據(jù)結(jié)構(gòu)關(guān)系圖時(shí),還是基于3.1分支代碼進(jìn)行的(待930版本發(fā)布后再確認(rèn)是否更新到930版本)。

1、整理代碼目錄樹結(jié)構(gòu)(基于master分支)

在Linux命令行下進(jìn)入 //foundation/communication/ipc/ 目錄,通過(guò)tree命令將目錄樹結(jié)構(gòu)打印出來(lái)并重定向到文本文件中。為減少干擾,直接去除test相關(guān)的目錄和文件,再酌情微調(diào)一下部分目錄和文件的位置。重點(diǎn)閱讀剩下的幾個(gè)BUILD.gn文件,結(jié)合幾類系統(tǒng)分別整理BUILD.gn中的編譯目標(biāo),盡可能地挖掘有用信息(后繼在深入理解代碼時(shí)也可以對(duì)該目錄樹結(jié)構(gòu)補(bǔ)充新的信息)。

目前我整理出來(lái)的信息大概如下:

# 系統(tǒng)類型:Lite類型系統(tǒng)(a-LiteM、b-LiteA、c-LiteL)、STD系統(tǒng)
# Lite類型系統(tǒng)的編譯目標(biāo):
#【0】shared_library("rpc_log"),LiteM系統(tǒng)該文件直接編譯進(jìn)2.1中。
# 【Lite類型系統(tǒng):LOG_DOMAIN 0xD001518,LOG_TAG "IPCRPC"】
# 【 STD類型系統(tǒng):ipc_debug.h、log_tags.h】
#【1】靜態(tài)或動(dòng)態(tài)library("rpc_adapter")【簡(jiǎn)單:RpcGetPid()/RpcGetUid()的適配】
# 【1.1】static_library("rpc_adapter"),LiteM系統(tǒng)依賴該庫(kù)
# 【1.2】shared_library("rpc_adapter"),LiteA+LiteL小型系統(tǒng)依賴該庫(kù)
#【2】靜態(tài)或動(dòng)態(tài)library("rpc_manager")
# 【2.1】static_library("rpc_manager"),LiteM系統(tǒng)依賴該庫(kù)
# 【2.2】shared_library("rpc_manager"),LiteA編譯該庫(kù)為空實(shí)際不依賴,LiteL小型系統(tǒng)依賴該庫(kù)
#【3】靜態(tài)或動(dòng)態(tài)library("dbinder")
# 【3.1】static_library("dbinder"),LiteM系統(tǒng)依賴該庫(kù)
# 【3.2】shared_library("dbinder"),LiteA小型系統(tǒng)不依賴該庫(kù),LiteL小型系統(tǒng)依賴該庫(kù)
#【4】shared_library("ipc_single"),LiteM系統(tǒng)不依賴該庫(kù),LiteA和LiteL小型系統(tǒng)依賴該庫(kù)
# STD系統(tǒng)的編譯目標(biāo):
#【10】ohos_shared_library("ipc_core") 【包含本地設(shè)備內(nèi)的IPC,以及與dbinder相關(guān)的基礎(chǔ)功能】
#【11】ohos_shared_library("ipc_single")【有定義CONFIG_IPC_SINGLE,完全是本地設(shè)備內(nèi)的IPC】
#【12】ohos_shared_library("libdbinder")【dbinder,與RPC相關(guān)的功能實(shí)現(xiàn)】
#【13】ohos_shared_library("rpc") 【rpc_js接口】
# 依賴關(guān)系:
#LiteM:依賴【 1.1+2.1+3.1 】(0-直接編譯到2.1中)
#LiteA:依賴【0+1.2+ 4】(2-編譯為空實(shí)際不依賴,3-不依賴)
#LiteL:依賴【0+1.2+2.2+3.2+4】
#STD :依賴【10+11+12】+【13】
# 目錄樹結(jié)構(gòu)
//foundation/communication/ipc/
├── bundle.json
├── BUILD.gn #定義ipc_components:STD系統(tǒng)依賴【10+11+12】,Lite系統(tǒng)依賴【interfaces/innerkits/c:rpc】
├── interfaces #接口部分,整理編譯目標(biāo)和依賴關(guān)系
│ ├── innerkits
│ │ │ # Lite類型系統(tǒng)組件
│ │ ├── c
│ │ │ ├── BUILD.gn #Lite系統(tǒng)專用的組件【lite_component("rpc")】
│ │ │ │ #LiteM:依賴【 1.1+2.1+3.1 】(0-直接編譯到2.1中)
│ │ │ │ #LiteA:依賴【0+1.2+ 4】(2-編譯為空實(shí)際不依賴,3-不依賴)
│ │ │ │ #LiteL:依賴【0+1.2+2.2+3.2+4】
│ │ │ ├── dbinder #distributed binder for Lite
│ │ │ │ ├── BUILD.gn #【3.1】和【3.2】
│ │ │ │ └── include/dbinder_service.h
│ │ │ └── ipc
│ │ │ ├── BUILD.gn #【2.1】和【2.2】
│ │ │ └── include
│ │ │ ├── ipc_skeleton.h
│ │ │ ├── rpc_errno.h
│ │ │ └── serializer.h
│ │ │
│ │ │ # STD系統(tǒng)專用的組件【10】【11】【12】【13】
│ │ ├── ipc_core
│ │ │ ├── BUILD.gn #【10】ohos_shared_library("ipc_core")
│ │ │ └── include
│ │ │ ├── ipc_file_descriptor.h
│ │ │ ├── ipc_object_proxy.h
│ │ │ ├── ipc_object_stub.h
│ │ │ ├── ipc_skeleton.h
│ │ │ ├── ipc_types.h
│ │ │ ├── iremote_broker.h
│ │ │ ├── iremote_object.h
│ │ │ ├── iremote_proxy.h
│ │ │ ├── iremote_stub.h
│ │ │ ├── jni_help.h
│ │ │ ├── message_option.h
│ │ │ ├── message_parcel.h
│ │ │ └── peer_holder.h
│ │ ├── ipc_single/BUILD.gn #【11】ohos_shared_library("ipc_single") + CONFIG_IPC_SINGLE
│ │ └── libdbinder # distributed binder for STD
│ │ ├── BUILD.gn #【12】ohos_shared_library("libdbinder")依賴【10】
│ │ └── include
│ │ ├── dbinder_service.h
│ │ ├── dbinder_service_stub.h
│ │ └── rpc_system_ability_callback.h
│ └── kits
│ ├── bundle.json # RPC napi for js
│ └── js/napi/BUILD.gn #【13】ohos_shared_library("rpc") 依賴【10】

│ #工具部分【Lite類型系統(tǒng)在用,STD系統(tǒng)不用】
├── utils
│ ├── include
│ │ ├── log_tags.h # LOG_ID_COMMUNICATION 以及子模塊的LOG_ID定義
│ │ └── rpc_session_handle.h
│ └── src/rpc_session_handle.c #【a+c】

│ # IPC/RPC的框架實(shí)現(xiàn)代碼
├── ipc
│ └── native
│ │ #Lite類型系統(tǒng)的IPC框架代碼
│ ├── c
│ │ ├── adapter
│ │ │ ├── access_token
│ │ │ │ ├── include/access_token_adapter.h
│ │ │ │ └── src/access_token_adapter.c #【STD】【只有STD系統(tǒng)的[10][11]編譯該文件,Lite類型系統(tǒng)不編譯】
│ │ │ ├── BUILD.gn #【1】單獨(dú)編譯 rpc_os_adapter.c 源文件
│ │ │ ├── include
│ │ │ │ ├── rpc_bytrace.h
│ │ │ │ └── rpc_os_adapter.h
│ │ │ ├── Linux/rpc_os_adapter.c #【1.2】【b+c】
│ │ │ └── Liteos_m/rpc_os_adapter.c #【1.1】【a】
│ │ ├── ipc
│ │ │ ├── include
│ │ │ │ ├── ipc_invoker.h
│ │ │ │ └── ipc_types.h
│ │ │ └── src
│ │ │ ├── linux
│ │ │ │ ├── include/sys_binder.h
│ │ │ │ ├── ipc_invoker.c #【c】
│ │ │ │ └── serializer_inner.c #【c】
│ │ │ ├── liteos_a
│ │ │ │ ├── include/lite_ipc.h
│ │ │ │ ├── ipc_invoker.c #【b】
│ │ │ │ └── serializer_inner.c #【b】
│ │ │ └── liteos_m
│ │ │ ├── ipc_invoker.c #【a】
│ │ │ └── serializer_inner.c #【a】
│ │ ├── manager
│ │ │ ├── include
│ │ │ │ ├── ipc_process_skeleton.h
│ │ │ │ ├── ipc_skeleton_pri.h
│ │ │ │ ├── ipc_thread_pool.h
│ │ │ │ ├── iremote_invoker.h
│ │ │ │ ├── rpc_log.h
│ │ │ │ ├── rpc_types.h
│ │ │ │ └── serializer_inner.h
│ │ │ └── src
│ │ │ ├── ipc_process_skeleton.c #【a+b+c】公共部分5個(gè)文件
│ │ │ ├── ipc_skeleton.c #【a+b+c】公共部分5個(gè)文件
│ │ │ ├── ipc_thread_pool.c #【a+b+c】公共部分5個(gè)文件
│ │ │ ├── iremote_invoker.c #【a+b+c】公共部分5個(gè)文件
│ │ │ ├── serializer.c #【a+b+c】公共部分5個(gè)文件
│ │ │ └── rpc_log.c #【a】編譯在【2.1】,【b+c】LiteA+LiteL單獨(dú)編譯出【0】
│ │ └── rpc
│ │ ├── include
│ │ │ ├── dbinder_invoker.h
│ │ │ ├── rpc_feature_set.h
│ │ │ ├── rpc_process_skeleton.h
│ │ │ └── rpc_trans_callback.h
│ │ ├── ipc_adapter
│ │ │ ├── include
│ │ │ │ ├── ipc_proxy_inner.h
│ │ │ │ └── ipc_stub_inner.h
│ │ │ ├── mini
│ │ │ │ ├── ipc_proxy_inner.c #【a】
│ │ │ │ └── ipc_stub_inner.c #【a】
│ │ │ └── small
│ │ │ ├── ipc_proxy_inner.c #【c】
│ │ │ └── ipc_stub_inner.c #【c】
│ │ ├── src
│ │ │ ├── dbinder_invoker.c #【a+c】
│ │ │ ├── rpc_feature_set.c #【STD】【只有STD系統(tǒng)的[10]編譯該文件,Lite類型系統(tǒng)不編譯】
│ │ │ ├── rpc_process_skeleton.c #【a+c】
│ │ │ ├── rpc_process_skeleton_virtual.c #【b+c】
│ │ │ └── rpc_trans_callback.c #【a+c】
│ │ └── trans_adapter
│ │ ├── include
│ │ │ ├── rpc_softbus_trans.h
│ │ │ └── rpc_trans.h
│ │ └── src
./ipc/test/rpc/socket_trans/src/rpc_socket_trans.c #【c】因?yàn)閑nable_socket_trans[true]用socket而不用softbus
│ │ ├── rpc_softbus_trans.c #【a】如果enable_socket_trans[false],則這里【+c】用softbus而不用socket
│ │ └── rpc_trans.c #【a+c】
│ │
│ │ # STD系統(tǒng)的IPC框架代碼
│ └── src
│ ├── core
│ │ ├── include
│ │ │ ├── buffer_object.h
│ │ │ ├── comm_auth_info.h
│ │ │ ├── databus_session_callback.h
│ │ │ ├── dbinder_callback_stub.h
│ │ │ ├── dbinder_error_code.h
│ │ │ ├── dbinder_session_object.h
│ │ │ ├── ipc_debug.h
│ │ │ ├── ipc_process_skeleton.h
│ │ │ ├── ipc_thread_pool.h
│ │ │ ├── ipc_thread_skeleton.h
│ │ │ ├── ipc_workthread.h
│ │ │ └── stub_refcount_object.h
│ │ └── source
│ │ ├── buffer_object.cpp
│ │ ├── comm_auth_info.cpp
│ │ ├── databus_session_callback.cpp
│ │ ├── dbinder_callback_stub.cpp
│ │ ├── dbinder_session_object.cpp
│ │ ├── ipc_file_descriptor.cpp
│ │ ├── ipc_object_proxy.cpp
│ │ ├── ipc_object_stub.cpp
│ │ ├── ipc_process_skeleton.cpp
│ │ ├── ipc_skeleton.cpp
│ │ ├── ipc_thread_pool.cpp
│ │ ├── ipc_thread_skeleton.cpp
│ │ ├── ipc_workthread.cpp
│ │ ├── iremote_broker.cpp
│ │ ├── iremote_object.cpp
│ │ ├── message_option.cpp
│ │ ├── message_parcel.cpp
│ │ ├── peer_holder.cpp
│ │ └── stub_refcount_object.cpp
│ ├── mock
│ │ ├── include
│ │ │ ├── binder_connector.h
│ │ │ ├── binder_debug.h
│ │ │ ├── binder_invoker.h
│ │ │ ├── dbinder_base_invoker.h
│ │ │ ├── dbinder_databus_invoker.h
│ │ │ ├── hitrace_invoker.h
│ │ │ ├── invoker_factory.h
│ │ │ ├── invoker_rawdata.h
│ │ │ ├── iremote_invoker.h
│ │ │ └── sys_binder.h
│ │ └── source
│ │ ├── binder_connector.cpp
│ │ ├── binder_debug.cpp
│ │ ├── binder_invoker.cpp
│ │ ├── hitrace_invoker.cpp
│ │ ├── invoker_factory.cpp
│ │ ├── nvoker_rawdata.cpp
│ │ └── idbinder_databus_invoker.cpp
│ ├── jni
│ │ ├── include
│ │ │ ├── jni_helper.h
│ │ │ ├── jni_remote_object.h
│ │ │ ├── ohos_rpc_message_option.h
│ │ │ ├── ohos_rpc_message_parcel.h
│ │ │ └── ohos_rpc_remote_object.h
│ │ └── source
│ │ ├── jni_helper.cpp
│ │ ├── ohos_rpc_message_option.cpp
│ │ ├── ohos_rpc_message_parcel.cpp
│ │ └── ohos_rpc_remote_object.cpp
│ └── napi
│ ├── include
│ │ ├── napi_ashmem.h
│ │ ├── napi_message_option.h
│ │ ├── napi_message_parcel.h
│ │ └── napi_remote_object.h
│ └── src
│ ├── napi_ashmem.cpp
│ ├── napi_message_option.cpp
│ ├── napi_message_parcel.cpp
│ ├── napi_remote_object.cpp
│ └── napi_rpc_native_module.cpp

│ # dbinder服務(wù)的實(shí)現(xiàn)代碼【又分Lite類型系統(tǒng)和STD系統(tǒng)】
└── services
└── dbinder
│ # Lite類型系統(tǒng)的dbinder服務(wù)的實(shí)現(xiàn)代碼【LiteA系統(tǒng)不走dbinder】
├── c
│ ├── include
│ │ ├── dbinder_service_inner.h
│ │ ├── dbinder_stub.h
│ │ ├── dbinder_trans_callback.h
│ │ └── dbinder_types.h
│ ├── ipc_adapter
│ │ ├── include/dbinder_ipc_adapter.h
│ │ ├── mini/dbinder_ipc_adapter.c #【a】
│ │ └── small/dbinder_ipc_adapter.c #【c】
│ └── src
│ ├── dbinder_service.c #【a+c】
│ ├── dbinder_stub.c #【a+c】
│ └── dbinder_trans_callback.c #【a+c】

│ # STD系統(tǒng)的dbinder服務(wù)的實(shí)現(xiàn)代碼
└── dbinder_service #【12】ohos_shared_library("libdbinder")
├── include
│ ├── dbinder_death_recipient.h
│ ├── dbinder_log.h
│ ├── dbinder_remote_listener.h
│ └── dbinder_sa_death_recipient.h
└── src
├── dbinder_death_recipient.cpp
├── dbinder_sa_death_recipient.cpp
├── dbinder_service.cpp
├── dbinder_service_stub.cpp
└── socket/dbinder_remote_listener.cpp

從上面的整理可以看出,Lite類型系統(tǒng)和STD系統(tǒng),各有一套自己的IPC/RPC的實(shí)現(xiàn)代碼。因?yàn)楫?dāng)前目標(biāo)是要研究標(biāo)準(zhǔn)系統(tǒng)的dmsfwk組件(和samgr等其他組件),所以我們當(dāng)前的重點(diǎn)是上文中的編譯目標(biāo)【10】【11】【12】。

通過(guò)對(duì)比【10-ipc_core】和【11-ipc_single】?jī)蓚€(gè)編譯目標(biāo)的BUILD.gn文件,可以認(rèn)為【11】是【10】的子集,因?yàn)椋?/p>

  1. 目標(biāo)【10】沒(méi)有定義CONFIG_IPC_SINGLE,目標(biāo)【11】是有定義的。在部分共用的源代碼文件中,有使用 #ifndef CONFIG_IPC_SINGLE 控制的代碼,是目標(biāo)【10】專用的。
  2. 目標(biāo)【10】比目標(biāo)【11】多編譯幾個(gè)文件,是與DBinder、DataBus相關(guān)的,用于RPC。

目前還沒(méi)有非常確定【10】【11】各自的應(yīng)用場(chǎng)景有多大的差別,但我的理解偏向于Stub/Server端多依賴【10】,而Proxy/Client端多依賴【11】,或者分布式SA多依賴【10】,普通SA多依賴【11】(有待后面有更多的理解后確認(rèn))。

不管怎樣,【10】和【11】?jī)蓚€(gè)目標(biāo)的代碼是共用的,都屬于IPC范疇,可以一并閱讀理解?!?2】則屬于RPC范圍,再單獨(dú)閱讀理解。至于Lite類型系統(tǒng)的編譯目標(biāo),待以后有空研究的時(shí)候再補(bǔ)充相關(guān)總結(jié)。

2、基于Binder驅(qū)動(dòng)的IPC(基于3.1 Release分支)

ipc組件根目錄下的README.md文件中有提到:

IPC(Inter-Process Communication)與RPC(Remote Procedure Call)機(jī)制用于實(shí)現(xiàn)跨進(jìn)程通信,不同的是前者使用Binder驅(qū)動(dòng),用于設(shè)備內(nèi)的跨進(jìn)程通信,而后者使用軟總線驅(qū)動(dòng),用于跨設(shè)備跨進(jìn)程通信。IPC和RPC通常采用客戶端-服務(wù)器(Client-Server)模型,服務(wù)請(qǐng)求方(Client)可獲取提供服務(wù)提供方(Server)的代理 (Proxy),并通過(guò)此代理讀寫數(shù)據(jù)來(lái)實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)通信。通常,系統(tǒng)能力(System Ability)Server側(cè)會(huì)先注冊(cè)到系統(tǒng)能力管理者(System Ability Manager,縮寫SAMgr)中,SAMgr負(fù)責(zé)管理這些SA并向Client提供相關(guān)的接口。Client要和某個(gè)具體的SA通信,必須先從SAMgr中獲取該SA的代理,然后使用代理和SA通信。

熟悉Android系統(tǒng)或者做過(guò)OHOS系統(tǒng)移植的小伙伴,即使沒(méi)有非常深入理解過(guò)Binder,但估計(jì)也會(huì)經(jīng)常聽(tīng)到基于Binder驅(qū)動(dòng)的IPC機(jī)制。

內(nèi)核態(tài)的Binder驅(qū)動(dòng)實(shí)現(xiàn)代碼,在 //kernel/linux/linux-5.10/drivers/android/ 目錄下。在編譯Linux內(nèi)核時(shí),通過(guò) //kernel/linux/config/linux-5.10/arch/arm(arm64)/configs/ 目錄下的 xxxx_defconfig 文件中的如下配置,將Binder驅(qū)動(dòng)模塊編譯進(jìn)內(nèi)核:

#
# Android
#
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
# CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set
# CONFIG_DAX is not set
CONFIG_NVMEM=y

Binder驅(qū)動(dòng)在內(nèi)核向用戶態(tài)進(jìn)程提供服務(wù);用戶態(tài)進(jìn)程通過(guò) open(“/dev/binder”) 和 ioctl() 來(lái)使用Binder服務(wù)實(shí)現(xiàn)IPC。

這中間其實(shí)要經(jīng)歷一些非常復(fù)雜的過(guò)程,建議小伙伴們自行搜索和理解Binder在內(nèi)核中實(shí)現(xiàn)IPC的原理和細(xì)節(jié),我現(xiàn)在還無(wú)法保證未來(lái)會(huì)做這方面的總結(jié)。

但本系列文章的下一篇,將會(huì)以全景圖的形式展示和講解OHOS的用戶態(tài)IPC框架的實(shí)現(xiàn)流程和細(xì)節(jié)。

3、基于DBinder驅(qū)動(dòng)的RPC(待定)

DBinder應(yīng)該是Distributed Binder的縮寫。

DBinder將會(huì)涉及軟總線的一些實(shí)現(xiàn)細(xì)節(jié),我先看看能理解得多深入,待有所理解后再寫總結(jié)。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??。

責(zé)任編輯:jianghua 來(lái)源: 51CTO開(kāi)源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2022-09-08 15:27:11

OHOSSafwk組件

2022-09-13 15:54:41

samgr鴻蒙

2022-06-10 14:37:24

鴻蒙操作系統(tǒng)

2021-11-23 15:35:05

鴻蒙HarmonyOS應(yīng)用

2021-09-26 10:22:41

鴻蒙HarmonyOS應(yīng)用

2022-04-02 20:45:04

Hi3516開(kāi)發(fā)板操作系統(tǒng)鴻蒙

2021-09-16 15:04:28

鴻蒙HarmonyOS應(yīng)用

2022-09-06 15:46:52

speexdsp鴻蒙

2022-10-12 15:14:08

開(kāi)機(jī)動(dòng)畫鴻蒙

2023-06-27 15:12:46

C++三方庫(kù)移植

2023-03-20 16:21:26

ADC數(shù)字轉(zhuǎn)換器

2023-02-01 16:28:30

Linux內(nèi)核鴻蒙

2022-09-15 14:56:12

GDB調(diào)試鴻蒙

2021-11-08 07:19:45

鴻蒙HarmonyOS應(yīng)用

2023-12-29 08:45:40

Python3.8鴻蒙解釋器

2022-02-16 16:01:02

Hi3516開(kāi)發(fā)板鴻蒙

2022-09-16 15:01:37

操作系統(tǒng)技術(shù)鴻蒙

2022-09-07 15:08:58

操作系統(tǒng)鴻蒙

2022-09-13 16:10:15

鴻蒙操作系統(tǒng)

2023-03-24 14:47:24

NAPI框架HDF框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日本在线视频一区二区 | 国产精品亚洲综合 | 亚洲一二三区精品 | 免费av直接看 | 在线观看成人小视频 | 成人特区 | 国产精品久久在线观看 | 久久成人一区 | 99热精品久久 | 日日操夜夜操视频 | 欧美精品在欧美一区二区 | 婷婷成人在线 | 伊人网伊人网 | 成人天堂噜噜噜 | 久久久久久国产精品免费免费狐狸 | 欧美一区二区久久 | 国产精品视屏 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 欧美一区二区在线视频 | 亚洲天堂一区二区 | 欧美一区二区在线 | 91精品国产综合久久婷婷香蕉 | 狠狠干2020| 日韩成人一区 | 老牛嫩草一区二区三区av | 国产小视频在线观看 | 久久99精品久久久久久国产越南 | 国产在视频一区二区三区吞精 | 国产在线一区二 | 国产一区二区电影 | 91香蕉| 在线免费观看视频你懂的 | 亚洲精品一区二区三区蜜桃久 | 狠狠的干狠狠的操 | 亚洲最大的成人网 | 国产1区2区 | 精品欧美一区二区三区久久久小说 | 国产精品一区在线观看 | 日韩精品一区二区在线观看 | 欧美视频第二页 | 在线国产中文字幕 |