开发应用报错,提示
avc: denied { write } for comm="com.test" name="/" dev="dm-5" ino=2 scontext=u:r:system_app:s0 tcontext=u:object_r:system_data_root_file:s0 tclass=dir permissive=0
那就是缺少 SELinux 权限,那就加上。
在 Android aosp 源码上,需要先执行过 source build/envsetup
、lunch
命令,
如果不执行 ,会提示
ANDROID_HOST_OUT not set. Have you run lunch?
所以,得先执行。
执行后,在根目录就可以直接使用 audit2allow 工具了。
tip: audit2allow 工具路径是 external/selinux/prebuilts/bin/audit2allow
。
把 avc 的 log 写入到 avc_log.txt 中,名字可以自己修改,把 avc_log.txt 拷贝到根目录,
然后执行 audit2allow -i avc_log.txt
,就会得到如下结果
#============= system_app ==============
allow system_app system_data_root_file:dir write;
执行 get_build_var BOARD_SEPOLICY_DIRS
找到写 Selinux 权限的目录,然后根据目录找对应的 te 文件(因为权限是写在 te 文件里的),然后写入这个结果。
结果可能有好几个,写入到任意一个就行。
不过还是建议遵循归类原则。
比如,我们要加的是 system_app 的权限,就找已经加过 system_app 相关的 te ;要加的是 vendor_app 的权限,就找已经加过 vendor_app 相关的 te。
本例是加到了 device/xxx/common/sepolicy/system_app.te 中.
修改后报错,
out/target/product/xxx/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp out/target/product/xxx/obj/FAKE/sepolicy_neverallows_intermediates/policy.conf ) && (out/host/linux-x86/bin/sepolicy-analyze out/target/product/xxx/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp neverallow -w -f out/target/product/xxx/obj/FAKE/sepolicy_neverallows_intermediates/policy_2.conf || ( echo \"\" 1>&2; echo \"sepolicy-analyze failed. This is most likely due to the use\" 1>&2; echo \"of an expanded attribute in a neverallow assertion. Please fix\" 1>&2; echo \"the policy.\" 1>&2; exit 1 ) ) && (touch out/target/product/xxx/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp ) && (mv out/target/product/xxx/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp out/target/product/xxx/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows )"
libsepol.report_failure: neverallow on line 634 of system/sepolicy/public/init.te (or line 21764 of policy.conf) violated by allow system_app system_data_root_file:dir { write };
libsepol.check_assertions: 1 neverallow failures occurred
Error while expanding policy
按照提示修改 system/sepolicy/public/init.te
,
-neverallow { domain -init -toolbox -vendor_init -vold } system_data_root_file:dir { write add_name remove_name };
+neverallow { domain -init -toolbox -vendor_init -vold } system_data_root_file:dir { add_name remove_name };
然后到 system/sepolicy/ 下执行 mma -j12 编译,编译通过。然后再全编译即可。
其他,
编译的时候还碰到了一个奇怪的问题,
Could not read line from 'out/target/product/xxx/vendor/etc/selinux/vendor_property_contexts': Match operation 'empty' is not valid: must be either 'prefix' or 'exact'
百度搜索之后找到答案:
是因为 te,context 文件结尾必须要有空行。检查 context 文件后,在末尾加上空行就好了。