小程序商城开发价格- 一项创新的数字化解决方案
683
2022-08-30
Android系统10 RK3399 init进程启动(三十三) property属性系统框架
配套系列教学视频链接:
说明
系统:Android10.0
设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
属性系统在Android系统开发中会经常用到, 本章节重点让大家快速了解属性的作用,以及Android系统设计的框架模型。
一, property属性框架介绍
属性是android系统用于为系统提供公共信息, 进程间通信,以及用于行为控制的键值对, key一般都是以点分格式存在, 如[ro.kernel.lcd.width]: [720], 同时键值对一般存放在共享内存中供各个进程使用, 网上最简单, 最基本的模型如下所示:
其实Android老版本就是这样设计的, 作为开发使用属性, 理解上面模型基本也足够了, 但是新版本Android系统, 在上面的基础做了部分改动, 主要增加了selinux权限控制, 新框架模型如下所示:
主要分成以下部分:
Property service, 作为服务端,其实就是init进程,通过epoll机制处理socket的请求, 负责修改各个共享内存中的属性值。Property client, 作为客户端,其实就是各种想获取和修改属性的进程,通过socket发送请求来修改属性,获取属性不需要套接字, 但是需要一定的selinux权限。属性文件,包含了系统默认的属性,如/system/build.prop, /default.prop文件。属性信息文件, /dev/__properties__/property_info文件, 汇总了所有的属性文件中的属性, selinux信息, 而这些信息又来自于system, vendor,odm等分区的property_contexts文件。Selinux属性文件: /dev/__properties__/u:object_r:xxx:s0, 存储了拥有相同selinux安全上下文的属性,修改和获取属性,其实就是修改和和获取此文件的属性。也是这个模型中的共享内存,固定128k大小
二, 属性的存储方式
属性存储在Selinux属性文件(如/dev/__properties__/u:object_r:xxx:s0), 该文件创建在内存中, 里面内容主要是以字典树的形式存储, 包括属性名字和属性的值, 在Android 源码中有注释:
bionic/libc/system_properties/include/system_propertie/prop_area.h
示意图:
整个树是存储在文件中(共享内), class prop_area表示这块内存区域, struct prop_bt 表示树杈, struct prop_info表示树叶,用于存放实际的key和value,字典树存储会利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较,查询效率比哈希树高, 典型应用就是用于统计,排序和保存大量的字符串(不仅限于字符串),经常被搜索引擎系统用于文本词频统计 。
字典树的概念, 大家可以大体了解一下, 有三个基本性质:
1、根节点不包含字符,除根节点外每一个节点都只包含一个字符2、从根节点到某一个节点,路径上经过的字符连接起来,就是该节点对应的字符串3、每个节点的所有子节点包含的字符都不相同,也就是找到对应单词、字符是唯一的。
字典树模型:
保存”big”和 “bit”时,由于它们的前2个字母是相同的,所以希望它们共享这些字母,而只对剩下的部分进行分开存储。可以很明显地发现,字母树很好地利用了串的公共前缀,节约了存储空间。
三,详细的框架模型
上面的模型基本了解就够了, 如果需要了解init启动过程的初始化部分, 可以参考如下框架, 初学属性系统的时候, 可以不需要太去深究这个模型, 主要是让大家知道, 属性系统用起来很简单, 但是设计的其实比较复杂:
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~