Android 源码分析 - 系统 - init (4 属性服务)

本文解析了Android中属性服务的工作原理,介绍了属性数据库如何基于临时文件实现,并详细解释了属性读写请求的处理流程及权限控制机制。此外还概述了属性服务初始化时加载属性的文件路径。

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

属性服务

Android在bionic/libc中实现了属性数据库,源文件bionic/system_properties.c,头文件include/sys/system_properties.h。属性数据库建立在临时文件(/dev/__properties__)上。

bionic直接处理属性读取请求;然而,对于属性设置请求,则通过UNIX域套接字(/dev/socket/property_service)转发给了init进程处理。

属性文件句柄被子进程继承,句柄值通过环境变量ANDROID_PROPERTY_WORKSPACE传递。init进程作为所有用户进程的父进程初始化了属性环境。

属性服务初始化时从下列文件中读取属性:

#define PROP_PATH_RAMDISK_DEFAULT  "/default.prop"

#define PROP_PATH_SYSTEM_BUILD     "/system/build.prop"

#define PROP_PATH_SYSTEM_DEFAULT   "/system/default.prop"

#define PROP_PATH_FACTORY          "/factory/factory.prop"

#define PROP_PATH_LOCAL_OVERRIDE   "/data/local.prop"

其中/data/local.prop只有调试模式(ro.debuggable=1)才会加载。

属性服务处理设置(PROP_MSG_SETPROP)请求。修改属性有两层权限控制,第一层通过属性名前缀控制,权限记录在property_perms数组中;第二层是selinux_check_access。

在修改属性时,根据init.rc里面定义的动作执行相应的命令。

属性ctl.start、ctl.stop、ctl.restart用来启动、停止、重启一个服务,他们的权限控制也特殊一些(通过服务名称控制,权限记录在control_perms数组中)。

属性ro.*是只读的。

属性net.change自动跟踪最后一个被修改的net.*属性名称。

属性init.svc.*跟踪init启动的服务的状态。

属性persist.<name>用来持久化一个属性,属性值保存在/data/property/<name>文件中。下次启动init会读入持久化的属性(load_persistent_properties)。

属性包装接口实现在libcutils中,源文件system/core/libcutils/properties.c,头文件system/core/include/cutils/properties.h。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值