android init 进程分析 (4 属性服务)

属性服务

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进程作为所有用户进程的父进程初始化了属性环境。

android init 进程分析 (4 属性服务)_第1张图片

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

#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。

你可能感兴趣的:(android,getprop)