1 問題描述
在OHOS 3.1 Release或Master分支上編譯HI3516DV300或RK3568标準系統時,有可能會出現以下異常:
一開始我也是嘗試找人、找解決方案,但看到Gitee上的OHOS項目 build 倉庫上,也有人送出issue,且官方未給出解決方案。
https://gitee.com/openharmony/build/issues?utf8=%E2%9C%93&issue_search=3568
受Issue:https://gitee.com/openharmony/build/issues/I51LRP
的啟發,我就深入跟蹤了一下“ramdisk_resource_config.ini”檔案的使用狀況。
2 ramdisk_resource_config.ini
編譯系統對ramdisk_resource_config.ini的使用,有點奇怪,系統中有三個:
【1】//build/ohos/images/mkimage/ramdisk_resource_config.ini
【2】//device/board/hisilicon/hispark_taurus/linux/images/ramdisk_resource_config.ini
【3】//device/board/hihope/rk3568/cfg/ramdisk_resource_config.ini
在編譯HI3516DV300時,會把檔案【2】拷貝到:
【4】//out/hi3516dv300/packages/imagesconf/ramdisk_resource_config.ini
我不大清楚實際在哪裡會使用到檔案【4】,但是卻要依賴檔案【1】!!
假如先編譯了RK3568,檔案【1】被檔案【3】替換掉了,就會出現樓主提的異常。
在編譯RK3568時,BUILD.gn的copy會把檔案【3】拷貝并替換掉檔案【1】,編譯RK3568倒是不會有問題;
如果編譯RK3568時,沒有跑BUILD.gn的copy把檔案【3】拷貝并替換掉檔案【1】,則編譯RK3568也會出現樓主提的異常。
社群或微信群裡有兄弟不用做任何修改,随意切換編譯HI3516DV300和RK3568都沒問題,原因不詳,希望他們确認一下編譯HI3516DV300和RK3568時,上面檔案【1】是否有跟着變化。
3.1 解決方案一:手動處理
編譯RK3568時,把檔案【3】拷貝并替換掉檔案【1】,注意檔案【1】做好備份,再去編譯RK3568即可。
編譯HI3516DV300時,可能又會報錯,這時候再将原先備份的檔案【1】替換回去,再去編譯HI3516DV300即可。
3.2 解決方案二:自動處理
按以下四個步驟修改:
【D-A】把原先的檔案【1】改名為default_ramdisk_resource_config.ini,
【D-B】把檔案【3】檔案拷貝到//build/ohos/images/mkimage/目錄下,改名為rk3568_ramdisk_resource_config.ini,
【D-C】修改//build/ohos/images/build_image.py檔案的 main 函數和 _make_image 函數:
def _make_image(args):
....
mk_image_args = [
args.input_path, config_file, args.output_image_path,
image_type
#liangkz: add 'product_name' arg Begin:
,args.product_name
#liangkz: add 'product_name' arg End.
]
def main(argv):
parser = argparse.ArgumentParser()
#liangkz add 'product_name' arg Begin:
parser.add_argument('--product_name', required=True)
#liangkz add 'product_name' arg End.
parser.add_argument('--depfile', required=True)
【D-D】修改//build/ohos/images/mkimage/mkimages.py檔案的 mk_images 函數,
def mk_images(args):
#liangkz: add 'product_name' arg and args+1:
if len(args) != 4+1:
print("mk_images need 4+1 args!!!")
sys.exit(1)
src_dir = args[0]
config_file = args[1]
device = args[2]
is_sparse = args[3]
#liangkz: add 'product_name' arg and args+1:
product_name = args[4]
#liangkz: add 'product_name' arg end
if "system.img" in device:
src_dir = build_rootdir(src_dir)
mkfs_tools, mk_configs, _ = load_config(config_file)
if "ramdisk.img" in device:
#liangkz modify Begin:
# mk_configs = \
# " ".join([src_dir, device, "../../build/ohos/images/mkimage/"
# "ramdisk_resource_config.ini"])
if "rk3568" in product_name:
mk_configs = \
" ".join([src_dir, device, "../../build/ohos/images/mkimage/"
"rk3568_ramdisk_resource_config.ini"])
# elif "Hi3516DV300" in product_name:
# mk_configs = \
# " ".join([src_dir, device, "../../build/ohos/images/mkimage/"
# "hi3516_ramdisk_resource_config.ini"])
else:
mk_configs = \
" ".join([src_dir, device, "../../build/ohos/images/mkimage/"
"default_ramdisk_resource_config.ini"])
print("mk_images: ramdisk, mk_configs:",mk_configs)
#liangkz modify End.
else:
mk_configs = " ".join([src_dir, device, mk_configs])
完成上面四步修改後,随意切換HI3516DV300和RK3568編譯都可以了。
以上是個人的臨時解決方案,待官方出規範的方案。
想了解更多關于鴻蒙的内容,請通路:
51CTO和華為官方合作共建的鴻蒙技術社群
https://ost.51cto.com/#bkwz