Android selinux policy单独编译与调试
1、logcat查看进程的selinux policy问题
freezeDetector: type=1400 audit(0.0:293): avc: denied { setrlimit } for scontext=u:r:system_server:s0 tcontext=u:r:hal_graphics_composer_default:s0 tclass=process permissive=0
system_server对hal_graphics_composer_default服务进程缺少setrlimit权限。
2、在.te或_contexts文件中添加selinux权限
allow system_server hal_graphics_composer_default:process { setrlimit };
3、单编selinux policy模块
执行 make selinux_policy,在out目录生成sepolicy编译产物
4、查询新添加的selinux权限是否包含在sepolicy编译产物中
修改的.te文件将编译成*_sepolicy.cil,可在out目录下grep修改的关键字进行查看;_contexts文件在out目录下依旧为_contexts类文件,可直接grep查看相关修改。
5、将sepolicy编译产物push到设备
1)执行adb remount
2)adb shell rm -rf /vendor/etc/selinux,删除设备vendor分区的selinux目录
3)adb push out/target/product/xxx/vendor/etc/selinux /vendor/etc/selinux,将out目录下的selinux文件夹替换至设备;
[可选] 如修改的内容涉及file_contexts,请执行restorecon -R -F 需要生效文件的路径,文件标签才会生效。例如file_contexts中修改了/vendor/bin/xxx,则执行restorecon -R -F /vendor/bin/xxx
(system和system_ext分区实现方式和vendor分区一致)
注意:1、remount为overlayfs,开机时挂载可能晚于selinux初始化,可能导致修改不生效(对于file_contexts类文件可以生效,使用restorecon可以手动刷新,cil得看overlayfs的挂载时机)。2、以上方式编译不会编译recovery模式下相关的sepolicy.
