Android system property运作流程源码分析

一.序

前文分析了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发送消息,更改系统属性值。
属性系统设计的关键就是:跨进程共享内存的实现。

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

相关推荐
张拭心30 分钟前
工作九年程序员的三月小结
android·前端
每次的天空32 分钟前
Flutter学习总结之Android渲染对比
android·学习·flutter
鸿蒙布道师3 小时前
鸿蒙NEXT开发土司工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
智想天开3 小时前
11.使用依赖注入容器实现松耦合
android
yunteng5214 小时前
音视频(四)android编译
android·ffmpeg·音视频·x264·x265
tangweiguo030519874 小时前
(kotlin) Android 13 高版本 图片选择、显示与裁剪功能实现
android·开发语言·kotlin
匹马夕阳4 小时前
(一)前端程序员转安卓开发分析和规划建议
android·前端
Kika写代码5 小时前
【Android】UI开发:XML布局与Jetpack Compose的全面对比指南
android·xml·ui
Android 小码峰啊5 小时前
Android Fresco 框架扩展模块源码深度剖析(四)
android
橘猫云计算机设计6 小时前
基于springboot放松音乐在线播放系统(源码+lw+部署文档+讲解),源码可白嫖!
android·java·spring boot·后端·spring·微信小程序·毕业设计