You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SurfaceFlinger中写入文件 配置权限后仍报错如何解决

问题解决方法

根因定位

你遇到的errno=13是*权限拒绝(EACCES)*错误,核心原因有3个:

  1. 配置的sdcard_rw用户组未生效:你在surfaceflinger.rc中添加了sdcard_rw组,但实际运行的进程groups列表中无对应gid(sdcard_rw标准gid为1023,你给出的groups列表是0、1015、1026、3009,未包含1023),说明rc文件修改后未被系统正确加载。
  2. SELinux权限拦截:Android默认强制开启SELinux,即使是root身份运行的SurfaceFlinger进程,默认SELinux策略也不允许访问外置存储路径。
  3. 代码参数小问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:15:04