解决init: sys_prop: permission denied uid:1003 name:service.bootanim.exit问题

本文介绍了如何解决Android系统中因权限不足导致的bootanimation服务启动失败问题。通过两种方法调整进程用户标识或权限配置,成功解决了init:sys_prop:permissiondenieduid的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


这个错误是在调用property_set函数时出现的。通过打印信息,找到了以下代码

/android/system/core/init/property_service.c

if (check_perms(msg.name, cr.uid, cr.gid, source_ctx)) {
	property_set((char*) msg.name, (char*) msg.value);
} else {
	ERROR("sys_prop: permission denied uid:%d  name:%s\n",
		cr.uid, msg.name);
}

继续查找check_perms函数,发现以下相关代码
    for (i = 0; property_perms[i].prefix; i++) {
        if (strncmp(property_perms[i].prefix, name,
                    strlen(property_perms[i].prefix)) == 0) {
            if ((uid && property_perms[i].uid == uid) ||
                (gid && property_perms[i].gid == gid)) {

                return check_mac_perms(name, sctx);
            }
        }
    }
查看property_perms,
struct {
    const char *prefix;
    unsigned int uid;
    unsigned int gid;
} property_perms[] = {
    { "net.rmnet0.",      AID_RADIO,    0 },
    { "net.gprs.",        AID_RADIO,    0 },
    { "net.ppp",          AID_RADIO,    0 },
    { "net.qmi",          AID_RADIO,    0 },
    { "net.lte",          AID_RADIO,    0 },
    { "net.cdma",         AID_RADIO,    0 },
    { "ril.",             AID_RADIO,    0 },
    { "gsm.",             AID_RADIO,    0 },
    { "persist.radio",    AID_RADIO,    0 },
    { "net.dns",          AID_RADIO,    0 },
    { "sys.usb.config",   AID_RADIO,    0 },
    { "net.",             AID_SYSTEM,   0 },
    { "dev.",             AID_SYSTEM,   0 },
    { "runtime.",         AID_SYSTEM,   0 },
    { "hw.",              AID_SYSTEM,   0 },
    { "sys.",             AID_SYSTEM,   0 },
    { "sys.powerctl",     AID_SHELL,    0 },
    { "service.",         AID_SYSTEM,   0 },
    { "wlan.",            AID_SYSTEM,   0 },
    { "bluetooth.",       AID_BLUETOOTH,   0 },
    { "dhcp.",            AID_SYSTEM,   0 },
    { "dhcp.",            AID_DHCP,     0 },
    { "debug.",           AID_SYSTEM,   0 },
    { "debug.",           AID_SHELL,    0 },
    { "log.",             AID_SHELL,    0 },
    { "service.adb.root", AID_SHELL,    0 },
    { "service.adb.tcp.port", AID_SHELL,    0 },
    { "persist.sys.",     AID_SYSTEM,   0 },
    { "persist.service.", AID_SYSTEM,   0 },
    { "persist.security.", AID_SYSTEM,   0 },
    { "persist.service.bdroid.", AID_BLUETOOTH,   0 },
    { "selinux."         , AID_SYSTEM,   0 },
    { "wfd.enable",        AID_MEDIA,    0 },
    { NULL, 0, 0 }
};
可见问题的关键在于bootanimation服务的进程uid与AID_SYSTEM不一致
既然找到问题的根源,那么接下来就是想办法解决问题了。
有两种方法可以解决这个问题:
方法一:
在property_perms中,增加一项,匹配bootanimation服务的进程uid,我的uid是graphics,
所以添加如下
{ "service.bootanim.",         AID_GRAPHICS,   0 },

方法二:
比较暴力的做法,直接修改进程uid。找到启动bootanimation服务的地方
service bootanim /system/bin/bootanimation
    class main
    user graphics
    group graphics
    disabled
    oneshot
将user graphics改为user system
至此,问题解决!

以上就介绍了解决init: sys_prop: permission denied uid:1003 name:service.bootanim.exit问题,包括了方面的内容,希望对Android开发有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_113164.html

<think>首先,用户的问题是关于Android系统中的一个AVC拒绝访问问题:"system_server avc denied read sys_gps_prop property_service"。用户提到了引用[1]到[5],这些引用提供了上下文,包括AVC拒绝日志、property_service初始化、权限设置等。 关键点: - AVC拒绝:system_server (scontext=u:r:system_app:s0) 试图读取属性 sys_gps_prop (tcontext=u:object_r:sys_gps_prop:s0),但被拒绝。 - 属性在Android中通过property_service管理。 - 引用[3]和[5]讨论了权限问题,需要添加SELinux规则来允许访问。 我的角色: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 确保回答真实可靠。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 生成相关问题。 回答结构: 1. **理解问题**:解释AVC拒绝的含义和原因。 2. **分析原因**:基于SELinux和属性系统。 3. **解决方案**:提供步骤来添加SELinux规则。 4. **实施步骤**:详细说明如何修改SELinux策略文件。 5. **验证**:建议如何验证修复。 6. **生成相关问题**:在末尾添加相关问题。 参考引用: - 引用[1]:显示了一个类似的AVC拒绝日志。 - 引用[2]:property_service的初始化。 - 引用[3]:关于setprop权限和添加AVC权限的例子。 - 引用[4]:Android开机流程,但不太相关。 - 引用[5]:解释权限问题,需要添加规则。 用户意图:理解并解决system_server对sys_gps_prop属性的读取拒绝问题。 逐步解决: 1. **解释AVC拒绝**:AVC是Access Vector Cache,SELinux的一部分,用于强制执行访问控制。当进程尝试访问资源时,如果没有权限,会被拒绝。 - 这里,system_server (Android系统服务) 试图读取sys_gps_prop属性,但SELinux策略不允许。 2. **原因分析**: - SELinux上下文:system_server的上下文是u:r:system_app:s0,属性的上下文是u:object_r:sys_gps_prop:s0。 - 需要允许system_app对sys_gps_prop属性的读取权限。 3. **解决方案**:添加SELinux策略规则来允许访问。 - 规则格式:`allow system_app sys_gps_prop:file { read };` 但属性是property_service类,不是file类。在SELinux中,属性访问是通过property_service类管理的。 - 正确类:从引用[3]中,tclass=property_service。所以,应该是`allow system_app sys_gps_prop:property_service { read };`。 4. **实施步骤**: - 找到或创建SELinux策略文件。通常,在Android源码中,修改device/<vendor>/<device>/sepolicy或system/sepolicy目录下的.te文件。 - 添加规则:例如,在system_app.te或一个自定义的.te文件中添加`allow system_app sys_gps_prop:property_service read;` - 编译和刷入:重新编译系统并刷入设备,或使用adb推送策略文件(如果支持)。 5. **验证**:检查日志,确保拒绝消失;测试功能。 6. **生成相关问题**:在末尾添加3-5个相关问题。 确保回答真实可靠:基于Android SELinux和属性系统知识。 最终回答用中文。</think>### Android system_server AVC拒绝读取sys_gps_prop属性问题解析 在Android系统中,AVC(Access Vector Cache)拒绝是SELinux强制访问控制机制触发的安全事件,表示某个进程(如system_server)试图访问资源(如属性)但缺乏权限。针对您遇到的`system_server avc denied read sys_gps_prop property_service`问题,我将逐步解释原因并提供解决方案。整个过程基于Android SELinux策略和属性系统(property_service),确保真实可靠。 #### 步骤1: 理解问题原因 - **AVC拒绝日志含义**: - `scontext=u:r:system_app:s0`:表示发起访问的进程是system_server(Android系统核心服务)。 - `tcontext=u:object_r:sys_gps_prop:s0`:表示目标资源是sys_gps_prop属性。 - `tclass=property_service`:表示属性访问通过property_service管理。 - 拒绝原因:system_server没有读取sys_gps_prop属性的SELinux权限。属性在Android中用于存储配置信息(如GPS设置),property_service负责管理其访问[^2][^3]。 - **根本原因**:SELinux策略中缺少允许system_app域(system_server的域)对sys_gps_prop属性类的读取规则。这通常发生在属性定义或策略更新时遗漏了权限配置[^3][^5]。 #### 步骤2: 解决方案概述 要解决问题,需添加SELinux策略规则,允许system_server读取sys_gps_prop属性。以下是详细步骤: 1. **修改SELinux策略文件**:在Android源码中添加或更新策略规则。 2. **编译和部署**:重新编译系统并刷入设备。 3. **验证修复**:检查日志确认拒绝消失。 #### 步骤3: 详细实施步骤 ##### 步骤3.1: 添加SELinux规则 - 定位或创建策略文件:在Android源码中,策略文件通常位于`system/sepolicy`或`device/<vendor>/<device>/sepolicy`目录。例如: - 编辑`system/sepolicy/public/system_app.te`文件(如果system_app域规则在此)。 - 如果sys_gps_prop属性是自定义的,确保其类型已在`system/sepolicy/public/property_contexts`中定义(如`sys_gps_prop u:object_r:sys_gps_prop:s0`)[^3][^5]。 - 添加规则:在`system_app.te`文件中添加以下内容: ```te # 允许system_server读取sys_gps_prop属性 allow system_app sys_gps_prop:property_service { read }; ``` - 解释:`allow`是SELinux关键字,`system_app`是源域,`sys_gps_prop`是目标类型,`property_service`是目标类,`{ read }`是允许的操作[^3]。 - **为什么需要此规则**:property_service类控制属性访问(如read、set),system_app域默认无权访问自定义属性(如sys_gps_prop),必须显式授权[^2][^5]。 ##### 步骤3.2: 编译和部署 1. **编译源码**: - 在Android源码根目录运行: ```bash source build/envsetup.sh lunch <your_device_target> # 例如,aosp_arm64-eng make -j$(nproc) ``` - 重点编译SELinux策略:`make sepolicy`。 2. **刷入设备**: - 将生成的`sepolicy`文件(位于`out/target/product/<device>/vendor/etc/selinux`)推送到设备: ```bash adb push sepolicy /vendor/etc/selinux/ adb reboot ``` - 或通过fastboot刷入完整系统映像。 ##### 步骤3.3: 验证修复 - **检查日志**:设备重启后,运行: ```bash adb logcat | grep "avc: denied" ``` 如果不再出现`system_server`对`sys_gps_prop`的拒绝日志,则修复成功。 - **测试功能**:验证GPS相关功能是否正常(例如,通过系统设置或API调用)。 #### 注意事项 - **权限范围**:如果sys_gps_prop属性涉及其他进程(如hal_camera_default),需额外添加规则[^3]。 - **策略错误处理**:如果编译失败,检查规则语法(如类名拼写)。使用`audit2allow`工具辅助生成规则: ```bash adb pull /sys/fs/selinux/avc audit2allow -i avc ``` - **风险提示**:错误修改SELinux策略可能导致系统不稳定。建议在开发板上测试后再部署到生产设备[^5]。 通过以上步骤,您应该能解决AVC拒绝问题。如果属性定义缺失,还需在`property_contexts`文件中添加条目[^2][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值