Android init.rc 添加自定义服务

一、按照rc语法格式添加新增service

rc文件中添加如下

# 最后两个必写,其他的省略亦可
service screencnap/system/bin/screencap
    # class 包括core main late_start等,可以不设置。默认default
    class main
    # 用户属性,默认root,一般给root即可,权限最大
    user root
    # 所属组,默认root
    group root
    # disabled 即通过class不能启动,只能start screencap 这种name的方式启动
    disabled
    # 只运行一次
    oneshot

 # 服务启动条件
on property:sys.start_service=1
    start screencap

二、添加te文件

修改完成rc文件后,需要添加对应的te文件,否则没有权限执行。
大致目录:
device/…/file_contexts
device/…/screencap.te

#file_contexts 文件添加如下
/system/bin/screencap u:object_r:screencap_exec:s0


#screencap.te 整个文件如下
type screencap, domain,coredomain;
type screencap_exec, exec_type,vendor_file_type,file_type;

init_daemon_domain(screencap)

添加完成后,测试时先关闭SELinux。

adb root
adb shell setenforce 0

这样执行时,如果有avc权限,不影响程序运行,且能从log中查找avc能看到所有需要的权限。

三、rc语法链接

init.rc 语法与解析

四、avc权限添加

avc权限添加规则如下

// 异常log
type=1400 audit(1511821362.996:9): avc: denied { search } for pid=540 comm="init" name="nfc" dev="sda45" ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0
type=1400 audit(1511821362.996:9): avc: denied { open } for pid=540 comm="init" name="nfc" dev="sda45" ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0

// 添加规则
scontext=u:r:vendor_init          表示目标te文件是 vendor_init.te ,去device下对应项目目录下查看即可。
tcontext=u:object_r:nfc_data_file 表示是哪个进程需要。这样说明是 nfc_data_file 需要
tclass=dir                        表示操作种类。这里表示 dir
avc: denied { search }            表示缺失的权限 search 

// 总结,需要在 vendor_init.te 中添加如下代码。有两条avc权限{ search } { open }问题,可以放在一起写
allow vendor_init nfc_data_file:dir { search open };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值