Android11 Property Service 解析

PropertyService是Android系统中用于设置全局属性的服务,它通过socket通信在客户端和服务端之间传递信息。在关机流程中,property_set函数被用来触发shutdown,通过epoll机制和回调函数处理,最终调用reboot_utils.cpp中的reboot系统调用来实现关机。
摘要由CSDN通过智能技术生成

Property Service用来设置系统的全局属性,

使用示例如下:

property_set(“ctl.stop”, “runtime”);
property_set(“ctl.stop”, “zygote”);
property_set(“ctl.start”, “zygote”);
property_set(“ctl.start”, “runtime”);
property_set(“service.bootanim.exit”, “0”);
property_set(“service.bootanim.progress”, “0”);
开机动画
property_set(“ctl.start”, “bootanim”);
关机重启:
property_set(ANDROID_RB_PROPERTY, property_val);

ro.开头的属性只允许设置一次。
persist.开头的属性会做持久化保存,会一直有效。

Property Service 分为客户端和服务端,通信方式为socket。

Property Service 客户端 :
system/core/libcutils/properties.cpp
bionic/libc/bionic/system_property_set.cpp

Property Service 服务端: system/core/init/property_service.cpp
StartPropertyService 函数创建socket 。

socket 名字 :
static const char property_service_socket[] = “/dev/socket/” PROP_SERVICE_NAME;

下面以关机流程为例说明 Property Service 设置的流程:
调用流程:
system/core/libcutils/properties.cpp#property_set(ANDROID_RB_PROPERTY, property_val) ------------->>>>>>
bionic/libc/bionic/system_property_set.cpp#__system_property_set 发送 PROP_MSG_SETPROP2 给 Property Service 服务端 ,

服务端的处理:

init.cpp 的 SecondStageMain 调用 StartPropertyService 来创建 server socket ,
PropertyServiceThread: 注册 epoll 的回调函数 :

epoll.RegisterHandler(property_set_fd, handle_property_set_fd);

只要 property_set_fd 有 EPOLLIN 事件发生,则调用 property_service.cpp的函数 handle_property_set_fd, 然后后者调用 property_service.cpp的函数HandlePropertySet, 这里会调用以下2个方法:
__system_property_update
__system_property_add
把这个属性和值存入内存中。
NotifyPropertyChange 到 init.cpp 的 PropertyChanged , 如果是关机,则会调用 init.cpp 的 trigger_shutdown 函数。

HandlePropertySet 函数处理:
分别对 ctl 和 sys.powerctl 做特殊处理.

shutdown的处理

对 shutdown的处理是在 init.cpp的 SecondStageMain函数中,也就是在 init的进程中处理的。如果有shutdown cmd到来,则通过 epoll 机制唤醒 init 进程,
代码如下:

static void WakeMainInitThread() {
    uint64_t counter = 1;
    TEMP_FAILURE_RETRY(write(wake_main_thread_fd, &counter, sizeof(counter)));
} 

reboot.cpp的HandlePowerctlMessage 调用 reboot.cpp的 DoReboot ,

DoReboot 函数非常重要:

最后在system/core/init/reboot_utils.cpp中使用 linux 系统调用
reboot(RB_POWER_OFF) 来关机 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值