Android system property运作流程源码分析

news2024/11/27 16:40:07

一.序

前文分析了build.prop这个系统属性文件的生成,每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性,这里主要记录在java层或者c++层如果使用,以及整个system_property运作流程。

二.java层调用

源码位于/frameworks/base/core/java/android/os/SystemProperties.java中:

Get属性:
在这里插入图片描述

Set属性:
在这里插入图片描述

都会调用本地接口:
在这里插入图片描述

该接口类在初始化运行环境中注册对应的cpp接口android_os_SystemProperties.cpp,实际操作通过JNI调用的是cpp文件对应的接口:/frameworks/base/core/jni/AndroidRuntime.cpp中:
在这里插入图片描述

/frameworks/base/core/jni/android_os_SystemProperties.cpp中JNI:
在这里插入图片描述

以set属性为例,调用:
在这里插入图片描述
调用到/system/core/libcutils/properties.c中的property_set(key, val)。以java层的理解到这里就OK!

三.c++层的调用

/system/core/libcutils/properties.c中的:
在这里插入图片描述

到/bionic/libc/bionic/system_properties.c中:
在这里插入图片描述

通过一个普通的TCP(SOCK_STREAM)套接字进行通讯:
在这里插入图片描述
以上是作为client端,通过socket向service发送消息。

四.property_service服务的启动

property_service 服务的启动是在android初始化的时候在/system/core/init/init.c时建立:
在这里插入图片描述

由init守护进程分配一个共享内存区来存储这些属性:
property_init()
property_load_boot_defaults()

进程在启动时,会加载动态库bionic libc库
__libc_preinit在bionic libc库加载的时候会被调用
并且通过__libc_preinit(…)——> __libc_init_common(…)——>__system_properties_init();
由/bionic/libc/bionic/system_properties.c中的__system_properties_init()来初始化属性系统的共享内存。
在这里插入图片描述

从property_service_init_action调用到/system/core/init/property_service.c中的启动函数:
在这里插入图片描述

可以看到,在这里加载了系统属性文件到共享内存,文件定义在/bionic/libc/include/sys/_system_properties.h:
在这里插入图片描述

五.property_service服务消息处理

/system/core/init/property_service.c
handle_property_set_fd():
在这里插入图片描述
接收socket请求连接,接收属性请求数,处理信息:
可以看到如果接收到的信息是以“ctl”开头,进行check_control_perms(msg.value, cr.uid, cr.gid, source_ctx)鉴权处理。
这里的传入消息值,发送消息进程的uid以及gid。
在/system/core/include/private/android_filesystem_config.h中有各种权限的定义。
有权限 就执行/system/core/init/init.c中的:
在这里插入图片描述

这个是用来 开启和关闭或者重启服务!

else有权限则执行 /system/core/init/init.c中的:
property_set():
可以看到会判断是否以“ro”字符串开头,如果接收到的消息值,也就是要set的属性值以这个作为开头,就代表只读,不能被改变.
如果共享内存中有则update_prop_info(pi, value, valuelen);没有就保存到内存中。

如果属性是有“net.”字符串开头,当设置这种属性的时候,“net.change”这条属性也会被自动设置,其内容设为最后更新过的属性名,用来记录net.*属性上面的变化。
如果属性是有“persist.”字符串开头,那么就认为是驻留属性,当修改的时候同时也会写进/data/property文件中。
最后调用property_changed(name, value),通知属性已经改变,更新属性,仅仅在运行时可用的属性不需要调用这个方法,除非它们能被数据绑定。
到这里property_service服务已经大体分析完!

六.adb shell 命令

adb shell getprop 列出系统所有属性
adb shell getprop | grep lcd 列出包含lcd的属性
adb shell setprop 修改指定的系统属性

七.属性系统设计

属性系统的上层架构如下图所示:
在这里插入图片描述
Property Service运行在init进程中,开机从属性文件中加载到共享内存中;设置系统属性通过socket与Property Service通信。
Property Consumer进程将存储系统属性值的共享内存,加载到当前进程虚拟空间中,实现对系统属性值的读取。
Property Setter进程修改系统属性,通过socket向Property Service发送消息,更改系统属性值。
属性系统设计的关键就是:跨进程共享内存的实现。

觉得本文对您有用,麻烦点赞、关注、收藏,您的肯定是我创作的无限动力,谢谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1659501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ITK配准】第十六期 2D中BSpline可变形多分辨率配准样例

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK配准中的2D中BSpline可变形多分辨率配准,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 2…

文件摆渡系统与传统文件交换有什么区别|好用的文件摆渡系统分享

一、文件摆渡系统与传统文件交换方式的区别 文件摆渡系统与传统文件交换方式在多个方面存在显著的区别。随着信息化和网络化的发展,文件交换的方式也在不断演进,从传统的物理介质交换到现代化的网络交换,文件摆渡系统作为其中的一种重要方式…

PT:pt write_change to innovus 脚本

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 #!usr/bin/perl open rf,"$ARGV[0]"; open wf,">test. tcl"; while (<rf>) { s/\[(\D[^\s\]]*)?\]/\\\[$1\\\]/g; if (/c…

CountDownLatch应用场景代码练习

目录 概念原理核心参数和方法两种应用场景实现代码应用一&#xff1a;让 主任务 等待 所有子任务执行完毕后&#xff0c;再继续执行执行结果应用二&#xff1a;让所有子任务同时执行&#xff0c;打印出发时间执行结果应用二&#xff08;扩展&#xff09;&#xff1a;让所有子任…

React:Router-2. createBrowserRouter函数式

参考文档&#xff1a;ReactRouter官网 前边的文章 BrowserRouter组件式路由 提供了组件式路由的方式&#xff0c;在react-router6.4.0及以上版本&#xff0c;提供了 createBrowserRouter 函数式路由创建方式。 一、创建路由 1. 新建router.js文件&#xff0c;使用createBrow…

WPF容器控件之dockpanel、布局控件

dockpanel 容器控件&#xff0c;对其子元素进行或者水平垂直排布&#xff0c;也可以叫停靠面板,也可以让子元素停靠到容器某一个边上&#xff0c;拉伸元素拾起充满全部的高度或者宽度&#xff0c;也可以使最后一个子元素是否铺满剩余的空间。 参数 LastChildFill最后一个子元素…

引用数据类型 栈内存 堆内存

let m { a: 10, b: 20 }; let n m; n.a 15; console.log(m.a) // 15 原因&#xff1a;基本数据类型存储在栈内存中&#xff0c;引用数据类型存储在堆内存中 &#xff0c;引用数据类型存储在堆内存中会在栈内存中创建一个指针&#xff0c;栈内存中的这个指针指向堆内存中的地…

二.Django--创建多个APP路由映射

目录 1-创建项目 2-创建多个APP 3-注册APP 4-创建"前端页面"并做路由映射 各个APP里面的views.py写视图函数等等 1-创建项目 django-admin startproject 项目名 django-admin startproject my_project 2-创建多个APP python manage.py startapp app名 pyth…

遥控挖掘机之ESP8266调试心得(1)

ESP8266调试心得 1. 前言2.遇到的问题2.1 ESP8266模块建立TCP连接时候报错2.2 指令异常问题 3. 更新ESP8266固件3. ESP8266的部分AT指令3. 连接步骤3.1 模块与电脑连接3.2.1 电脑上的设置3.2.2 ESP8266模块作为客户机&#xff08;TCP Cilent&#xff09;的设置步骤 3.2 模块与模…

云计算:数据时代的魔法城堡

云端初探&#xff1a;定义与起源 想象一下&#xff0c;有一个巨大的、无形的仓库&#xff0c;里面存放着全世界的信息与计算能力&#xff0c;你可以随时随地按需提取&#xff0c;无需关心它的物理位置或维护细节。这就是云计算——一种基于互联网的计算方式&#xff0c;它通过…

Hive UDTF之explode函数、Lateral View侧视图

Hive UDTF之explode函数 Hive 中的 explode() 函数是一种用于处理数组类型数据的 User-Defined Table-Generating Function (UDTF)。它将数组拆分成多行&#xff0c;每个数组元素对应生成的一行数据。这在处理嵌套数据结构时非常有用&#xff0c;例如处理 JSON 格式的数据。 …

CentOS 自建gitlab仓库:安装相关工具

所需环境 Node 安装项目依赖、项目打包运行Nginx 前端项目部署&#xff08;正向代理、反向代理、负载均衡等&#xff09;Git 自动化部署时 拉取代码使用GitLab 代码仓库GitLab-Runner GitLab的CI/CD执行器 一、安装Node 检测是否已安装 常用node -v 命令检测。 如果已安装&a…

web前端学习笔记9

9. HTML5新增元素及属性 9.1 HTML5新增结构元素 HTML5引入了几个新的结构元素,极大地改善了网页的组织和结构方式。以下是HTML5中的一些关键新结构元素: 标签说明<header>页面或页面中某一个区块的页眉,通常是一些引导和导航信息<nav>可以作为页面导航的链接组&…

C# WinForm —— 12 ListBox绑定数据

ListBox加载大量数据时&#xff0c;避免窗体闪烁的方法&#xff1a; 在加载语句的前后分别加上 BeginUpdate()方法 和 EndUpdate()方法 指定一个集合为绑定的数据源 1. 首先&#xff0c;右键项目&#xff0c;添加类 2. 在新建的类文件中添加属性值信息 3. 构建初始化的对象…

算法设计课第五周(贪心法实现活动选择问题)

目录 一、【实验目的】 二、【实验内容】 三、实验源代码 一、【实验目的】 &#xff08;1&#xff09;熟悉贪心法的设计思想 &#xff08;2&#xff09;理解贪心法的最优解与正确性证明之间的关系 &#xff08;3&#xff09;比较活动选择的各种“贪心”策略&#xff0c;…

CSP-j 2022csp-j完善程序易错题

易错题 答案23&#xff1a; 对 解析23&#xff1a; 函数 g 就是把函数 f 改成递推的形式 答案24&#xff1a; 对 解析23&#xff1a; 无。 答案25&#xff1a; C 解析25&#xff1a; m n ( m - 1 ) * ( 1 2 3 4 ... n ) O(mn^2) 答案26&#xff1a; C 解析26&#x…

软件设计师笔记(二)-零碎要点

本文内容来自笔者学习zst 留下的笔记&#xff0c;都是零碎的要点&#xff0c;查缺补漏&#xff0c;若有错误请大家提出&#xff0c;希望大家都能通过&#xff0c;记得加上免费的关注&#xff01;谢谢&#xff01; 目录 1. 算法 [广度和深度优先] 2. 遍历方式 3. 四大算法 …

RuoYi-Vue-Plus (Echarts 图表)

一、echarts 图表介绍和使用 官网地址:目前echarts以及贡献给Apache Apache EChartshttps://echarts.apache.org/zh/index.htmlecharts配置项手册 Documentation - Apache EChartshttps://echarts.apache.org/z

第19讲:Ceph集群CrushMap规则定制与调优:从基础到高级应用

文章目录 1.CrushMap规则拓扑结构1.1.集群默认的CrushMap规则拓补图1.2.自定义的CrushMap规则拓补图 2.定制CrushMap规则的方法以及注意事项3.通过二进制文件编写一套CrushMap规则3.1.将系统默认的CrushMap规则导出3.2.根据需求编写CrushMap规则3.3.将编写好的规则导入到集群中…

简单粗暴的翻译英文pdf

背景&#xff1a;看书的时候经常遇到英文pdf&#xff0c;没有合适的翻译软件可以快速翻译全书。这里提供一个解决方案。 Step 1 打开英文pdfCTRLA全选文字CTRLC复制打开记事本CTRLV复制保存为data.txt Step 2 写一个C脚本 // ToolPdf2Html.cpp : 此文件包含 "main&quo…