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