System Property for Android-2: Interface

Posted by 深几码谈 on March 30, 2021

基本信息 本文基于Amloigc T972平台代码,其中:

Android Version: 9
API-Level: 28

读者需要注意,不同的API-Level有较大不同,而且可能与AOSP有轻微的差别。

一、接口

1.1 libcutils

对于大部分native进程来说使用这个接口。

1.1.1 property_get

  • 客户代码
    #include <cutils/properties.h>
    // ...
    if(!(property_get("ro.product.hwid", value, NULL) > 0))
    {
      DEVICE_LOG("read %s property Failed\n", name);
      return -1;
    }
    // ...
    
  • 实现
    // system/core/libcutils/properties.cpp
    // ...
    int property_get(const char *key, char *value, const char *default_value)
    // ...
    

1.1.2 property_set

  • 客户代码
    #include <cutils/properties.h>
    // ...
    property_set("service.bootanim.exit", "0");
    // ...
    
  • 实现
    // system/core/libcutils/properties.cpp
    // ...
    int property_set(const char *key, const char *value)
    // ...
    

    其中调用更低层的__system_property_set。

1.2 bionic

libcutils调用bionic

1.2.1 __system_property_get

  • 客户代码
    #include <sys/system_properties.h>
    // ...
      char buf[PROPERTY_VALUE_MAX] = "";
      int len = __system_property_get("ro.build.type", buf);
    // ...
    
  • 实现
    // bionic/libc/bionic/system_property_api.cpp
    // ...
    int __system_property_get(const char* name, char* value)
    // ...
    

1.2.2 __system_property_set

该接口的客户代码就比较多了,具体可以参考AndroidXRef:Searched +full:__system_property_set +(path:c path:cpp) (Results 1 - 6 of 6) sorted by relevance 下面列举几个常见的客户代码,有兴趣的读者可以继续追踪。

  • 客户代码-1: setprop
    // external/toybox/toys/android/setprop.c
    #include <sys/system_properties.h>
    // ...
    if (__system_property_set(name, value))
      error_msg("failed to set property '%s' to '%s'", name, value);
    // ...
    
  • 客户代码-2: start
    // external/toybox/toys/android/start.c
    #include <sys/system_properties.h>
    // ...
    for (; *ss; ss += direction)
      if (__system_property_set(property, *ss))
        error_exit("failed to set property '%s' to '%s'", property, *ss);
    // ...
    
  • 客户代码-3: libcutils
    // system/core/libcutils/properties.cpp
    #include <sys/system_properties.h>
    // ...
    int property_set(const char *key, const char *value)
    // ...
    

    对应之前libcutils的接口。

  • 实现
    // bionic/libc/bionic/system_property_set.cpp
    // ...
    int __system_property_set(const char* key, const char* value)
    // ...
    

二、协议版本

2.1 kProtocolVersion1(1)

旧的版本中不支持过长的name和value。

  if (g_propservice_protocol_version == kProtocolVersion1) {
    // Old protocol does not support long names or values
    if (strlen(key) >= PROP_NAME_MAX) return -1;
    if (strlen(value) >= PROP_VALUE_MAX) return -1;

    prop_msg msg;
    memset(&msg, 0, sizeof msg);
    msg.cmd = PROP_MSG_SETPROP;
    strlcpy(msg.name, key, sizeof msg.name);
    strlcpy(msg.value, value, sizeof msg.value);

    return send_prop_msg(&msg);
  }

2.2 kProtocolVersion2(2)

新版本协议仅支持’ro.’开头的属性的值,超过PROP_VALUE_MAX(92)的限制。

    // New protocol only allows long values for ro. properties only.
    if (strlen(value) >= PROP_VALUE_MAX && strncmp(key, "ro.", 3) != 0) return -1;

2.3 property service version

GaeUHD:/ # getprop ro.property_service.version
2

在Amlogic T972中该值为2。


| 微博 weibo.com/liuxk99