如何在SurfaceFlinger中写入文件 配置权限后仍报错如何解决
问题解决方法
根因定位
你遇到的errno=13是*权限拒绝(EACCES)*错误,核心原因有3个:
- 配置的
sdcard_rw用户组未生效:你在surfaceflinger.rc中添加了sdcard_rw组,但实际运行的进程groups列表中无对应gid(sdcard_rw标准gid为1023,你给出的groups列表是0、1015、1026、3009,未包含1023),说明rc文件修改后未被系统正确加载。 - SELinux权限拦截:Android默认强制开启SELinux,即使是root身份运行的SurfaceFlinger进程,默认SELinux策略也不允许访问外置存储路径。
- 代码参数小问题:
open函数的第三个权限参数是八进制格式,你写的600是十进制,对应实际权限异常,需要加前缀0写作0600。
分步解决方案
- 第一步:生效用户组配置
修改完surfaceflinger.rc后,需要重新编译烧录system镜像,重启设备后执行cat /proc/$(pidof surfaceflinger)/groups,确认输出中包含1023(sdcard_rw的gid),代表组配置已经生效。 - 第二步:处理SELinux权限
先临时关闭SELinux验证问题:执行setenforce 0切换到SELinux宽容模式,测试文件写入是否正常。如果可以正常写入,就需要在SurfaceFlinger对应的SELinux策略(.te)文件中添加如下规则,适配强制模式:allow surfaceflinger sdcard_rw_t:file { open read write create unlink }; allow surfaceflinger storage_file:dir { search getattr }; allow surfaceflinger mnt_user_file:dir { search getattr }; - 第三步:修正代码
将open代码修改为如下形式,路径和参数更通用:ALOGI("open file before"); int fd = open("/sdcard/test.bmp", O_RDWR | O_CREAT, 0600); ALOGI("open file after %d %d", fd, errno); - 临时调试替代方案:如果仅用于本地调试不需要上线,可直接将文件写入到
/data/local/tmp/目录,该目录权限宽松,不需要修改用户组和SELinux配置即可写入,直接修改路径即可:int fd = open("/data/local/tmp/test.bmp", O_RDWR | O_CREAT, 0600);
内容的提问来源于stack exchange,提问作者Getname
相关产品推荐
相关产品推荐

