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

由一個(gè)編譯參數(shù)引發(fā)的Gn構(gòu)建依賴圖譜查詢

系統(tǒng) OpenHarmony
本篇真實(shí)記錄了一次出現(xiàn)問題,排查問題,解決問題并進(jìn)行深層次思考的過程,最后通過不斷的查找資料,找到了一個(gè)可以瞬間生成依賴樹的強(qiáng)大工具,為以后解決問題提供了一種思路。

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

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

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

起因

事情的起因是這樣子的,在給學(xué)生上課的時(shí)候,想演示一下kv存儲(chǔ)(小熊派nano開發(fā)板),代碼版本??master??,結(jié)果發(fā)現(xiàn)編譯竟然出錯(cuò)了,錯(cuò)誤提示如下:

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

顯示的是在鏈接階段沒有找到如opendir,closedir等符號(hào),這顯然就是kv_store庫編譯有問題。

原因及措施

經(jīng)過幾分鐘的查找,最后發(fā)現(xiàn)是kv_store庫的gn文件里面默認(rèn)給了這個(gè)參數(shù):

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

這個(gè)參數(shù)一加,我們kv的編譯就會(huì)使用posix相關(guān)的接口去實(shí)現(xiàn),而在3861里面應(yīng)該是沒有實(shí)現(xiàn)posix相關(guān)的文件接口,所以導(dǎo)致鏈接的時(shí)候出現(xiàn)opendir等等通不過,那么將這個(gè)參數(shù)置false再編譯試試看:

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

不出意外的編譯成功了,說明問題出在這里。

隱患

你以為問題到這里就完了嗎,當(dāng)然,如果只是以解決問題作為目的,我們當(dāng)前確實(shí)已經(jīng)達(dá)到目的了。
作為一個(gè)自律的工程師,我們知道:我們?cè)谧鰬?yīng)用的時(shí)候不應(yīng)該做侵入式修改,什么是侵入式修改呢:

一句話概括就是,你的代碼需要依賴框架的代碼,如果把框架拿掉或者換一個(gè)框架,就需要重新修改代碼。

也就是說:kv是openharmony里面的一個(gè)組件,我們使用openharmony的代碼框架的時(shí)候如果碰到問題,是不能通過侵入式修改達(dá)到目的的,因?yàn)檫@樣會(huì)破壞原有的代碼邏輯,假如后面如果有其他項(xiàng)目要使用這個(gè)代碼的話,就可能會(huì)出現(xiàn)問題,有時(shí)候甚至?xí)菫?zāi)難性的后果.
而且,侵入式修改有一個(gè)問題是:如果sdk或框架升級(jí),往往意味著要在新的sdk或者框架上進(jìn)行修改,當(dāng)這種修改多起來的話工作量也是非常大的,如果沒有準(zhǔn)確的文檔進(jìn)行check,往往不能修改成功。

非侵入修改

那么不能用侵入式修改,又想達(dá)到正確編譯kv庫的目的,要怎么做呢,有一個(gè)辦法是使用gn的args,使用方法如下:

hb build -f --gn-args enable_ohos_utils_native_lite_kv_store_use_posix_kv_api=false這種方法會(huì)強(qiáng)制覆蓋代碼中的已聲明的變量,同樣能達(dá)到編譯通過的辦法。

那么這種方法有什么缺點(diǎn)嗎:當(dāng)然有,就是每次編譯都需要帶上長長的一串東西,且不說記不記得住吧,使用起來也是非常的不方便。

另外一種方法就是:在vendor對(duì)應(yīng)的目錄下的config.json里,對(duì)應(yīng)的組件內(nèi)feature添加對(duì)應(yīng)的參數(shù)聲明,這一種方式,在產(chǎn)品的readme文檔里也有介紹,比如:

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

比如我們現(xiàn)在是在編譯bearpi_hm_nano,那么我們只需要在vendor/bearpi/bearpi_hm_nano/config.json里面編輯,把kv_store庫添加對(duì)應(yīng)的參數(shù)即可,這里不知道是bug還是gn的原理就是這樣,我們不需要找到kv_store真正的庫聲明位置,而是隨便一個(gè)地方加上"enable_ohos_utils_native_lite_kv_store_use_posix_kv_api=false"就可以正常編譯通過了,比如:

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

這樣再編譯就成功了。

探究一下原理,在gn進(jìn)行build的時(shí)候,會(huì)在out目錄下生成一個(gè)args.gn文件,這個(gè)文件里保存了所有需要用到的args,如:

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

這里的args都是順序排列的,在gn進(jìn)行構(gòu)建的時(shí)候會(huì)讀取里面所有的參數(shù)。

另外一個(gè)問題

kv_store是什么時(shí)候調(diào)用并編譯的?到這里問題應(yīng)該就解決了,但是剛剛我發(fā)現(xiàn)另外一個(gè)問題,在添加feature的時(shí)候我們并沒有找到kv_store在config.json文件里顯示聲明組件,那么到底是在什么時(shí)候kv_store參與編譯了呢?
這里是config.json的內(nèi)容:

{
"product_name": "bearpi_hm_nano",
"type": "mini",
"version": "3.0",
"ohos_version": "OpenHarmony 1.1.0",
"device_company": "bearpi",
"device_build_path": "device/board/bearpi/bearpi_hm_nano",
"board": "bearpi_hm_nano",
"kernel_type": "liteos_m",
"kernel_is_prebuilt": true,
"kernel_version": "",

"subsystems": [

{
"subsystem": "iothardware",
"components": [
{ "component": "peripheral", "features":[] }
]
},
{
"subsystem": "hiviewdfx",
"components": [
{ "component": "hilog_lite", "features":[] },
{ "component": "hievent_lite", "features":[] },
{ "component": "blackbox", "features":[] },
{ "component": "hidumper_mini", "features":[] }
]
},
{
"subsystem": "systemabilitymgr",
"components": [
{ "component": "samgr_lite", "features":[] }
]
},
{
"subsystem": "security",
"components": [
{ "component": "device_auth", "features":[] },
{ "component": "huks", "features":
[
"disable_huks_binary = false",
"disable_authenticate = false",
"huks_use_lite_storage = true",
"huks_use_hardware_root_key = true",
"huks_config_file = \"hks_config_lite.h\"",
"ohos_security_huks_mbedtls_porting_path = \"http://device/soc/hisilicon/hi3861v100/sdk_liteos/third_party/mbedtls\""
]
}
]
},
{
"subsystem": "startup",
"components": [
{ "component": "bootstrap_lite", "features":[] },
{ "component": "init_lite", "features":
[
"enable_ohos_startup_init_feature_begetctl_liteos=true",
"enable_ohos_startup_init_lite_use_thirdparty_mbedtls = false"
]
}
]
},
{
"subsystem": "communication",
"components": [
{ "component": "wifi_lite", "features":[] },
{ "component": "dsoftbus", "features":[] },
{ "component": "wifi_aware", "features":[]}
]
},
{
"subsystem": "updater",
"components": [
{ "component": "ota_lite", "features":[] }
]
},
{
"subsystem": "commonlibrary",
"components": [
{ "component": "file", "features":[] }
]
},
{
"subsystem": "xts",
"components": [
{ "component": "xts_acts", "features":
[
"enable_ohos_test_xts_acts_use_thirdparty_lwip = false"
]
},
{ "component": "xts_tools", "features":[] }
]
}
],
"third_party_dir": "http://device/soc/hisilicon/hi3861v100/sdk_liteos/third_party",
"product_adapter_dir": "http://vendor/bearpi/bearpi_hm_nano/hals"
}

找了一圈,并沒有找到kv相關(guān)的庫,看來kv_store是由別的子系統(tǒng)或組件庫依賴的。

那是由誰依賴的呢?

#查找依賴kv_store的庫或組件。

首先,一個(gè)庫被依賴通常會(huì)寫在gn的deps列表內(nèi),比如這種:

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

如果還不明白,建議找?guī)灼猤n相關(guān)的文章看看就懂了。

現(xiàn)在的辦法就是一層一層的找到是誰調(diào)用的kv_store庫,回到之前編譯出錯(cuò)的地方:

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

可以看到有一個(gè)名為utils_kv_store的lib文件,先找一下:?

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

然后再去找由誰依賴了utils_kv_store。

現(xiàn)在問題出來了,openharmony里面這么多代碼,如果每一個(gè)庫都要這樣不停的搜索相關(guān)字才能找到最終依賴的地方,效率低不說,還容易出錯(cuò),而且很容易跟著就跟丟了,這是因?yàn)槿说挠洃浟Ξ吘褂邢?函數(shù)調(diào)用太多層就會(huì)丟失路徑,這也就是為什么人類下棋永遠(yuǎn)下不過電腦。

請(qǐng)出神器

這時(shí)候就輪到了我們gn desc這個(gè)神器出廠了,我們先來看一下效果,這是依靠gn desc生成的依賴樹信息:

//out/bearpi_hm_nano/bearpi_hm_nano/build_configs/device_bearpi_hm_nano/device_bearpi_hm_nano:device_bearpi_hm_nano_info
//device/soc/hisilicon/hi3861v100:hi3861v100
//device/soc/hisilicon/hi3861v100/sdk_liteos:run_wifiiot_scons
//base/security/device_auth/frameworks/deviceauth_lite:hichainsdk
//base/security/device_auth/frameworks/deviceauth_lite/source:hichainsdk
//base/security/huks/interfaces/innerkits/huks_lite:huks_3.0_sdk
//base/security/huks/interfaces/innerkits/huks_lite:huks_3.0_sdk__notice
//third_party/musl:sysroot_lite
//third_party/mbedtls:mbedtls_static
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//build/lite:ohos
//base/hiviewdfx/blackbox:blackbox
//third_party/musl:sysroot_lite
//base/hiviewdfx/hidumper_lite/mini:hidumper_mini
//third_party/musl:sysroot_lite
//base/hiviewdfx/hievent_lite:hievent_lite
//base/hiviewdfx/hievent_lite:hievent_lite_static
//base/hiviewdfx/hiview_lite:hiview_lite
//base/hiviewdfx/hiview_lite:hiview_lite_static
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//base/hiviewdfx/hilog_lite/frameworks/mini:hilog_lite
//base/hiviewdfx/hilog_lite/frameworks/mini:hilog_lite_static
//base/hiviewdfx/hiview_lite:hiview_lite...
//third_party/musl:sysroot_lite
//base/iothardware/peripheral:iothardware
//device/soc/hisilicon/hi3861v100/hi3861_adapter/hals/iot_hardware/wifiiot_lite:hal_iothardware
//third_party/musl:sysroot_lite
//base/security/device_auth:deviceauth_build
//base/security/device_auth/services:deviceauth
//base/hiviewdfx/hilog_lite/frameworks/mini:hilog_lite...
//base/security/device_auth/deps_adapter:deviceauth_hal_liteos
//base/hiviewdfx/hilog_lite/frameworks/mini:hilog_lite...
//base/security/huks/interfaces/innerkits/huks_lite:huks_3.0_sdk...
//base/startup/init/interfaces/innerkits:libbegetutil
//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_static
//third_party/bounds_checking_function:libsec_static
//third_party/musl:sysroot_lite
//base/startup/init/interfaces/hals/utils/sys_param:hal_sys_param
//third_party/musl:sysroot_lite
//base/startup/init/services/log:init_log
//third_party/musl:sysroot_lite
//base/startup/init/services/modules/init_hook:inithook
//third_party/musl:sysroot_lite
//base/startup/init/services/param/liteos:param_client_lite
//base/startup/init/services/param/liteos:lite_ohos_param_to
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//base/startup/init/services/utils:libinit_utils
//third_party/musl:sysroot_lite
//third_party/bounds_checking_function:libsec_static
//third_party/musl:sysroot_lite
//vendor/bearpi/bearpi_hm_nano/hals/utils/sys_param:hal_sysparam
//third_party/musl:sysroot_lite
//build/lite/config/component/cJSON:cjson_shared
//commonlibrary/utils_lite:utils
//commonlibrary/utils_lite/file:file
//commonlibrary/utils_lite/file:native_file
//commonlibrary/utils_lite/hals/file:static_hal_file
//commonlibrary/utils_lite/hals/file:static_hal_file__notice
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//device/soc/hisilicon/hi3861v100/hi3861_adapter/hals/utils/file:hal_file_static
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//foundation/distributeddatamgr/kv_store/interfaces/inner_api/kv_store:kv_store
//foundation/distributeddatamgr/kv_store/interfaces/inner_api/kv_store:utils_kv_store
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//build/lite/config/component/cJSON:cjson_shared
//commonlibrary/utils_lite:utils...
//foundation/communication/dsoftbus/sdk:softbus_client
//foundation/communication/dsoftbus/adapter:softbus_adapter
//base/hiviewdfx/hilog_lite/frameworks/mini:hilog_lite...
//third_party/mbedtls:mbedtls
//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party/mbedtls:mbedtls
//third_party/musl:sysroot_lite
//foundation/communication/dsoftbus/core/common:softbus_utils
//base/hiviewdfx/hilog_lite/frameworks/mini:hilog_lite...
//build/lite/config/component/cJSON:cjson_static
//third_party/musl:sysroot_lite
//foundation/communication/dsoftbus/adapter:softbus_adapter...
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//base/security/device_auth:deviceauth_sdk_build
//base/security/device_auth:deviceauth_service_build
//base/security/device_auth/frameworks/deviceauth_lite:hichainsdk...
//base/security/huks:fwk_group
//base/security/huks/frameworks/huks_lite:huks_sdk
//base/security/huks/interfaces/innerkits/huks_lite:huks_3.0_sdk...
//base/security/huks/test:unittest
//base/security/huks:service_group
//base/startup/bootstrap_lite/services/source:bootstrap
//third_party/musl:sysroot_lite
//base/startup/init/services:startup_init
//base/startup/init/services/begetctl:begetctl_cmd
//base/startup/init/services/loopevent:loopeventgroup
//base/startup/init/services/modules:modulesgroup
//base/startup/init/services/param:parameter
//base/startup/init/ueventd:startup_ueventd
//base/startup/init/watchdog:watchdog
//base/update/ota_lite/frameworks:ota_lite
//base/update/ota_lite/frameworks/source:hota
//base/startup/init/interfaces/innerkits:libbegetutil...
//device/soc/hisilicon/hi3861v100/hi3861_adapter/hals/update:hal_update_static
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//commonlibrary/utils_lite/file:file...
//foundation/communication/dsoftbus:dsoftbus
//foundation/communication/dsoftbus/core:softbus_server
//foundation/communication/dsoftbus/adapter:softbus_adapter...
//foundation/communication/dsoftbus/core/common:softbus_utils...
//foundation/communication/dsoftbus/core/frame:softbus_server_frame
//base/security/device_auth/services:deviceauth...
//base/security/huks/interfaces/innerkits/huks_lite:huks_3.0_sdk...
//base/startup/init/interfaces/innerkits:libbegetutil...
//build/lite/config/component/cJSON:cjson_static...
//build/lite/config/component/cJSON:cjson_static...
//foundation/communication/dsoftbus/adapter:softbus_adapter...
//foundation/communication/dsoftbus/components/nstackx/nstackx_ctrl:nstackx_ctrl
//foundation/communication/dsoftbus/components/nstackx/nstackx_util:nstackx_util.open
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//foundation/communication/dsoftbus/core/common:softbus_utils...
//third_party/musl:sysroot_lite
//foundation/communication/dsoftbus/sdk:softbus_client...
//foundation/communication/dsoftbus/tests:softbus_test
//foundation/communication/wifi_aware:wifiaware
//device/soc/hisilicon/hi3861v100/hi3861_adapter/hals/communication/wifi_lite/wifiaware:hal_wifiaware
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//foundation/communication/wifi_lite:wifi
//foundation/systemabilitymgr/samgr_lite:samgr
//foundation/systemabilitymgr/samgr_lite/communication/broadcast:broadcast
//third_party/musl:sysroot_lite
//foundation/systemabilitymgr/samgr_lite/samgr:samgr
//foundation/systemabilitymgr/samgr_lite/samgr/adapter:samgr_adapter
//third_party/musl:sysroot_lite
//foundation/systemabilitymgr/samgr_lite/samgr/source:samgr_source
//foundation/systemabilitymgr/samgr_lite/samgr/adapter:samgr_adapter...
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite
//device/soc/hisilicon/hi3861v100/sdk_liteos:sdk
//build/lite/config/component/cJSON:cjson_static...
//build/lite/config/component/cJSON:cjson_static...
//device/soc/hisilicon/hi3861v100/hi3861_adapter/hals/communication/wifi_lite/wifiservice:wifiservice
//third_party/musl:sysroot_lite
//device/soc/hisilicon/hi3861v100/hi3861_adapter/hals/communication/wifi_lite/wifiservice:wifiservice...
//device/soc/hisilicon/hi3861v100/hi3861_adapter/kal:kal
//device/soc/hisilicon/hi3861v100/hi3861_adapter/kal/cmsis:cmsis
//third_party/musl:sysroot_lite
//device/soc/hisilicon/hi3861v100/hi3861_adapter/kal/posix:posix
//third_party/musl:sysroot_lite
//device/soc/hisilicon/hi3861v100/hi3861_adapter/kal:kal...
//third_party/musl:sysroot_lite
//third_party/musl:sysroot_lite

看起來有點(diǎn)亂,沒關(guān)系,主要我們根據(jù)這個(gè)樹狀結(jié)構(gòu)找到我們所有的依賴,有了這樣的依賴關(guān)系之后,我們?nèi)绻胍檎夷硟蓚€(gè)模塊的關(guān)系就非常簡單了,以我們剛剛說了kv_store為例:

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

#創(chuàng)作者激勵(lì)#由一個(gè)編譯參數(shù)引發(fā)的gn構(gòu)建依賴圖譜查詢-開源基礎(chǔ)軟件社區(qū)

可以看到很輕松就找到了kv_store是怎么被一層一層依賴的了,而且通過關(guān)系圖可以得知kv_store竟然是由device_auth引入的,那么這個(gè)工具的意義就在于:有了依賴樹,以后出現(xiàn)依賴相關(guān)的問題都可以通過它快速分析并定位問題了。

看到這里是不是好心動(dòng),是不是想學(xué)習(xí)一下怎么用呢?

只需要在命令行輸入gn help desc就能得知用法了:

root@346a62050f11:/home/openharmony# gn help desc
gn desc

gn desc <out_dir> <label or pattern> [<what to show>] [--blame]
[--format=json]

Displays information about a given target or config. The build parameters
will be taken for the build in the given <out_dir>.

The <label or pattern> can be a target label, a config label, or a label
pattern (see "gn help label_pattern"). A label pattern will only match
targets.
...

其中 <out_dir>就是我們編譯的輸出目錄
<label or pattern> 可以是一個(gè)目標(biāo)標(biāo)簽,配置標(biāo)簽,或者一個(gè)匹配模式標(biāo)簽。只有匹配成功的才會(huì)顯示。
<what to show> 包括如下(如果不指定,默認(rèn)顯示):

all_dependent_configs
allow_circular_includes_from
arflags [–blame] args
cflags [–blame]
cflags_c [–blame]
cflags_cc [–blame]
check_includes
configs [–tree] (see below)
data_keys
defines [–blame]
depfile
deps [–all] [–tree] (see below)
framework_dirs
frameworks
include_dirs [–blame]
inputs ldflags [–blame]
lib_dirs libs
metadata
output_conversion
outputs
public_configs
public
rebase
script
sources
testonly
visibility
walk_keys
weak_frameworks
runtime_deps
[–format=json] 以JSON的格式輸出。

根據(jù)以上提示,我們制作查詢語句:root@346a62050f11:/home/openharmony# gn desc out/bearpi_hm_nano/bearpi_hm_nano //out/bearpi_hm_nano/bearpi_hm_nano/build_configs/device_bearpi_hm_nano/device_bearpi_hm_nano:device_bearpi_hm_nano --tree ,即可得到依賴樹等內(nèi)容。

總結(jié)

本篇真實(shí)記錄了一次出現(xiàn)問題,排查問題,解決問題并進(jìn)行深層次思考的過程,最后通過不斷的查找資料,找到了一個(gè)可以瞬間生成依賴樹的強(qiáng)大工具,為以后解決問題提供了一種思路。
希望各位熱愛學(xué)習(xí)的朋友,能夠沉心靜氣,耐住寂寞,永不言棄,因?yàn)橹挥薪?jīng)過這樣的過程,技術(shù)才能得到精進(jìn),然后總結(jié)出自己的學(xué)習(xí)套路,學(xué)習(xí)有一萬種方法,最重要的是行動(dòng)。

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

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

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

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

2017-08-25 16:38:05

表達(dá)式正則血案

2019-02-27 08:26:06

算法大數(shù)據(jù)社交

2021-07-27 07:12:11

Getter接口Setter

2011-11-25 13:04:43

空格usr

2009-03-13 16:39:16

Linux開源改變

2013-12-19 09:58:36

移動(dòng)應(yīng)用產(chǎn)品市場

2021-12-01 06:59:27

架構(gòu)

2024-02-28 08:12:25

SSE接口代理

2010-11-04 09:11:34

Fedora 14評(píng)測

2010-05-14 00:19:43

2015-02-04 14:36:07

格式串漏洞Ghost漏洞安全漏洞

2013-03-05 10:05:52

2021-07-24 13:11:19

Redis數(shù)據(jù)技術(shù)

2024-08-20 21:27:04

docker部署容器

2011-04-27 10:02:54

兼容墨盒用戶體驗(yàn)

2024-01-11 16:02:38

OHOS依賴關(guān)系檢查編譯構(gòu)建系統(tǒng)

2011-06-10 10:11:44

2022-11-07 19:08:28

transform屬性瀏覽器

2021-06-06 16:15:57

地區(qū)接口項(xiàng)目

2022-04-17 10:04:32

HerokuPaaSPorter
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 久久精品亚洲精品国产欧美 | 成人午夜在线视频 | 一级片网址 | 91最新视频 | 九九热久久免费视频 | 在线观看a视频 | 最新一级毛片 | 午夜a v电影 | 日韩二三区 | 永久av| 国产国语精品 | 精品国产精品一区二区夜夜嗨 | 黄网站在线观看 | 日韩在线精品视频 | 成人h动漫亚洲一区二区 | 五月免费视频 | 国产999精品久久久久久绿帽 | 日韩在线免费视频 | 91高清免费观看 | 久久国产免费看 | 一区二区不卡 | av片免费 | 91国语清晰打电话对白 | 狠狠操婷婷 | 久久www免费人成看片高清 | 激情五月激情综合网 | 国产欧美在线视频 | 视频一区在线 | 亚洲逼院| 亚洲精品一区二区 | 鸳鸯谱在线观看高清 | 免费视频一区二区 | 日本欧美视频 | 久久久久国产精品一区 | 欧美日韩1区 | 国产一区精品 | 国产精品毛片无码 | 综合成人在线 | 91社影院在线观看 | 日韩在线免费视频 | 一区二区三区在线观看视频 |