xx项目双摄倾斜度校验功能需要在开机阶段创建/mnt/vendor/persist/camera目录,但一直创建不成功
解决过程:
1.在init.project.rc中on post-fs-data这个阶段增加这一行:mkdir /mnt/vendor/persist/camera 0744 cameraserver cameraserver
编译vendorimage,将out目录中的vendor/etc/init/hw/init.project.rc push到手机里开机依然没有在/mnt/vendor/persist下生成camera目录。
2.怀疑是权限问题,在mkdir之前加一行:chmod 0777 /mnt/vendor/persist,创建camera目录依然不成功。
3.怀疑是创建文件夹的阶段不对,将mkdir /mnt/vendor/persist/camera 0744 cameraserver cameraserver放在on fs阶段,创建camera目录依然不成功。
4.尝试在其他路径创建cameram目录,添加mkdir /mnt/vendor/camera 0744 cameraserver cameraserver,修改生效,可以在mnt/vendor下生成camera目录,说明还是persist目录下没有权限创建文件夹。
5.查看init.mt6765.rc中其他创建目录的代码,发现有些创建目录前有restorecon_recursive xxx这一行,于是也在mkdir前添加restorecon_recursive /mnt/vendor/persist,修改生效,/mnt/vendor下创建camera目录成功。
代码修改如下:
在init.project.rc中on post-fs-data这个部分增加:
restorecon_recursive /mnt/vendor/persist
mkdir /mnt/vendor/persist/camera 0744 cameraserver cameraserver
关于restorecon_recursive这个命令:
restorecon_recursive <path> [ <path> ]* 以递归的方式恢复指定目录到file_contexts配置中指定的安全上下文中,restoercon,全称应该是restore context:就是根据file_contexts中的内容给path目录打标签
下面截取一段网上找的文章介绍
restorecon分析
[–>init.c::restorecon]
int restorecon(const char *pathname)
{
char *secontext = NULL;
struct stat sb;
int i;
if (is_selinux_enabled() <= 0 || !sehandle)
return 0;
if (lstat(pathname, &sb) < 0) return -errno;
//查找file_context文件中是否包含有pathname路径的控制选项
if (selabel_lookup(sehandle, &secontext, pathname, sb.st_mode) < 0)
return -errno;
//设置patchname目录的security_context,lsetfilecon的实现非常简单,就是调用
if (lsetfilecon(pathname, secontext) < 0) {
freecon(secontext);
return -errno;
}
freecon(secontext);
return 0;
}