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

Android应用(含原生组件)与系统服务间的文件共享方案问询

Android系统服务(SurfaceFlinger/AudioFlinger)与自有应用文件共享方案

一、用系统级共享目录实现

  • /data/misc 目录:这个目录归属system用户组,SurfaceFlinger、AudioFlinger这类系统服务一般以system身份运行,本身就能访问。你只需给自有应用添加android.permission.WRITE_MISC_STORAGE和android.permission.READ_MISC_STORAGE权限(修改AOSP权限声明文件),应用就能读写该目录下的子文件夹,两边直接通过路径访问即可。
  • /data/local/tmp 目录:全局可读写(默认权限777),系统服务和应用都能直接用,适合临时文件共享。但要注意,系统可能会清理这个目录下的文件,不适合长期存东西。

二、调整权限/SELinux规则绕过访问限制

  • 修改文件权限:如果要共享应用私有目录(/data/data/[你的包名])里的文件,让应用创建文件时把权限设为0666(全局可读可写),同时把父目录权限改成0777。不过Android 10+的Scoped Storage会限制这类操作,得在应用的AndroidManifest.xml里加android:requestLegacyExternalStorage="true"(私有目录的话还要配合SELinux调整)。
  • 更新SELinux策略:要是SELinux挡了系统服务访问应用文件,直接在AOSP的SELinux规则里加允许项。比如给SurfaceFlinger加访问应用私有文件的权限,把下面这条加到system/sepolicy/private/surfaceflinger.te文件里,再重新编译SELinux策略:
    allow surfaceflinger app_data_file:file rw_file_perms;
    

三、绑定挂载(Bind Mount)

应用创建好共享文件后,调用mount命令(要给应用开root权限,或者在AOSP里给应用加对应权限)把文件绑定挂载到系统服务能访问的目录,比如:

mount --bind /data/data/com.yourapp/files/shared.txt /data/misc/shared.txt

系统服务直接访问/data/misc/shared.txt就行,这种方式不用改太多权限,也能实现共享。

四、备选:Socket通信

如果上面的方案都不合适,再考虑你想避免的Socket通信。可以在系统服务里建Unix Domain Socket,应用要么通过Socket传文件数据,要么用sendmsg传递文件描述符,后者效率更高。

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:58:18