SystemProperties.set方法可以设置系统属性,通过设置系统属性可以启动一些服务和操作,如关机,重启、uncrypt服务等。下面将分析为什么设置系统属性,可以做到即时生效某些操作。
下面将以SystemProperties.set(“ctl.start”, “uncrypt”);为例说明整个流程。
一、属性服务客户端
1.1 SystemProperties.set
[->SystemProperties.java]
1 | /** |
1.2 SystemProperties_set
[->android_os_SystemProperties.cpp]
1 | void SystemProperties_set(JNIEnv *env, jobject clazz, jstring keyJ, |
1.3 SetProperty
[->properties.cpp]
1 | bool SetProperty(const std::string& key, const std::string& value) { |
1.4 system_property_set
[->system_property_set.cpp]
1 | int __system_property_set(const char* key, const char* value) { |
1.5 send_prop_msg
[->system_property_set.cpp]
1 | static int send_prop_msg(const prop_msg* msg) { |
static const char property_service_socket[] = “/dev/socket/“ PROP_SERVICE_NAME;
这里通过property_service建立socket的连接,将key,value发送到property_service。
那么property_service是在什么时候启动的,是在开机的时候通过init进程启动的服务,开启property_service后,一直在监听property_service_socket,等待客户端的连接。
二、属性服务服务端
2.1 init.main
[->init.cpp]
1 | int main(int argc, char** argv) { |
2.2 property_init
[->property_service.cpp]
1 | void property_init() { |
2.3 start_property_service
[->property_service.cpp]
1 | void start_property_service() { |
2.4 handle_property_set_fd
[->property_service.cpp]
1 | static void handle_property_set_fd() { |
2.5 HandlePropertySet
[->property_service.cpp]
1 | // This returns one of the enum of PROP_SUCCESS or PROP_ERROR*. |
根据不同的key字段的不同进行处理,在进行处理之前需要是否有相应的权限。
2.6 HandleControlMessage
[->init.cpp]
1 | void HandleControlMessage(const std::string& msg, const std::string& name, pid_t pid) { |
这里最终通过function.action来启动uncrypt服务。
附录
源码路径
1 | frameworks/base/core/java/android/os/SystemProperties.java |