android rc文件启动服务

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
...

猜你喜欢

转载自blog.csdn.net/wangbuji/article/details/126261898