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
相关产品推荐
相关产品推荐

