解决一个android service启动无法开文件的问题

news/2024/10/21 3:02:30/

问题描述

android hal层一般是通过service给系统提供服务的。一般需要将service配置为开机启动。调试阶段,我直接将service push到板卡上,进行调试,未出现问题无法开的问题。在最后集成完成后,放到板卡上,出现启动无法打开 /dev/uinput 的问题,报错为:

10-14 08:21:02.550   360   360 E ca_ins_hal: open /dev/uinput failed: Permission denied

提示为权限问题。但是系统并没有报 avc: denied 的问题。avc 相关的已经在集成时,解决了所有的 avc 报错。但是现在无法打开 /dev/uinput

猜测 te 文件添加的权限已经没有问题了。还有与权限相关的就是 rc 文件了。

android.hardware.gnss@2.1-service-ca_ins.rc :

service gnss-hal-service /vendor/bin/hw/android.hardware.gnss@2.1-service-ca_insclass haluser systemgroup system

解决

这里我抄了一个demo的 rc 配置,使用的 class 是 hal,user 和 group 都是system,android 系统中只有root权限和非root权限。因此猜测在这里使用root权限可以解决上述问题。因此在系统里找了一个使用 root 权限的配置copy过来:

service gnss-hal-service /vendor/bin/hw/android.hardware.gnss@2.1-service-ca_insclass mainuser rootgroup root

重新编译集成,再次启动, /dev/uinput 打开正常。接下来报除了一些 uinput 相关的 avc 权限问题,将需要的权限添加到 te 文件中即可,可能需要多次调试添加。

在解决权限问题时,最后会有一条无法解决:

10-14 08:52:08.847   475   475 I gnss@2.1-servic: type=1400 audit(0.0:7): avc: denied { dac_override } for capability=1 scontext=u:r:hal_gnss_ca_ins:s0 tcontext=u:r:hal_gnss_ca_ins:s0 tclass=capability permissive=1

将相应的权限添加到 te 文件会导致编译不通过。自己定义的权限和全局设置的权限要求冲突了。

解决方式参考:https://blog.csdn.net/k663514387/article/details/107983037

需要将进程添加到需要访问的文件所在的文件组:

dev/uinput:

se1000:/ # ls /dev/uinput  -al
crw-rw---- 1 uhid uhid 10, 223 1970-01-01 00:00 /dev/uinput

te 文件:

service gnss-hal-service /vendor/bin/hw/android.hardware.gnss@2.1-service-ca_insclass haluser systemgroup system uhid

重新编译集成,不会在报 dac_override avc 错误。并且, /dev/uinput 也能正常打开。root 权限不可乱用 : (


http://www.ppmy.cn/news/1540677.html

相关文章

VMware虚拟机三种网络模式详解

主要内容 1. 桥接模式2. NAT模式VMware Network Adapter VMnet8虚拟网卡的作用 3. 仅主机模式VMware Network Adapter VMnet1虚拟网卡的作用设置虚拟机联通外网 4. 总结 参考资料: 1.Vmware虚拟机三种网络模式详解 VMware虚拟机三种网络模式详解之Bridged&#xff0…

基于SpringBoot的出租车拼车系统【附源码】

基于SpringBoot的出租车拼车系统 效果如下: 系统首页界面 用户注册界面 拼单信息界面 公告信息界面 管理员登录界面 管理员功能界面 用户界面 司机界面 拼车订单界面 拼单信息界面 拼单申请界面 司机主界面 研究背景 随着科学技术的不断发展,计算机现…

java关于如何实现读取各种类型的文件核心属性方法,比如获取标题和作者、主题等;附带远程的https的地址文件读取方法;

有两种方法: 通过提供的现成api进行调用读取pdf文件,或doc、xlsx、pptx文件;可能商业需要付费 https://www.e-iceblue.cn/pdf_java_document_operation/set-pdf-document-properties-in-java.html Spire.PDF for Java import com.spire.pdf…

electron-vite_11各平台 Electron 镜像存到哪里了?

建议设置了 NPM 镜像和 Electron 源;速度会快一点;electron-builder 在打包的时候,会根据系统的不同去各自的 NPM 缓存目录下查找对应版本的 Electron 源; 各操作系统对应的 NPM 缓存路径分别为: Linux: $XDG_CACHE_H…

六、存储过程和触发器及视图和临时表

一. 存储过程和触发器是数据库中用于实现复杂业务逻辑和自动化操作的重要工具。 下面是对存储过程和触发器的详细讲解和示例说明:存储过程: 存储过程是一组预定义的SQL语句,封装在数据库中并可通过名称调用。存储过程可以接受输入参数和输出…

【算法】深入理解布隆过滤器

1. 什么是布隆过滤器? 布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于检测某个元素是否在一个集合中。与常见的数据结构如哈希表不同,布隆过滤器无法删除元素,并且会存在一定的误判率&…

市场上几个跨平台开发框架?

跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上,开发者需要为每个操作系统编写不同的代码,使用不同的开发工具和语言。而跨平台桌面应用开发框架通过…

list(1)

list 大体上与之前学的string,vector类似&#xff0c;list不支持[]访问&#xff0c;擅长头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删&#xff0c;中间元素插入删除&#xff0c;因为list底层是双向循环带头链表 一段代码演示&#xff1a; #include <iostream>…