背景: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; }