我试图在Android AOSP上安装一个大小有限的tmpfs,以便在RAM中缓存一些HLS视频。视频会不断重写,因此无法写入可能会耗尽的闪光灯。我无法弄清楚如何获得权限,任何建议?
我还应该使用哪个域名?我想限制此目录,以便只有我的应用程序可以使用它,但这不是绝对的要求。我的应用程序是普通应用程序,没有特权。
hls.te
type hlsfs, fs_type;
# Allow file access in /hls
allow domain hlsfs:file create_file_perms;
allow domain hlsfs:dir rw_dir_perms;
allow init hlsfs:dir { create_dir_perms relabelto };
file_contexts
#HLS cache
/data/hls(/.*)? u:object_r:hlsfs:s0
init.rc
on init
mkdir /data/hls 0777 system system
on early-fs
mount tmpfs tmpfs /data/hls mode=777,size=60M,context=u:object_r:hlsfs:s0
错误消息,第一个错误是mkdir,第二个是mount。
root@bpi-m64-hdmi:/ # dmesg | grep hls
[ 2.218541] type=1400 audit(1499777970.690:4): avc: denied { associate } for pid=1 comm="init" name="hls" scontext=u:object_r:hlsfs:s0 tcontext=u:object_r:rootfs:s0 tclass=filesystem permissive=1
[ 11.285712] type=1400 audit(1499777979.750:6): avc: denied { relabelto } for pid=1 comm="init" name="hls" dev="dm-1" ino=170689 scontext=u:r:init:s0 tcontext=u:object_r:hlsfs:s0 tclass=dir permissive=0
Android默认selinux政策在https://android.googlesource.com/platform/system/sepolicy/+/android-n-preview-2/
我在这方面取得了很大进展。首先,将它放入/ data是一个坏主意,因为有许多现有规则阻止了这一点。所以我把它移到了/ cache。
hls.te
type hlsfs, contextmount_type, fs_type;
# Allow file access in /hls
permissive hlsfs;
#allow domain hlsfs:file create_file_perms;
#allow domain hlsfs:dir rw_dir_perms;
file_contexts
#HLS cache
/cache/hls(/.*)? u:object_r:hlsfs:s0
init.rc
on fs
mkdir /cache/hls 0777 system system
mount tmpfs tmpfs /cache/hls mode=777,size=60M,context=u:object_r:hlsfs:s0
init.te
# allow hls tmpfs to be mounted in cache dir
allow init cache_file:dir mounton;
通过这些更改,我可以挂载tmpfs目录。接下来我需要确保我的应用可以使用它。我还需要确保应用程序无法在tmp目录中创建任何可执行文件。
应用无法访问缓存目录。所以让我们尝试另一种方案......
这个计划几乎是正确的。我可以挂载tmpfs目录,我的应用程序可以访问它。但除非我更改所有者" chown media_rw media_rw / data / media / 0 / hls"否则该应用无法访问它。更改所有者会触发核心Android规则的拒绝错误。我将init设置为允许绕过错误。那么如何解决chown目录的需要呢?我尝试将权限设置为777并使用gid = 1023 / uid = 1023进行安装。都没有帮助。
hls.te
# Allow file access in /hls
permissive hlsfs;
file_contexts
#HLS cache
/data/media/0/hls(/.*)? u:object_r:hlsfs:s0
init.rc
on property:sys.boot_completed=1
mkdir /data/media/0/hls 0777 media_rw media_rw
mount tmpfs tmpfs /data/media/0/hls mode=777,size=60M,context=u:object_r:hlsfs:s0
chown media_rw media_rw /data/media/0/hls
init.te
# allow hls tmpfs to be mounted in /data/media dir
allow init media_rw_data_file:dir {setattr mounton};
allow init hlsfs:dir {create setattr relabelto mounton};
allow init labeledfs:filesystem associate;
permissive init;
错误消息
07-14 23:02:33.010 1-1/? I/init: type=1400 audit(0.0:5): avc: denied { relabelto } for scontext=u:r:init:s0 tcontext=u:object_r:hlsfs:s0 tclass=filesystem permissive=1
答案 0 :(得分:1)
我相信我现在有这个工作。我的最后一个错误是尝试为tmp目录制定自定义策略。自定义策略导致了重新标记错误。
现在我在getExternalStorageDirectory()下有一个工作目录,它是基于tmpfs的60MB限制。
init.te
# allow hls tmpfs to be mounted in /data/media dir
allow init media_rw_data_file:dir {setattr mounton};
allow init labeledfs:filesystem associate;
init.rc
on property:sys.boot_completed=1
mkdir /data/media/0/hls 0777 media_rw media_rw
mount tmpfs tmpfs /data/media/0/hls size=60M
sdcardd.te
allow sdcardd tmpfs:dir create_dir_perms;
allow sdcardd tmpfs:file create_file_perms;