
??想了解更多關于開源的內容,請訪問:??
??51CTO 開源基礎軟件社區??
??https://ost.51cto.com??
一、OpenHarmony master最新分支提供支持獨立編譯鏡像的功能
OpenHarmony master最新分支提供支持獨立編譯鏡像的功能。支持獨立編譯的鏡像有
chip_prod.img、sys_prod.img、system.img、usedata.img、vendor.img、ramdisk.img、updater.img。
例如./build.sh --product-name rk3568 --ccache --build-target
system_image可以單獨編譯出system.img鏡像
OpenHarmony Beta4和5編譯構建過程中,只可以在編譯命令./build.sh --product-name rk3568
--ccache指定--build-target images或者--build-target
make_images對所有鏡像進行編譯。無法通過指定單個鏡像進行獨立編譯,同時單個鏡像與platform關聯,無法直接指定單個鏡像的名稱。
out/rk3568/packages/phone/images下鏡像文件:MiniLoaderAll.bin boot_linux.img
chip_prod.img config.cfg parameter.txt ramdisk.img resource.img sys_prod.img
system.img uboot.img updater.img userdata.img vendor.img
二、修改OpenHarmonyBeta4源碼新增獨立編譯鏡像的功能
1、在OpenHarmonyBeta4源碼build/ohos/images/BUILD.gn第48行添加如下內容。
group("chip_prod_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
deps += [ ":${_platform}_chip_prod_image" ]
}
}
group("sys_prod_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
deps += [ ":${_platform}_sys_prod_image" ]
}
}
group("system_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
deps += [ ":${_platform}_system_image" ]
}
}
group("userdata_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
deps += [ ":${_platform}_userdata_image" ]
}
}
group("vendor_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
deps += [ ":${_platform}_vendor_image" ]
}
}
group("ramdisk_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
if (enable_ramdisk) {
deps += [ ":${_platform}_ramdisk_image" ]
}
}
}
group("updater_ramdisk_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
if (enable_ramdisk) {
deps += [ ":${_platform}_updater_ramdisk_image" ]
}
}
}
group("updater_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
if (!enable_ramdisk) {
deps += [ ":${_platform}_updater_image" ]
}
}
}
2、鏡像單獨編譯前需要執行一次全量編譯./build.sh --product-name rk3568 --ccache生成全部鏡像。
3、然后在./build.sh --product-name rk3568 --ccache 后指定–build-target
chip_prod_image、sys_prod_image、system_image、userdata_image、vendor_image、updater_image/updater_ramdisk_image、ramdisk_image分別生成對應的單獨鏡像。
- –build-target updater_ramdisk_image是編譯出ramdisk類型的updater.img。
- –build-target updater_image是編譯出非ramdisk類型的updater.img。
目前Beta5版本的仍然可以選擇編譯非ramdisk類型和ramdisk類型的updater.img,但是最新分支master版本updater與enable_ramdisk
不再關聯,都編譯ramdisk類型的updater.img鏡像,相關issue:南向適配,歸一化一級二級啟動。
例如執行./build.sh --product-name rk3568 --ccache --build-target
updater_image生成非ramdisk類型的updater.img。
![#創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區 #創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區](https://dl-harmonyos.51cto.com/images/202302/f4a5f0978be71bb16bd575acf62e571e360313.png?x-oss-process=image/resize,w_820,h_49)
![#創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區 #創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區](https://dl-harmonyos.51cto.com/images/202302/278388141191ff933c05125175dfe277cdf263.png?x-oss-process=image/resize,w_820,h_502)
三、修改OpenHarmonyBeta5源碼新增獨立編譯鏡像的功能
OpenHarmonyBeta5 已經支持單獨編譯
多產品各自的chipprod鏡像,且前面提到目前Beta5版本的仍然可以選擇編譯非ramdisk類型和ramdisk類型的updater.img
所以和OpenHarmonyBeta4中添加的代碼不同,Beta5不需要添加group(“chip_prod_image”)的部分
1、在OpenHarmonyBeta5源碼build/ohos/images/BUILD.gn第48行添加如下內容
group("sys_prod_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
deps += [ ":${_platform}_sys_prod_image" ]
}
}
group("system_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
deps += [ ":${_platform}_system_image" ]
}
}
group("userdata_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
deps += [ ":${_platform}_userdata_image" ]
}
}
group("vendor_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
deps += [ ":${_platform}_vendor_image" ]
}
}
group("ramdisk_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
if (enable_ramdisk) {
deps += [ ":${_platform}_ramdisk_image" ]
}
}
}
group("updater_ramdisk_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
if (enable_ramdisk) {
deps += [ ":${_platform}_updater_ramdisk_image" ]
}
}
}
group("updater_image") {
deps = []
if (is_standard_system) {
deps += [
"http://third_party/e2fsprogs:e2fsprogs_host_toolchain",
"http://third_party/f2fs-tools:f2fs-tools_host_toolchain",
]
}
foreach(_platform, target_platform_list) {
if (!enable_ramdisk) {
deps += [ ":${_platform}_updater_image" ]
}
}
}
3、鏡像單獨編譯前同樣需要執行一次全量編譯生成全部鏡像。
4、然后在./build.sh --product-name rk3568 --ccache 后指定–build-target
chip_prod_image、sys_prod_image、system_image、userdata_image、vendor_image、updater_image/updater_ramdisk_image、ramdisk_image分別生成對應的單獨鏡像。
四、指定userdata.img鏡像進行獨立編譯并且刷入觸覺智能RK3568
1、筆者基于OpenHarmony Beta5源碼如上述步驟修改源碼后執行./build.sh --product-name rk3568
--ccache --build-target userdata_image單獨編譯生成userdata.img。
2、觸覺智能rk3568這款開發板鏡像鏈接如下:
鏈接:https://pan.baidu.com/s/1JXEBH9CQb4ruzOGz1prrjA?pwd=1234
提取碼:1234
3、解壓觸覺智能rk3568開發板鏡像后替換userdata.img,將完整鏡像刷入開發板。
![#創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區 #創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區](https://dl-harmonyos.51cto.com/images/202302/040c953192a135096d617150e53066dcdd3f63.png?x-oss-process=image/resize,w_820,h_675)
4、燒錄完畢,系統正常啟動。
知識點附送
如何更改OpenHarmony版本信息、SDK和NDK版本信息
源碼目錄下/sources/build/version.gni文件是OpenHarmony版本信息、SDK和NDK版本信息,要修改版本信息只需要在這個文件修改就好了
例如,Beta5的版本信息如下
# OHOS version
declare_args() {
sdk_version = "3.2.10.6"
api_version = "9"
# Release type, optional values: Betax, RCx...
release_type = "Beta5"
meta_version = "3.0.0"
}
# ohos SDK version
declare_args() {
current_sdk_version = sdk_version
}
# ohos NDK version
declare_args() {
current_ndk_version = current_sdk_version
}
改變一個鏡像文件的名稱需要做哪些工作。
以該issues為參考 https://gitee.com/openharmony/build/issues/I5VQZ7
學習將vendor.img改為chipset.img,其實只要把vendor字符全部替換成chipset。通過這個issue可以知道vendor.img涉及到源碼中哪些文件。
關于 --build-target
build-target 是傳給ninja的參數,out/rk3568/build.ninja里面的任務都可以。
1、gn里面的一個target都可以,包括可執行程序,動態庫,group,action,部件名。
2、如果直接指定名稱報unkonw target的話,可能是重名等原因,按照gn的全名稱指定:{目標所在BUILD.gn的路徑}:{目標名}, 比如:
--build-target commonlibrary/c_utils/base:utils。
3、build-target參數一次可以指定多,比如:–build-target A --build-target B。
4、subsystem_name不是編譯目標。
5、部件名是一個特殊的目標,根據ohos.build編譯系統生產的gn目標,如果直接指定部件名,使用–build-target {部件名}
報錯unkonw target,可以使用一個部件的全名稱指定:–build-target
out/{device_name}/build_configs/{subsystem_name}/{part_name}:{part_name}。
編譯流程主要分為:preloader->loader->gn->ninja這四個過程。
如何修改分區文件系統類型由ext4為f2fs
以該issues為例學習將修改/data分區文件系統由ext4為f2fs。
1、修改鏡像文件打包描述文件。
每個系統鏡像文件都是由一個image_conf.txt描述文件來描述。將鏡像文件系統類型由ext4改為f2fs。userdata.img
由build/ohos/images/mkimage/userdata_image_conf.txt描述。在其中將–fs_type=ext4改為–fs_type=f2fs。
2、在rk3568標準系統的defconfig文件中打開prjquota
使能開關,在源碼目錄在kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig中第5945行中#
CONFIG_QUOTA is not set改為CONFIG_QUOTA=y。
3、修改具體設備的fstab文件(這里修改的是rk3568的fstab文件,位于/device/board/hihope/rk3568/cfg/fstab.rk3568)中修改分區的文件系統類型、mnt_flags
and options和fs_mgr_flags參數。
![#創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區 #創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區](https://dl-harmonyos.51cto.com/images/202302/f2327f535e22fa08abb283366d1fdce2a67b80.png?x-oss-process=image/resize,w_820,h_346)
fstab文件:啟動的時候,系統會自動地從這個文件讀取信息,并且會自動將此文件中指定的文件系統掛載到指定的目錄
![#創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區 #創作者激勵#[觸覺智能RK3568]指定單個鏡像進行獨立編譯-開源基礎軟件社區](https://dl-harmonyos.51cto.com/images/202302/b37f5a3921af20ba04f457da3f0db976fc7314.png?x-oss-process=image/resize,w_816,h_429)
修改鏡像打包的配置參數調整分區大小。
以該issue為例學習將rk3568 updater分區從20MB調整為30MB。
1、如果要修改某個鏡像的打包參數,只需要修改//build/ohos/images/mkimage目錄下對應的{鏡像名}_image_config.txt文件即可。
2、在ramdisk類型的updater.img對應的描述文件build/ohos/images/mkimage/updater_ramdisk_image_conf.txt第二行將20971520KB改為33554432KB。
??想了解更多關于開源的內容,請訪問:??
??51CTO 開源基礎軟件社區??
??https://ost.51cto.com??