Android T 添加vendor/bin下面的自启动服务

2023-12-15 13:17:57

步骤:修改在device/qcom/sepolicy_vndr/qva/vendor/common或者system/sepolicy/vendor目录效果是一样的,生成的Selinux权限都会在vendor/etc/selinux/下面,针对vnd侧的,T上面应该用API对应的31。system/sepolicy/prebuilts/api/31.0/private下面的修改会编译到vnd的system/etc/selinux/中。

1、添加bin文件的编译代码(可执行文件名称为iqi_bridge_daemon,对应的服务名称为iqi_bridge)。添加bin文件所需的代码文件,对应的编译mk或者bp文件编译对应的模块iqi_bridge_daemon,以及在device.mk或者其他的上级mk中添加PRODUCT_PACKAGE +=iqi_bridge_daemon来保证全编的时候能够打包到对应的bin文件

2、添加rc中的服务名称以及自启动配置:

on property:sys.boot_completed=1
? ? start iqi_bridge
chmod ?775 /vendor/bin/iqi_bridge_daemon

service iqi_bridge /vendor/bin/iqi_bridge_daemon
# ? ?oneshot? ?//添加该配置开机只启动一次,不添加配置的话服务挂掉会自动重启
? ? disabled
? ? user root
? ? group root
#? ? seclabel u:object_r:iqi_bridge_exec:s0? selinux标签,可以在file_contexts中添加

3、system/sepolicy/vendor/file_contexts中添加可执行文件的配置:

/(vendor|system/vendor)/bin/iqi_bridge_daemon ? ? ? ? ? ? ? ? u:object_r:iqi_bridge_exec:s0

4、添加文件和可执行类别的Selinux标签:

在system/sepolicy/vendor/中新增iqi_bridge.te文件,并添加如下内容:

type iqi_bridge, domain;? ?//定义iqi_bridge服务为domain,一种动作
type iqi_bridge_exec, exec_type, vendor_file_type, file_type;? //iqi_bridge_exec将iqi_bridge_exec定义为可执行文件
init_daemon_domain(iqi_bridge)? ?//确保iqi_bridge服务可以和domain之间实现域转换

5、调试的时候先setenforce 0,测试过程中抓取日志,根据日志中的avc:权限标签添加对应的权限到iqi_bridge.te文件中:

allow iqi_bridge iqi_bridge:qipcrtr_socket {create getattr read write};
allow iqi_bridge iqi_bridge:tcp_socket {create listen accept read write};
allow iqi_bridge iqi_bridge:tcp_socket bind;
allow iqi_bridge port:tcp_socket name_bind;
allow iqi_bridge node:tcp_socket node_bind;

......

6、权限全部添加完成以后刷机验证,功能Ok。

备注:调试过程中先全刷的版本,该版本中还未添加selinux标签,然后添加selinux标签编译vendor后单独刷的vendor.img进行调试的,刷完vendor.img后开机过程日志中有如下错误信息:

SELinux : Context u:object_r:iqi_bridge_exec:s0 is not valid (left unmapped).

查找了很久都没有找到原因。最后删除了odm/etc/selinux/下面的precompiled_sepolicy等相关文件后重启设备发现没有该问题了,原因是全刷的时候vendor/etc/selinux/下面并没有定义Selinux的标签,odm/etc/selinux/中的precompiled_sepolicy*文件是预编译的时候根据vendor和system中的selinux标签进行加载的。刷机以后都只单刷了vendor,odm/etc/selinux/中的precompiled_sepolicy*文件没有更新,检查selinux权限的时候优先检查odm/etc/selinux/中是否有precompiled_sepolicy*文件,有的话就不会再去vendor的selinux目录去解析了。所以出现问题,删除precompiled_sepolicy文件后开机的时候会重新解析selinux,在运行就没有问题了。

文章来源:https://blog.csdn.net/u013306216/article/details/134897857
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。