[文章]OHOS3.1 cannot stat 'packages/phone/../../../../ramdisk.img异常分析和处理

阅读量0
0
2
1 问题描述

在OHOS 3.1 Release或Master分支上编译HI3516DV300或RK3568标准系统时,有可能会出现以下异常:

一开始我也是尝试找人、找解决方案,但看到Gitee上的OHOS项目 build 仓库上,也有人提交issue,且官方未给出解决方案。
https://gitee.com/openharmony/build/issues?utf8=✓&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 函数:
  1. ​def _make_image(args):
  2.     ....
  3.     mk_image_args = [
  4.         args.input_path, config_file, args.output_image_path,
  5.         image_type
  6. #liangkz: add 'product_name' arg Begin:
  7.         ,args.product_name
  8. #liangkz: add 'product_name' arg End.
  9.     ]

  10. def main(argv):
  11.     parser = argparse.ArgumentParser()
  12. #liangkz add 'product_name' arg Begin:
  13.     parser.add_argument('--product_name', required=True)
  14. #liangkz add 'product_name' arg End.
  15.     parser.add_argument('--depfile', required=True)
复制代码

【D-D】修改//build/ohos/images/mkimage/mkimages.py文件的 mk_images 函数,
  1. def mk_images(args):
  2. #liangkz: add 'product_name' arg and args+1:
  3.     if len(args) != 4+1:
  4.         print("mk_images need 4+1 args!!!")
  5.         sys.exit(1)

  6.     src_dir = args[0]
  7.     config_file = args[1]
  8.     device = args[2]
  9.     is_sparse = args[3]
  10. #liangkz: add 'product_name' arg and args+1:
  11.     product_name = args[4]
  12. #liangkz: add 'product_name' arg end

  13.     if "system.img" in device:
  14.         src_dir = build_rootdir(src_dir)
  15.     mkfs_tools, mk_configs, _ = load_config(config_file)

  16.     if "ramdisk.img" in device:
  17. #liangkz modify Begin:
  18. #        mk_configs =
  19. #            " ".join([src_dir, device, "../../build/ohos/images/mkimage/"
  20. #                                       "ramdisk_resource_config.ini"])
  21.         if "rk3568" in product_name:
  22.             mk_configs =
  23.                 " ".join([src_dir, device, "../../build/ohos/images/mkimage/"
  24.                           "rk3568_ramdisk_resource_config.ini"])
  25. #        elif "Hi3516DV300" in product_name:
  26. #            mk_configs =
  27. #                " ".join([src_dir, device, "../../build/ohos/images/mkimage/"
  28. #                          "hi3516_ramdisk_resource_config.ini"])
  29.         else:
  30.             mk_configs =
  31.                 " ".join([src_dir, device, "../../build/ohos/images/mkimage/"
  32.                           "default_ramdisk_resource_config.ini"])
  33.         print("mk_images: ramdisk, mk_configs:",mk_configs)
  34. #liangkz modify End.
  35.     else:
  36.         mk_configs = " ".join([src_dir, device, mk_configs])
复制代码

完成上面四步修改后,随意切换HI3516DV300和RK3568编译都可以了。
以上是个人的临时解决方案,待官方出规范的方案。

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友