• Android系统10 RK3399 init进程启动(三十三) property属性系统框架


     配套系列教学视频链接:

          安卓系列教程之ROM系统开发-百问100ask

    说明

    系统:Android10.0

    设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)

    前言

    属性系统在Android系统开发中会经常用到, 本章节重点让大家快速了解属性的作用,以及Android系统设计的框架模型。


    一, property属性框架介绍

       属性是android系统用于为系统提供公共信息, 进程间通信,以及用于行为控制的键值对, key一般都是以点分格式存在, 如[ro.kernel.lcd.width]: [720], 同时键值对一般存放在共享内存中供各个进程使用,  网上最简单, 最基本的模型如下所示:


    其实Android老版本就是这样设计的, 作为开发使用属性, 理解上面模型基本也足够了, 但是新版本Android系统, 在上面的基础做了部分改动, 主要增加了selinux权限控制, 新框架模型如下所示:

    主要分成以下部分:

    1. Property service, 作为服务端,其实就是init进程,通过epoll机制处理socket的请求, 负责修改各个共享内存中的属性值。
    2. Property client, 作为客户端,其实就是各种想获取和修改属性的进程,通过socket发送请求来修改属性,获取属性不需要套接字, 但是需要一定的selinux权限。
    3. 属性文件,包含了系统默认的属性,如/system/build.prop, /default.prop文件。
    4. 属性信息文件, /dev/__properties__/property_info文件, 汇总了所有的属性文件中的属性, selinux信息, 而这些信息又来自于system, vendor,odm等分区的property_contexts文件。
    5. 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启动过程的初始化部分, 可以参考如下框架, 初学属性系统的时候, 可以不需要太去深究这个模型, 主要是让大家知道, 属性系统用起来很简单, 但是设计的其实比较复杂:

  • 相关阅读:
    Java基础知识第四讲:Java 基础 - 深入理解泛型机制
    Spring Cloud Gateway中的GlobalFilter:构建强大的API网关过滤器
    SharedPreference使用
    深度学习机器学习面试题——自然语言处理NLP,transformer,BERT,RNN,LSTM
    netty系列之: 在netty中使用 tls 协议请求 DNS 服务器
    Flink RowData 与 Row 相互转化工具类
    离线语音与IoT结合:智能家居发展新增长点
    数据库事务到底是什么?
    信息安全服务资质CCRC和信息安全管理体系ISO27001有什么区别?
    07 ConfigMap/Secret:怎样配置、定制我的应用
  • 原文地址:https://blog.csdn.net/ldswfun/article/details/126129569