新京葡娱乐场网址Android系统属性(c接口)

在android
系统中,为统一管理系统的属性,设计了一个统一的属性系统。每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。

 

属性是在整个系统中全局可见的。每个进程可以get/set属性。在编译的过程中会将各种系统参数汇总到build.proc
以及default.proc 这两个文件中,主要属性集中在build.proc中。

  1、简介

系统属性根据不同的应用类型,分为不可变型,持久型,网络型,启动和停止服务等。

  在android 系统中,为统一管理系统的属性,设计了一个统一的属性系统。每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。在编译的过程中会将各种系统参数汇总到build.proc 以及default.proc 这两个文件中,主要属性集中在build.proc中。系统在开机后将读取配置信息并构建共享缓冲区,加快查询速度。另外一个方面,SettingsProvider会在系统第一次初始化时(刷机第一次启动)后,将从Defaults.xml中读取数据然后写入数据库Settings.db 目录。并构建一个缓冲系统供其他应用查询。下面将详细讲述。

属性描述
以“ro.”开头只读属性一旦设置,属性值不能改变
以“persist.”开头设置这个属性时,其值也将写入/data/property。
以“net.”开头设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。
“ ctrl.start ”启动服务
“ ctrl.stop ”停止服务

新京葡娱乐场网址 1

启动属性描述:

  2Properties Type

每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“
ctrl.start
”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“
init.svc.<服务名>“属性中
。客户端应用程序可以轮询那个属性值,以确定结果。

  系统属性根据不同的应用类型,分为不可变型,持久型,网络型,启动和停止服务等。

在linux kernel
启动时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代码位于:system/core/init。

   特别属性:

“init”守护进程将启动一个属性服务。属性服务在“init”守护进程中运行。

  属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。

每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。

  属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。

属性服务将会在共享内存区中修改和创建属性。客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。

  属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)

客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。

  属性“ ctrl.start ”和“ ctrl.stop
”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“
ctrl.start
”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“
init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。

int property_get(const char *key, char *value, const char *default_value);

  3Android toolbox

源码使用实例:安卓源码external/avb/boot_control/boot_control_avb.c中55Line:

  Android
toolbox程序提供了两个工具: setprop和getprop获取和设置属性。其使用方法:

新京葡娱乐场网址 2image.png

  getprop <属性名>

int property_set(const char *key, const char *value);

  setprop <属性名> <属性值>

源码使用实例:安卓源码frameworks/native/cmds/rawbu/backup.cpp中728Line:

  Java

新京葡娱乐场网址 3image.png

  在Java应用程序可以使用System.getProperty()和System.setProperty()函数获取和设置属性。

  Action

  默认情况下,设置属性只会使"init"守护程序写入共享内存,它不会执行任何脚本或二进制程序。但是,您可以将您的想要的实现的操作与init.rc中某个属性的变化相关联.例如,在默认的init.rc中有:

 

# adbd on at boot in emulator on property:ro.kernel.qemu=1 start adbdon property:persist.service.adb.enable=1 start adbdon property:persist.service.adb.enable=0 stop adbd

 

 

  4Properties Source

  原则上,属性的设置可以出现在make
android的任何环节。目前Properties 的设置以oppo版本为例:

  alps\build\target\board\generic_arm64\ system.prop

  alps\build\target\product\core.mk

  alps\build\tools\buildinfo.sh

  编译好后,被设置的系统属性主要存放在:

  这样,如果你设置persist.service.adb.enable为1 ,"init"守护程序就知道需要采取行动:开启adbd服务。

  \
default.prop                                                       手机厂商自己定制使用

  \system\build.prop                                            
  系统属性主要存放处

      \system\default.prop                                            
default properties, 有存放与security 相关的属性

     
\data\local.prop                                                    目前还没有看到有内置的情况

       \data\property下有4个prop文 件:persist.sys.timezone,
persist.sys.language, persist.sys.country,
persist.sys.localevar, 里面保存着属性名称以“persist.”开头的属性值。用户的persist 开头的属性都会保存副本在这个目录下

 

  5Properties Run

    5.1    Properties init.

  在linux
kernel 启动时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代码位于:system/core/init。“init”守护进程将启动一个属性服务。属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和创建属性。客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。

  客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。libcutils的源代码位于:system/core/ibcutils。获取和设置属性的代码在properties.c里面,读取属性通过读共享内存得到,设置属性通过发送请求到property_service进行设置。API函数是:

int property_get(const char *key, char *value, const char *default_value);int property_set(const char *key, const char *value);int property_list(void(*propfn)(const char * key, const char * value, void * cookie), void * cookie);system/core/init. c= > main( ) 进程将调用= > property_init= > init_property_areavoid property_init( void ) {//ashmem_area - android shared memory area是android共享内容存的一种方式//打开ashmem设备,申请一段size大小的kernel空间内存,不去释放,以便供所有用户空间进程共享.//内核驱动位于linux/mm/ashmem.c文件[luther.gliethttp]. init_property_area( ) ; //#define PROP_PATH_RAMDISK_DEFAULT "/default.prop"//从ramdisk中读取default.prop文件,将文件中的所有java环境中使用到的propt释放到//这个共享内存中. load_properties_from_file( PROP_PATH_RAMDISK_DEFAULT) ;}

 

  后面将调用properties_service.c, 启动最原始的properties service.

  然后通过libc_init_common.
c, 的__system_properties_init函数完成内核的初始化工作。

  5.2、属性的访问

如果在C/C++ 层次,则可以使用libcutils 的下列函数来访问。

int property_get(const char *key, char *value, const char *default_value);int property_set(const char *key, const char *value);int property_list(void(*propfn)(const char * key, const char * value, void * cookie), void * cookie);

  如果在Java 层次,则可以使用System.getProperties/setProperties. 该方法(set/get)实际将调用SystemProperties.java 进行访问,而SystemProperties.java 通过jni 调用libcutils进行访问。

 

    5.3、Enlarge System Property

  Android Default System
Property 默认是可以存储247笔 properties. 但因为我司有大量的数据被写入到这个system
property 中,导致容易出现system property mmap 到kernel
ashmem中的缓存ashmem 溢出。一方面需要确认数据是否确实有必要写入System
property, 另外一方面,可以扩大缓存的区间。

缓存区间可以分成两大部分(byte), Info Area , Array Area. Info
Area 又分成Header 和 Name Mapping Area.

8 Header *4

Every Property Name Mapping * 4

Every Value row and the max length is 127

因为,给出固定的最大笔数N. 缓存定义上要求

#define PA_COUNT_MAX N#define PA_INFO_START ((8+PA_COUNT_MAX) * 4) 最好保证这个值为32的整数倍#define PA_SZE (PA_INFO_START + (128 * PA_COUNT_MAX))

 

 

   5.4、控制属性

  在system properties 中提供两个特殊的key,
ctl.start 和 ctl.stop 来启动和关闭服务。

其API 描述是:

SystemProperties.set(“ctl.start”,serviceName);SystemProperties.set(“ctl.stop”,serviceName);

 

注意的是,这个serviceName 可在init.rc 中查询

 

  5.5、Init 属性

  Init 属性是System
properties 中的一种特殊的属性,由init.c 定义,init 会监控定义在init.rc 中的服务,并定义init.svc.xxxx 的System
properties.

具体实现,可参考init.c 中的notify_service_state 函数。

我们除了直接ps 来查看这些进程信息外,还可以直接通过查看system
properties 来确认这些服务的状态,如

[init.svc.bootlogoupdater]: [stopped][init.svc.pvrsrvinit]: [stopped][init.svc.servicemanager]: [running][init.svc.vold]: [running][init.svc.netd]: [running][init.svc.netdiag]: [running][init.svc.hald]: [running][init.svc.debuggerd]: [running][init.svc.zygote]: [running][init.svc.drmserver]: [running][init.svc.media]: [running][init.svc.dbus]: [running][init.svc.installd]: [running][init.svc.keystore]: [running][init.svc.console]: [running][init.svc.adbd]: [running][init.svc.ril-daemon]: [running]

 

 

  5.6 、属性安全性

作为一个共享的缓存系统,并非任何AP 都可以随意去修改其中的属性,针对这些属性,如果进行更改时,会有UID上的约束。

/* White list of permissions for setting property services. */struct { const char *prefix; unsigned int uid; unsigned int gid;} property_perms[] = { { "net.rmnet0.", AID_RADIO, 0 }, { "net.gprs.", AID_RADIO, 0 }, { "net.ppp", AID_RADIO, 0 }, { "net.qmi", AID_RADIO, 0 }, { "net.lte", AID_RADIO, 0 }, { "net.cdma", AID_RADIO, 0 }, { "ril.", AID_RADIO, 0 }, { "gsm.", AID_RADIO, 0 }, { "persist.radio", AID_RADIO, 0 }, { "net.dns", AID_RADIO, 0 }, { "sys.usb.config", AID_RADIO, 0 }, { "net.", AID_SYSTEM, 0 }, { "dev.", AID_SYSTEM, 0 }, { "runtime.", AID_SYSTEM, 0 }, { "hw.", AID_SYSTEM, 0 }, { "sys.", AID_SYSTEM, 0 }, { "sys.powerctl", AID_SHELL, 0 }, { "service.", AID_SYSTEM, 0 }, { "wlan.", AID_SYSTEM, 0 }, { "gps.", AID_GPS, 0 }, { "bluetooth.", AID_BLUETOOTH, 0 }, { "dhcp.", AID_SYSTEM, 0 }, { "dhcp.", AID_DHCP, 0 }, { "debug.", AID_SYSTEM, 0 }, { "debug.", AID_SHELL, 0 }, { "log.", AID_SHELL, 0 }, { "service.adb.root", AID_SHELL, 0 }, { "service.adb.tcp.port", AID_SHELL, 0 }, { "persist.logd.size",AID_SYSTEM, 0 }, { "persist.sys.", AID_SYSTEM, 0 }, { "persist.service.", AID_SYSTEM, 0 }, { "persist.security.", AID_SYSTEM, 0 }, { "persist.gps.", AID_GPS, 0 }, { "persist.service.bdroid.", AID_BLUETOOTH, 0 }, { "selinux." , AID_SYSTEM, 0 }, { "wc_transport.", AID_BLUETOOTH, AID_SYSTEM }, { "build.fingerprint", AID_SYSTEM, 0 }, { "partition." , AID_SYSTEM, 0},#ifdef DOLBY_UDC { "dolby.audio", AID_MEDIA, 0 },#endif // DOLBY_UDC#ifdef DOLBY_DAP // used for setting Dolby specific properties { "dolby.", AID_SYSTEM, 0 },#endif // DOLBY_DAP { "sys.audio.init", AID_MEDIA, 0 }, { NULL, 0, 0 }};

 

具体的UID 映射为:

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。