深入剖析Android中init进程实现的C语言源码

2020-01-06 13:38:30丽君

客户端发送请求

客户端设置属性时是调用了property_set(“sys.istest”, “true”)方法。从上述分析可知,该方法实现跟服务器端的property_set方法不同,该方法一定是发送了socket请求,该方法源码位置为:/system/core/libcutils/properties.c:

 

 
  1. int property_set(const char *key, const char *value)  { 
  2. return __system_property_set(key, value);  } 

可以看到,property_set调用了__system_property_set方法,这个方法位于:/bionic/libc/bionic/system_properties.c文件中:

 

 
  1. struct prop_msg  { 
  2. unsigned cmd;  char name[PROP_NAME_MAX]; 
  3. char value[PROP_VALUE_MAX];  }; 
  4. typedef struct prop_msg prop_msg;   
  5. static int send_prop_msg(prop_msg *msg)  { 
  6. struct pollfd pollfds[1];  struct sockaddr_un addr; 
  7. socklen_t alen;  size_t namelen; 
  8. int s;  int r; 
  9. int result = -1;   
  10. s = socket(AF_LOCAL, SOCK_STREAM, 0);  if (s < 0) { 
  11. return result;  } 
  12.   memset(&addr, 0, sizeof(addr)); 
  13. namelen = strlen(property_service_socket);  strlcpy(addr.sun_path, property_service_socket, sizeof(addr.sun_path)); 
  14. addr.sun_family = AF_LOCAL;  alen = namelen + offsetof(struct sockaddr_un, sun_path) + 1;