背景:android N系统,须要集成一个第三方系统服务并在开机运行时启动,但此系统服务是后期经过工具下载进机器中,并非初始系统img就带有android
问题:运行此服务时,系统提示”Service xxx does not have a SELinux domain defined“,服务启动失败安全
一般须要增长一个系统服务,只须要在相应工程的init.xxx.rc中增长以下服务声明便可:dom
service xxx /data/bin/xxx //任意目录 class main user root group root disabled on property:sys.boot_completed=1 //在合适的时机启动服务 start xxx
自android愈来愈重视权限保护后,新增服务须要在SELinux中注册域,不然就会出现文中标题的错误。须要作如下修改:工具
在sepolicy/file_contexts中增长如下内容ui
/data/bin/xxx u:object_r:xxx_exec:s0
而后新增xxx.te文件,在该文件中插入如下内容rest
type xxx, domain; type xxx_exec, exec_type, file_type; init_daemon_domain(xxx)
完成以上步骤并更新boot.img后,一般来讲该系统服务就可正常运行了,但当把服务下载进机器后,仍然提示标题错误。code
排查过程再也不赘述,后面发现当下载到机器后,该文件的域被系统修改了:it
使用命令ls -Z查看,默认是下载到/cache/customer/bin/下,正常的域应该是“u:object_r:xxx_exec:s0 xxx ”,但被更改成了“u:object_r:cache_file:s0 xxx”io
u:object_r:cache_file:s0 xxx 错误 u:object_r:xxx_exec:s0 xxx 正确
解决办法:在启动服务前,经过restorecon命令从新恢复下SELinux的安全上下文便可function
on property:sys.boot_completed=1 //在合适的时机启动服务 restorecon /data/bin/xxx start xxx
注:android N init.rc脚本文件中支持的命令列表在system/core/init/builtins.cpp中
BuiltinFunctionMap::Map& BuiltinFunctionMap::map() const { constexpr std::size_t kMax = std::numeric_limits<std::size_t>::max(); static const Map builtin_functions = { {"bootchart_init", {0, 0, do_bootchart_init}}, {"chmod", {2, 2, do_chmod}}, {"chown", {2, 3, do_chown}}, {"class_reset", {1, 1, do_class_reset}}, {"class_start", {1, 1, do_class_start}}, {"class_stop", {1, 1, do_class_stop}}, {"copy", {2, 2, do_copy}}, {"domainname", {1, 1, do_domainname}}, {"enable", {1, 1, do_enable}}, {"exec", {1, kMax, do_exec}}, {"export", {2, 2, do_export}}, {"hostname", {1, 1, do_hostname}}, {"ifup", {1, 1, do_ifup}}, {"init_user0", {0, 0, do_init_user0}}, {"insmod", {1, kMax, do_insmod}}, {"installkey", {1, 1, do_installkey}}, {"load_persist_props", {0, 0, do_load_persist_props}}, {"load_system_props", {0, 0, do_load_system_props}}, {"loglevel", {1, 1, do_loglevel}}, {"mkdir", {1, 4, do_mkdir}}, {"mount_all", {1, kMax, do_mount_all}}, {"mount", {3, kMax, do_mount}}, {"umount", {1, 1, do_umount}}, {"powerctl", {1, 1, do_powerctl}}, {"restart", {1, 1, do_restart}}, {"restorecon", {1, kMax, do_restorecon}}, {"restorecon_recursive", {1, kMax, do_restorecon_recursive}}, {"rm", {1, 1, do_rm}}, {"rmdir", {1, 1, do_rmdir}}, {"setprop", {2, 2, do_setprop}}, {"setrlimit", {3, 3, do_setrlimit}}, {"start", {1, 1, do_start}}, {"stop", {1, 1, do_stop}}, {"swapon_all", {1, 1, do_swapon_all}}, {"symlink", {2, 2, do_symlink}}, {"sysclktz", {1, 1, do_sysclktz}}, {"trigger", {1, 1, do_trigger}}, {"verity_load_state", {0, 0, do_verity_load_state}}, {"verity_update_state", {0, 0, do_verity_update_state}}, {"wait", {1, 2, do_wait}}, {"write", {2, 2, do_write}}, {"init_dev_detect", {0, 0, do_init_dev_detect}}, }; return builtin_functions; }