Hi3861_WiFi IoT工程的一點(diǎn)理解
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
目錄
- 1. 關(guān)于工程本身
- 2. ohos_bundles
- 3.工程的目錄結(jié)構(gòu)
更新記錄:
1. 關(guān)于工程本身
老規(guī)矩,從0開始。
在Linux環(huán)境下的DevEco IDE下創(chuàng)建新工程“Hi3861_Wifiiot”,設(shè)置如下圖,點(diǎn)擊“創(chuàng)建”,會在Projs目錄生成默認(rèn)的工程。
全部文件都查看一遍,看上去只有 bundle.json 有點(diǎn)有用信息:
- {
- "name": "default",
- "version": "1.0.0",
- "description": "This is a default bundle",
- "publishAs": "source",
- "scripts": {
- "build": "make"
- },
- "dirs": {
- "headers": [
- "headers/*.h"
- ],
- "src": [
- "src/*.c"
- ],
- ".": "Makefile"
- },
- ........[省略]
- "dependencies": {},
- "devDependencies": {}
- }
按照 README.md的提示,執(zhí)行“hpm build”,生成了 bin/hello 和 bundle-lock.json,執(zhí)行“./bin/hello”打印“Hello world”,而bundle-lock.json則是空的。
至此,看上去工程跟鴻蒙系統(tǒng)/工程沒多少關(guān)系,其他文件都可以刪掉,唯獨(dú)“bundle.json”不能刪除,要是刪除這個(gè)文件的話,下面這步就會 install 失敗。
在DevEco IDE的HPM標(biāo)簽下找到“@ohos/wifi_iot”,選擇“Install to project”/“Hi3861_Wifiiot”。
安裝完成后,就在Hi3861_Wifiiot目錄下得到了
看上去很干凈的目錄,暫不用IDE一鍵編譯,先試試命令行下的“hpm build”
- lkz@ubuntu:~/Work/Projs/Hi3861_Wifiiot$ hpm build
- [WARN] - The license of @ohos/gn is gn LICENSE. Notice open-source risks.
- [WARN] - The license of @ohos/gcc_riscv32 is GPL V2. Notice open-source risks.
- [WARN] - The license of @ohos/wifi_iot is NA. Notice open-source risks.
- Building: default
- make: *** No targets specified and no makefile found. Stop. //可能是我刪掉了makefile的緣故
- Build error: Worker stopped with exit code 2
- Check error details by "/home/lkz/.hpm/log/debug/debug.2021-04-24-15-40-57.log"
- lkz@ubuntu:~/Work/Projs/Hi3861_Wifiiot$ ln -s build/lite/build.py build.py
- lkz@ubuntu:~/Work/Projs/Hi3861_Wifiiot$ python build.py wifiiot
- [197/197] STAMP obj/vendor/hisi/hi3861/hi3861/run_wifiiot_scons.stamp
- ohos wifiiot build success!
out目錄下也有正常的輸出。
2. ohos_bundles
Hi3861_Wifiiot項(xiàng)目下,很明顯比鴻蒙系統(tǒng)完整代碼的目錄多了一個(gè)ohos_bundles文件夾和三個(gè)json文件,我也注意到在上一步的“Install to project”/“Hi3861_Wifiiot”時(shí),工程目錄下最先生成ohos_bundles目錄。
下面分別看看三個(gè)json文件和ohos_bundles目錄都有什么東西。
bundle.json
看上去比“Install to project”前,多了一點(diǎn)東西:
- "base": {
- "name": "@ohos/wifi_iot",
- "version": "^1.0.3"
- },
bundle-lock.json
看上去列出了本工程所有的組件共計(jì)24個(gè)壓縮包的下載地址和checksum,最后一個(gè)"@ohos/wifi_iot"還列出了這個(gè)組件依賴于上面的所有組件。
product.template.json
- "ohos_version": "OpenHarmony 1.0",
- "board": "hi3861v100",
- "kernel": "liteos_riscv",
- "compiler": "gcc",
- "subsystem": [],
- "vendor_adapter_dir": "//vendor/hisi/hi3861/hi3861_adapter",
- "third_party_dir": "//vendor/hisi/hi3861/hi3861/third_party",
很明顯的信息。不過為什么要特別列出 "vendor_adapter_dir"?有什么特別的作用嗎?還不清楚。
ohos_bundles/@ohos/目錄
很明顯這是全工程24個(gè)組件的獨(dú)立目錄。
隨便進(jìn)入build看一下,熟悉的就不說了,看一下bundle.json:
- {
- "name": "@ohos/build",
- "version": "1.0.1",
- "publishAs": "code-segment",
"description": "編譯構(gòu)建提供了一個(gè)在GN與ninja基礎(chǔ)上的編譯構(gòu)建框架。
支持以下功能:構(gòu)建不同芯片平臺的產(chǎn)品。如:Hi3518EV300平臺的ipcamera產(chǎn)品,
Hi3516DV300平臺的ipcamera產(chǎn)品,Hi3861平臺的wifi模組產(chǎn)品。
構(gòu)建HPM包管理配置生成的自定義產(chǎn)品。",
- "scripts": {
- "install": "DEST_PATH=${DEP_BUNDLE_BASE}/build &&mkdir -p $DEST_PATH && cp -r ./* $DEST_PATH"
- },
- "keywords": [
- "build"
- ],
- "license": "Apache V2",
- "repository": "",
- "homepage": "",
- "tags": [
- "build"
- ],
- "ohos": {
- "os": "1.0.0",
- "kernel": "liteos-a,liteos-m",
- "board": "hi3516,hi3518,hi3861"
- }
看上去都是很直白的,就“scripts”這個(gè),看上去就是要執(zhí)行腳本命令。
DEP_BUNDLE_BASE應(yīng)該是部署bundle的base目錄,也就是項(xiàng)目Hi3861_Wifiiot目錄本身。
在Hi3861_Wifiiot/build目錄下遞歸創(chuàng)建子目錄,把當(dāng)前目錄下的所有東西全部遞歸拷貝到Hi3861_Wifiiot/build目錄下。
所以Hi3861_Wifiiot/build目錄就是 Hi3861_Wifiiot/ohos_bundles/@ohos/build 目錄的拷貝。
類似的,其他組件基本上也都是這么個(gè)情況,至于它們分別拷貝到代碼根目錄下的什么地方,請自己去仔細(xì)查看bundle.json進(jìn)行梳理。
不過三個(gè)組件有點(diǎn)例外:gcc_riscv32、gn、ninja。這三個(gè)是屬于構(gòu)建編譯系統(tǒng)的,他們的bundle.json的共同點(diǎn)都是去執(zhí)行scripts目錄下的install.sh腳本,先去倉庫地址下載壓縮包,然后解壓到同目錄下。
前面提到“@ohos/wifi_iot”是依賴于其余23個(gè)組件的,就必須要仔細(xì)看一下它的bundle.json,果然:
- "scripts": {
- "dist": "export PATH=$PATH:${DEP_OHOS_gcc_riscv32}/gcc_riscv32/bin: ${DEP_OHOS_gn}/gn:${DEP_OHOS_ninja}/ninja
- && hpm run parse && hpm run select && hpm run connect && hpm run compile",
- "parse": "node ./dist_scripts/parse_platform_hpm.js hi3861v100_liteos_riscv",
- "select": "node ./dist_scripts/select_product.js",
- "connect": "node ./dist_scripts/connect_subsystem.js wifiiot",
- "compile": "ln -sf ${DEP_BUNDLE_BASE}/build/lite/build.py ${DEP_BUNDLE_BASE}/build.py &&
- cd ${DEP_BUNDLE_BASE} &&python ${DEP_BUNDLE_BASE}/build.py wifiiot",
- "install": "cp product.template.json ${DEP_BUNDLE_BASE}",
- "eco": "echo $target"
- },
先把三個(gè)構(gòu)建編譯工具所在目錄的bin添加到環(huán)境變量中,再執(zhí)行parse、select、connect、compile命令,前三個(gè)命令的腳本都在當(dāng)前目錄的dist_scripts內(nèi),而compile命令則是在代碼根目錄下先創(chuàng)建build.py的軟鏈接,再切換到根目錄下執(zhí)行python build.py wifiiot開始構(gòu)建和編譯。根據(jù)《鴻蒙系統(tǒng)的編譯流程及分析》一文中提到的Gn+Ninja的工作原理和步驟,會先去把它所依賴的23個(gè)組件都編譯好,最終生成用于燒錄開發(fā)板的bin文件。
這就很明白了。
3.工程的目錄結(jié)構(gòu)
我在《鴻蒙系統(tǒng)的編譯流程及分析》(Link: https://harmonyos.51cto.com/posts/4070)一文中大致整理了一下鴻蒙系統(tǒng)的build、out目錄結(jié)構(gòu),整個(gè)鴻蒙系統(tǒng)的目錄結(jié)構(gòu)太復(fù)雜了,我的理解還不到位,沒法整理出來。不過這個(gè)Hi3861_Wifiiot工程,是經(jīng)過hpm裁剪了的,總共才24個(gè)組件,內(nèi)核也簡單了很多,再加上這段時(shí)間我調(diào)試Hi3861的開發(fā)板,對工程內(nèi)文件/代碼有了一點(diǎn)點(diǎn)了解,也到了做一次整理的時(shí)候了,所以我又整理出了下面這個(gè)表格。粗淺的理解,希望能對大家有所幫助,更詳細(xì)的信息,還是需要各位自己去看README和讀代碼,能親自在開發(fā)板上調(diào)試效果會更好。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)