写文章不应太多拘泥于细节:
从 Jelly Bean 到 KitKat 版本, properties
的存储的数据结构还是有些变化的.
实际存储位置: /dev/__properties__ 文件 (root RW, 其他只能 R)
1
2
| ls -al /dev/__proper*
-rw-r--r-- root root 65536 1970-01-14 05:26 __properties__
|
关于 Jelly Bean(或者以前的), 直接上张图,比较明了:
先看下相关结构的定义:
system/core/init/property_service.c1
2
3
4
5
| typedef struct {
void *data;
size_t size;
int fd;
} workspace;
|
bionic/libc/bionic/system_properties.c 1
2
3
4
5
6
7
8
9
10
11
12
13
14
| struct prop_area {
unsigned volatile count;
unsigned volatile serial; //不知道这个是干什么的?
unsigned magic;
unsigned version;
unsigned reserved[4];
unsigned toc[1];
};
struct prop_info {
char name[PROP_NAME_MAX];
unsigned volatile serial;
char value[PROP_VALUE_MAX];
};
|
toc[i] 里面存放的是 property name 的长度 (前 8 位) 和对应 proper_info 对应的地址 (后 24位)。
proper_info 的 serial (前 8 位) 保存的是 property value 的 length。
但是有几个问题:
- 大小是不对的 , Jelly Bean 上大小是 65536, 可以放 495 个 properties.
system/core/init/properties_service.c1
2
3
4
5
6
| /* (8 header words + 495 toc words) = 2012 bytes */
/* 2016 bytes header and toc + 495 prop_infos @ 128 bytes = 65376 bytes */
#define PA_COUNT_MAX 495
#define PA_INFO_START 2016
#define PA_SIZE 65536
|
- share memory 是不对的, 这个图在 init 进程里面没什么问题。但是其他进程访问(读取的时候) 其实是将同样的文件(/dev/__properties__) map 了一份到自己的内存空间。所以每个进程的这个结构是自己的,不是共享的。
KitKat :
KK 上总大小是 128*1024
数据结构:
bionic/libc/bionic/system_properties.c1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| struct prop_area {
unsigned bytes_used;
unsigned volatile serial;
unsigned magic;
unsigned version;
unsigned reserved[28];
char data[0];
};
struct prop_info {
unsigned volatile serial;
char value[PROP_VALUE_MAX];
char name[0];
};
struct prop_bt {
uint8_t namelen;
uint8_t reserved[3];
prop_off_t prop;
prop_off_t left;
prop_off_t right;
prop_off_t children;
char name[0];
};
|
Kitkat 上 proper info 的存储已经改为 bTree 了,bytes_used 用来记录存储这些信息所使用的空间。
bionic/libc/bionic/system_properties.c1
2
3
4
5
6
7
8
9
| * +-----+ children +----+ children +--------+
* | |-------------->| ro |-------------->| secure |
* +-----+ +----+ +--------+
* / \ / |
* left / \ right left / | prop +===========+
* v v v +-------->| ro.secure |
* +-----+ +-----+ +-----+ +-----------+
* | net | | sys | | com | | 1 |
* +-----+ +-----+ +-----+ +===========+
|
好了, 就到这里吧! 感谢 ~
参考文档: http://rxwen.blogspot.com/2010/01/android-property-system.html