Android init进程作为用户空间第一个进程,做了很多系统初始化工作,其核心分为两块:一是属性,二是init.rc。此外,在具体的项目过程中,常和init进程打交道,里面有不少技术细节值得我们研究清楚。
- 属性key-value大小限制
bionic/libc/include/sys/System_properties.h
#define PROP_NAME_MAX 32
#define PROP_VALUE_MAX 92
key最大为32个字节,末位\0还要占一个字节,所以真正用于key的最大字串为31。即key = persist.system.donotallow.secsim(32Bytes) 时,会报错。
同理value最大为91Bytes。
- 属性前缀的作用
通常,属性都带有前缀,如ro.config、persist.xxx等。
对于ro前缀,只读属性,即第一次设置之后,以后都不能再改变。
if(pi != 0) {
/* ro.* properties may NEVER be modified once set */
if(!strncmp(name, "ro.", 3)) return -1;
persist前缀属性在初始加载属性时须注意,default属性未加载完成时,不能将其写入文件中,以免覆盖文件中的属性值。
对于persist前缀,在设置属性的同时,还会将其写到/data/property/persist.xxx文件中,在系统重启时,将该属性值恢复到上机关机时的状态。那么什么时候加载的这些persist属性?
on property:vold.decrypt=trigger_load_persist_props
load_persist_props
void load_persist_props(void)
{
load_override_properties();