OHOS3.1 cannot stat 'packages/phone/../../../../ramdisk.img 原创 精华
【2022.05.11】 注意:
本文提供的是本地临时解决方案,可能对3.1 Release 或 4月初的master分支代码适用,但4月底5月初的master分支代码,已经对此问题(ramdisk的打包生成镜像)做了修复,见“build”仓库下的提交记录中关于“ramdisk”的几处提交。
因此建议小伙伴们废弃参考此文的方案,直接更新最新的代码来使用即可。
如需要进一步了解ramdisk的打包和使用、init的two_stages等相关细节,请参考:
OHOS 3.1的Init进程two_stages相关分析:《-1-编译部分》和《-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 函数:
【D-D】修改//build/ohos/images/mkimage/mkimages.py文件的 mk_images 函数,
完成上面四步修改后,随意切换HI3516DV300和RK3568编译都可以了。
以上是个人的临时解决方案,待官方出规范的方案。
感谢楼主排坑
之前源码编译3568后,再编译3516时,到最后就会报这个错。为楼主点个大大的赞!