產(chǎn)品配置規(guī)則
產(chǎn)品解決方案為基于開發(fā)板的完整產(chǎn)品,主要包含產(chǎn)品對(duì)OS的適配、部件拼裝配置、啟動(dòng)配置和文件系統(tǒng)配置等。產(chǎn)品解決方案的源碼路徑規(guī)則為:vendor/{產(chǎn)品解決方案廠商}/{產(chǎn)品名稱} _。
產(chǎn)品解決方案的目錄樹規(guī)則如下:
vendor
└── company # 產(chǎn)品解決方案廠商
├── product # 產(chǎn)品名稱
│ ├── init_configs
│ │ ├── etc # init進(jìn)程啟動(dòng)配置(可選,僅linux內(nèi)核需要)
│ │ └── init.cfg # 系統(tǒng)服務(wù)啟動(dòng)配置
│ ├── hals # 產(chǎn)品解決方案OS適配
│ ├── BUILD.gn # 產(chǎn)品編譯腳本
│ └── config.json # 產(chǎn)品配置文件
│ └── fs.yml # 文件系統(tǒng)打包配置
└── ......
注意 :新增產(chǎn)品須按如上的規(guī)則創(chuàng)建目錄和文件,編譯構(gòu)建系統(tǒng)將按該規(guī)則掃描已配置的產(chǎn)品。
開發(fā)前請(qǐng)熟悉鴻蒙開發(fā)指導(dǎo)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]點(diǎn)擊或者復(fù)制轉(zhuǎn)到。
關(guān)鍵的目錄和文件詳細(xì)介紹如下:
vendor/company/product/init_configs/etc 該文件夾中包含rcS腳本,Sxxx腳本和fstab腳本。init進(jìn)程在啟動(dòng)系統(tǒng)服務(wù)之前執(zhí)行這些腳本。執(zhí)行的流程為“rcS->fstab->S00-xxx“。Sxxx腳本中的內(nèi)容與開發(fā)板和產(chǎn)品需要有關(guān),主要包括設(shè)備節(jié)點(diǎn)的創(chuàng)建、創(chuàng)建目錄、掃描設(shè)備節(jié)點(diǎn)、修改文件權(quán)限等等。這些文件在產(chǎn)品編譯的BUILD.gn中按需拷貝到產(chǎn)品out目錄中,最終打包到rootfs鏡像中。
vendor/company/product/init_configs/init.cfg init進(jìn)程啟動(dòng)服務(wù)的配置文件,當(dāng)前支持解析的命令有:
- start: 啟動(dòng)某個(gè)服務(wù)
- mkdir: 創(chuàng)建文件夾
- chmod: 修改指定路徑/文件的權(quán)限
- chown: 修改指定路徑/文件的屬組
- mount: 掛載命令
該文件中的各個(gè)字段的解釋如下:
{ "jobs" : [{ # job數(shù)組,一個(gè)job對(duì)應(yīng)一個(gè)命令集合。job的執(zhí)行順序:pre-init - > init - > post-init。 "name" : "pre-init", "cmds" : [ "mkdir /storage/data", # 創(chuàng)建目錄 "chmod 0755 /storage/data", # 修改權(quán)限,權(quán)限值的格式為0xxx, 如0755 "mkdir /storage/data/log", "chmod 0755 /storage/data/log", "chown 4 4 /storage/data/log", # 修改屬組,第一個(gè)數(shù)字為uid, 第二個(gè)數(shù)字為gid ...... "mount vfat /dev/mmcblock0 /sdcard rw,umask=000" # 掛載,格式為: mount [文件系統(tǒng)類型] [source] [target] [flags] [data] # 其中flags僅支持:nodev、noexec、nosuid和rdonly ] }, { "name" : "init", "cmds" : [ # 按cmds數(shù)組順序啟動(dòng)啟動(dòng)服務(wù) "start shell", # 注意:start與服務(wù)名稱之間有且只有一個(gè)空格 ...... "start service1" ] }, { "name" : "post-init", # 最后執(zhí)行的job, init進(jìn)程啟動(dòng)完成后的處理(如驅(qū)動(dòng)初始化后再mount設(shè)備) "cmds" : [] } ], "services" : [{ # service數(shù)組,一個(gè)service對(duì)應(yīng)一個(gè)進(jìn)程 "name" : "shell", # 服務(wù)名稱 "path" : ["/sbin/getty", "-n", "-l", "/bin/sh", "-L", "115200", "ttyS000", "vt100"], # 可執(zhí)行文件全路徑,path必須為第一個(gè)元素 "uid" : 0, # 進(jìn)程的uid,須與二進(jìn)制文件的uid保持一致 "gid" : 0, # 進(jìn)程的gid,須與二進(jìn)制文件的gid保持一致 "once" : 0, # 是否為一次性進(jìn)程,1:進(jìn)程退出后,init不在重新拉起。0:常駐進(jìn)程,進(jìn)程若退出,init將重新拉起 "importance" : 0, # 是否為關(guān)鍵進(jìn)程,1:是關(guān)鍵進(jìn)程,若進(jìn)程退出,init將會(huì)重啟單板。0:非關(guān)鍵進(jìn)程,若進(jìn)程退出,init不會(huì)重啟單板 "caps" : [4294967295] }, ...... ] }
vendor/company/product/init_configs/hals 解決方案廠商對(duì)OS的適配,需要實(shí)現(xiàn)的接口請(qǐng)見各個(gè)部件的readme說明文檔。
vendor/company/product/config.json config.json為編譯構(gòu)建的主入口,包含了開發(fā)板、OS部件和內(nèi)核等配置信息。
以基于hispark_taurus開發(fā)板的ipcamera產(chǎn)品為例,配置文件如下:{ "product_name": "ipcamera", # 產(chǎn)品名稱 "version": "3.0", # config.json的版本號(hào), 固定"3.0" "type": "small", # 系統(tǒng)類型, 可選[mini, small, standard] "ohos_version": "OpenHarmony 1.0", # 選擇的OS版本 "device_company": "hisilicon", # 芯片廠商 "board": "hispark_taurus", # 開發(fā)板名稱 "kernel_type": "liteos_a", # 選擇的內(nèi)核類型 "kernel_version": "3.0.0", # 選擇的內(nèi)核版本 "subsystems": [ { "subsystem": "aafwk", # 選擇的子系統(tǒng) "components": [ { "component": "ability", "features":[ "enable_ohos_appexecfwk_feature_ability = true" ] } # 選擇的部件和部件特性配置 ] }, { ...... } ...... 更多子系統(tǒng)和部件 } }
vendor/company/product/fs.yml 該文件用于配置文件系統(tǒng)鏡像制作過程,將編譯產(chǎn)物打包成文件系統(tǒng)鏡像,比如用戶態(tài)根文件系統(tǒng)rootfs.img和可讀寫的userfs.img。它由多個(gè)列表組成,每個(gè)列表對(duì)應(yīng)一個(gè)文件系統(tǒng)。字段說明如下:
fs_dir_name: 必填,聲明文件系統(tǒng)文件名, 如rootfs、userfs fs_dirs: 選填,配置out下文件目錄與文件系統(tǒng)文件目錄的映射關(guān)系,每個(gè)文件目錄對(duì)應(yīng)一個(gè)列表 source_dir: 選填,out下目標(biāo)文件目錄,若缺失則將根據(jù)target_dir在文件系統(tǒng)下創(chuàng)建空目錄 target_dir: 必填,文件系統(tǒng)下對(duì)應(yīng)文件目錄 ignore_files:選填,聲明拷貝忽略文件 dir_mode: 選填,文件目錄權(quán)限,默認(rèn)755 file_mode: 選填,該文件目錄下所有文件的權(quán)限,默認(rèn)555 fs_filemode: 選填,配置需要特殊聲明權(quán)限的文件,每個(gè)文件對(duì)應(yīng)一個(gè)列表 file_dir: 必填,文件系統(tǒng)下具體文件路徑 file_mode: 必填,文件權(quán)限聲明 fs_symlink: 選填,配置文件系統(tǒng)軟連接 fs_make_cmd: 必填,配置需要制作文件系統(tǒng)腳本,OS提供的腳本在build/lite/make_rootfs下, 支持linux,liteos內(nèi)核和ext4、jffs2、vfat格式。也支持芯片解決方案廠商自定義。 fs_attr: 選填,根據(jù)配置項(xiàng)動(dòng)態(tài)調(diào)整文件系統(tǒng)
其中fs_symlink、fs_make_cmd字段支持以下變量:
- rootpath代碼根目錄,對(duì)應(yīng)gn的{ohos_root_path}
- outpath產(chǎn)品out目錄,對(duì)應(yīng)gn的{root_out_dir}
- ${fs_dir} 文件系統(tǒng)目錄,由以下變量拼接而成
- ${root_path}
- ${fs_dir_name}
注意 :fs.yml是可選的,對(duì)于沒有文件系統(tǒng)的設(shè)備可不配置。
- vendor/company/product/BUILD.gn 產(chǎn)品編譯的入口,主要用于編譯解決方案廠商源碼和拷貝啟動(dòng)配置文件。如果某個(gè)產(chǎn)品被選擇為要編譯的產(chǎn)品,那么對(duì)應(yīng)產(chǎn)品目錄下的BUILD.gn會(huì)默認(rèn)編譯。一個(gè)典型的產(chǎn)品編譯BUILD.gn應(yīng)該如下:
group("product") { # target名稱需與product名稱即三級(jí)目錄名稱一致 deps = [] deps += [ "init_configs" ] # 拷貝init配置 ...... # 其他 }
新增并編譯產(chǎn)品
編譯構(gòu)建支持芯片解決方案和部件的靈活拼裝,形成定制化的產(chǎn)品解決方案。具體步驟如下:
創(chuàng)建產(chǎn)品目錄 按照產(chǎn)品配置規(guī)則創(chuàng)建產(chǎn)品目錄,以基于“rtl8720“開發(fā)板的wifiiot模組為例,在代碼根目錄執(zhí)行:
mkdir -p vendor/my_company/wifiiot
拼裝產(chǎn)品 在新建的產(chǎn)品目錄下新建config.json文件,以步驟1中的wifiiot為例,vendor/my_company/wifiiot/config.json可以是:
{ "product_name": "wifiiot", # 產(chǎn)品名稱 "version": "3.0", # config.json的版本號(hào), 固定"3.0" "type": "small", # 系統(tǒng)類型, 可選[mini, small, standard] "ohos_version": "OpenHarmony 1.0", # 使用的OS版本 "device_company": "realtek", # 芯片解決方案廠商名稱 "board": "rtl8720", # 開發(fā)板名稱 "kernel_type": "liteos_m", # 選擇的內(nèi)核類型 "kernel_version": "3.0.0", # 選擇的內(nèi)核版本 "subsystems": [ { "subsystem": "kernel", # 選擇的子系統(tǒng) "components": [ { "component": "liteos_m", "features":[] } # 選擇的部件和部件特性 ] }, ... { 更多子系統(tǒng)和部件 } ] }
注意 :編譯構(gòu)建系統(tǒng)編譯前會(huì)對(duì)device_company,board,kernel_type,kernel_version、subsystem、component字段進(jìn)行有效性檢查,其中device_company,board,kernel_type,kernel_version應(yīng)與已知的芯片解決方案匹配,subsystem、component應(yīng)與build/lite/components下的部件描述匹配。
適配OS接口 在產(chǎn)品目錄下創(chuàng)建hals目錄,并將產(chǎn)品解決方案對(duì)OS適配的源碼和編譯腳本放入該目錄下。
配置系統(tǒng)服務(wù) 在產(chǎn)品目錄下創(chuàng)建init_configs目錄,并在init_configs目錄下創(chuàng)建init.cfg文件,按需配置要啟動(dòng)的系統(tǒng)服務(wù)。
配置init進(jìn)程(僅linux內(nèi)核需要) 在init_configs目錄下創(chuàng)建etc目錄,然后在etc下創(chuàng)建init.d文件夾和fstab文件。最后按產(chǎn)品需求在init.d文件下創(chuàng)建并編輯rcS文件和Sxxx文件。
配置文件系統(tǒng)鏡像(可選,僅支持文件系統(tǒng)的開發(fā)板需要) 在產(chǎn)品目錄下創(chuàng)建fs.yml文件。fs.yml需按產(chǎn)品實(shí)際情況配置,一個(gè)典型的fs.yml文件如下:
- fs_dir_name: rootfs # 鏡像的名稱 fs_dirs: - # 將編譯生成的out/my_board/my_product/bin目錄下的文件拷貝到rootfs/bin中,并忽略測試bin source_dir: bin target_dir: bin ignore_files: - Test.bin - TestSuite.bin - # 將編譯生成的out/my_board/my_product/libs目錄下的文件拷貝到rootfs/lib中,忽略所有.a文件,并設(shè)置文件和文件夾的權(quán)限為644和755 source_dir: libs target_dir: lib ignore_files: - .a dir_mode: 755 file_mode: 644 - source_dir: usr/lib target_dir: usr/lib ignore_files: - .a dir_mode: 755 file_mode: 644 - source_dir: config target_dir: etc - source_dir: system target_dir: system - source_dir: sbin target_dir: sbin - source_dir: usr/bin target_dir: usr/bin - source_dir: usr/sbin target_dir: usr/sbin - # 創(chuàng)建一個(gè)proc空目錄 target_dir: proc - target_dir: mnt - target_dir: opt - target_dir: tmp - target_dir: var - target_dir: sys - source_dir: etc target_dir: etc - source_dir: vendor target_dir: vendor - target_dir: storage fs_filemode: - file_dir: lib/ld-uClibc-0.9.33.2.so file_mode: 555 - file_dir: lib/ld-2.24.so file_mode: 555 - file_dir: etc/init.cfg file_mode: 400 fs_symlink: - # 在rootfs/lib下創(chuàng)建軟連接ld-musl-arm.so.1 - > libc.so source: libc.so link_name: ${fs_dir}/lib/ld-musl-arm.so.1 - source: mksh link_name: ${fs_dir}/bin/sh - source: mksh link_name: ${fs_dir}/bin/shell fs_make_cmd: # 使用腳本將rootfs制作為ext4格式的image - ${root_path}/build/lite/make_rootfs/rootfsimg_linux.sh ${fs_dir} ext4 - fs_dir_name: userfs fs_dirs: - source_dir: storage/etc target_dir: etc - source_dir: data target_dir: data fs_make_cmd: - ${root_path}/build/lite/make_rootfs/rootfsimg_linux.sh ${fs_dir} ext4
配置產(chǎn)品Patch(可選,視產(chǎn)品涉及部件是否需要打補(bǔ)丁而定) 在產(chǎn)品目錄下創(chuàng)建patch.yml文件。patch.yml需按產(chǎn)品實(shí)際情況配置,一個(gè)典型的patch.yml文件如下:
# 需要打patch的路徑 foundation/communication/dsoftbus: # 該路徑下需要打的patch存放路徑 - foundation/communication/dsoftbus/1.patch - foundation/communication/dsoftbus/2.patch third_party/wpa_supplicant: - third_party/wpa_supplicant/1.patch - third_party/wpa_supplicant/2.patch - third_party/wpa_supplicant/3.patch ...
配置完成后,編譯時(shí)增加--patch參數(shù),即可在產(chǎn)品編譯前將配置的Patch文件打到對(duì)應(yīng)目錄中,再進(jìn)行編譯:
hb build -f --patch
編寫編譯腳本 在產(chǎn)品目錄下創(chuàng)建BUILD.gn文件,按產(chǎn)品實(shí)際情況編寫腳本。以步驟1中的wifiiot為例,BUILD.gn示例如下:
group("wifiiot") { # target名稱與產(chǎn)品名一致 deps = [] deps += [ "init_configs" ] # 拷貝init配置 deps += [ "hals" ] # 將hals加入編譯 ...... # 其他 } `HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`
- 編譯產(chǎn)品。 主要有兩種編譯方式,[命令行方式和hb方式],這里以命令行方式為例,假設(shè)編譯的產(chǎn)品名是hispark_taurus_standard,則編譯命令是:
./build.sh --product-name hispark_taurus_standard --ccache
審核編輯 黃宇
-
開發(fā)板
+關(guān)注
關(guān)注
25文章
5499瀏覽量
102127 -
鴻蒙
+關(guān)注
關(guān)注
59文章
2503瀏覽量
43762 -
OpenHarmony
+關(guān)注
關(guān)注
26文章
3820瀏覽量
18113
發(fā)布評(píng)論請(qǐng)先 登錄
OpenHarmony鴻蒙南向開發(fā)案例:【智能貓眼(基于Hi3518開發(fā)板)】

鴻蒙OpenHarmony南向/北向快速開發(fā)教程-迅為RK3568開發(fā)板
openharmony開發(fā)版 openharmony開發(fā)板
瑞芯微RK3568鴻蒙開發(fā)板OpenHarmony系統(tǒng)修改cfg文件權(quán)限方法

觸覺智能Purple Pi OH鴻蒙開發(fā)板成功適配OpenHarmony5.0 Release,開啟新征程

如何在開源鴻蒙OpenHarmony開啟SELinux模式?RK3566鴻蒙開發(fā)板演示

OpenHarmony屬性信息怎么修改?觸覺智能RK3566鴻蒙開發(fā)板來演示

OpenHarmony默認(rèn)30秒熄屏太麻煩?觸覺智能鴻蒙開發(fā)板教你輕松取消

OpenHarmony怎么修改DPI密度值?觸覺智能RK3566鴻蒙開發(fā)板演示

OpenHarmony源碼編譯后燒錄鏡像教程,RK3566鴻蒙開發(fā)板演示

【北京迅為】itop-3568 開發(fā)板openharmony鴻蒙燒寫及測試-第1章 體驗(yàn)OpenHarmony—燒寫鏡像

【北京迅為】itop-3568 開發(fā)板openharmony鴻蒙燒寫及測試-第2章OpenHarmony v3.2-Beta4版本測試

【北京迅為】iTOP-RK3568開發(fā)板鴻蒙OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)實(shí)操-HDF驅(qū)動(dòng)配置UART

鴻蒙北向開發(fā)OpenHarmony5.0 DevEco Studio開發(fā)工具安裝與配置

貝啟BQ3568HM 開發(fā)板被選用為 OpenHarmony 明星開發(fā)板

評(píng)論