1. 生成可执行文件
检测文件存在,没有则创建。源码vendor/bin/test_services,编译生成test_services可执行文件。
vendor_product.mk
PRODUCT_PACKAGES += test_services //services执行文件 - cpp文件
PRODUCT_PACKAGES += vendor.test_services.rc //rc文件
在编译cpp的同级目录下添加rc文件以及修改Android.bp或Android.mk
Android.bp
init_rc: [ "vendor.test_services.rc", ],
or
Android.mk
LOCAL_INIT_RC := vendor.test_services.rc
out目录生成的路径
vendor/bin/test_services
vendor/etc/init/vendor.test_services.rc
2. 书写vendor.test_servies.rc
在确认vendor/bin/test_services下生成了执行文件test_services后,书写vendor.test_services.rc。
动作(action):以关键字"on" 开头,表示一堆命令
服务(service):以关键字“service”开头,表示启动某个进程的方式和参数
on property触发机制和实现原理
1、启动时,如果属性满足设定条件会触发一次
2、系统运行中如果属性发生变化,且新值等于设定值,则触发一次
service vendor.test_services /vendor/bin/test_services args
user root
group root system
oneshot //oneshot表示这个service只被启动一次
disable //不随class自动启动,只有根据service名才启动;
on property:persist.vendor.test_services = * //匹配任何值都可以
start vendor.test_services. //除此之外还有classstart
触发方式除了property属性值条件触发还有
on on early-init:在初始化早期阶段触发
on init:在初始化阶段触发
on late-init:在初始化晚期阶段触发
on boot/charger:当系统启动/充电时触发
test_services | 指的是服务名,后边依次是路径 参数 |
---|---|
user root | 执行此服务前,请更改为用户名。当前默认为root |
group root | 执行此服务之前,请更改为groupname。除了第一个必需的其他组名外,还用于设置流程的其他组(带有setgroups() )。当前默认为root。 |
seclabel | 与SElinux相关 |
class | 指定服务的类名。命名类中的所有服务必须一起启动和停止。如果未通过class选项指定服务,则将其视为“默认”类。 |
oneshot | 退出服务时不要重新启动它。当然如果你的程序是循环的则会一直执行 |
disabled | 该服务不会自动从其类开始。必须通过名称显式启动(即 start)。 |
3. SElinux权限问题
test_services对应vendor.test_services.rc中定义的services,test_services_exec对应执行文件test_services。init_daemon_domain 是一个宏,用来使 test_services域生效,如果没有填加sepolicy的配置,则会报错init:service monitor does not have a SELinux domain defind
file_contexts
/(vendor|system/vendor)/bin/test_services u:object_r:test_services_exec:s0
test_services.te
type test_services, domain;
type test_services_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(test_services)
allow test_services vendor_sensors_prop:property_service { set };
allow test_services vendor_sensors_prop:file { getattr open read map };
get_prop(sns_client_wrist, vendor_sensors_prop);
allow test_services stest_services:qipcrtr_socket { setopt getattr create write read };
property_context
persist.vendor.sensors.test_services u:object_r:vendor_sensors_prop:s0
...