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) 来关机 。