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进程作为所有用户进程的父进程初始化了属性环境。
属性服务初始化时从下列文件中读取属性:
#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。
更多相关文章
- Android4: 旋转屏幕时禁止Activity重启
- Android:AIDL简单使用
- android自定义属性之format介绍
- android 动画
- Android(安卓)init.rc init.vendor.rc 介绍
- android一些坑与小技巧
- 系出名门Android(4) - 活动(Activity), 服务(Service), 广播(Bro
- 原生Android也能做Web开发了
- APP开发实战95-动态Vector基础