android 属性用于记录系统或者进程设置之间信息交换。
1.介绍
属性整个系统可见的。每个进程都可见get/set (System.getProperty(),System.setProperty())属性。
- a.编译过程将系统参数汇总到build.proc和default.proc和default
- b.系统在开机读取配置并构建缓冲区,加快查询。
- c.SettingProvider会在系统第一次初始化(刷机第一次启动),将从Defaults.xml中读取并写入Setting.db目录.
2.属性类型
- a.不可变性:”ro.”,开头,只读属性。
- b.持久型 : “persist.”开头,当设置这个属性,其值将写入/data/property
- c.网络型 :”net.”开头,当设置这个属性,”net.change”属性自动设置,加入最后修改的属性。
netresolve模块使用这个属性来追踪net.*属性上任何变化。 - d.启动停止:”ctl.start”和”ctl.stop”用于启动和停止服务。
每一项服务必须在/init.rc中定义,init守护进程将解析init.rc和启动属性服务.
设置”ctrl.start”属性请求,属性服务将用属性值,启动该服务。
这项服务启动结果将会放入”init.svc.<服务名>”属性中。客服端应用程序轮询那个
属性值,确定结果。
setprop ctl.start bootanim
setprop ctl.stop bootanim
3.设置属性方法
- a.获取和设置属性:setprop和getprop。java中用System.getProperty()和System.setProperty();
- b.init.rc中Action也可以监控属性变化关联。
#adb on at boot in emulator
on property:ro.kernel.qemu=1
start adbd
on property:persist.service.adb.enable=1
start adbd
on property:persist.service.adb.enable=0
stop adbd
4.properties source
属性设置可以出现在 make android
任何环节。
\buile\target\board\generic_arm64\system.prop
\build\target\product\core.mk
\build\tools\buildinfo.sh
编译好后,设置属性主要在
\default.prop 手机厂商自己定制
\system\build.prop 系统属性主要放置地方
\system\default.prop 存放与secutity相关的属性
\data\property 里面保存以”persist”开头的属性。”persist”属性都会保存副本在这里。
5.属性运行
5.1 属性初始化
linux kernel启动时,Android分配一个共享区来存储属性。system/core/init
启动一个属性服务,等待客户端连接设置。属性服务将在共享内存中修改和创建属性。客服端想获得属性信息,可以从共享内存直接读取,提高读取性能。
/system/core/libcutils
中properties.c里面API
load_properties_from_file("/default.prop")
将文件中所有java环境使用到的propt释放到这个共享内存中。
5.2扩大系统属性
Android 默认属性系统有247笔properties.大量写入容易导致system mmap
和kernel ashmem
中ashmem中缓存ashmem溢出。
#define PA_COUNT_MAX N
#define PA_INFO_START ((8+PA_COUNT_MAX)*4)
#define PA_SZE (PA_INFO_START+(128*PA_COUNT_MAX))
5.3属性控制
其中serviceName可在init.rc查询
SystemProperties.set("ctl.start",serviceName)
SystemProperties.set("ctl.stop",serviceName)
5.4属性安全性
作为一个共享缓存系统,并非任何AP随意修改其中的属性。针对这些属性,如果进行更改是,会用UID约束。如persist.sys开头属性,只有system用户(root)进行修改,其他用户无法修改
persist属性是固定的。修改后重启会保持原来的。
机顶盒自己测:
setprop persist.hang zhou
getprop persist.hang #输出zhou
冷热重启属性依然存在的。
6.setting provider
android framework还定义了setting provider来对一些比较通用数据进行初始化。并写入Setting.db,其中属性内容写在defaults.xml中settingProvider通过DatabaseHelper将数据读入Setting.db,同时SettingProvider作为Setting.db的Provider,所有对该数据库操作都要通过它来进行。Settings提高访问效率,建立cache,只有cache找不到时,才会调用SettingProvider去查询数据库。关键System表中数据有:一般通过修改defaults.xml和make配置文件即可。
7.关于设备的属性
about phone一些关键属性通过buildinfo.sh(make-build),可以修改\build\tools\buildinfo.sh来修改显示的情况。