Android系统属性值设置和使用

Android系统属性值设置和使用
原创     https://blog.csdn.net/qq_30624591/article/details/102679377
展开
每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。

属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和创建属性。任何客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。

API函数(Android7.1版本在system/core/libcutils/properties.c)是:

int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);

属性服务调用libc中的__system_property_init函数来初始化属性系统的共享内存。当启动属性服务时,将从以下文件中加载默认属性:

/default.prop
/system/build.prop
/system/default.prop
/data/local.prop

属性将会以上述顺序加载。后加载的属性将覆盖原先的值。这些属性加载之后,最后加载的属性会被保持在/data/property中。

几种特殊的属性:
1.ro.属性,它表示只读属性,它一旦被设置就不能被修改;
2.net.属性,顾名思义,就是与网络相关的属性,net.属性中有一个特殊的属性:net.change,它记录了每一次最新设置和更新的net.属性,也就是每次设置和更新net.属性时则会自动的更新net.change属性,net.change属性的value就是这个被设置或者更新的net属性的name。例如我们更新了属性net.bt.name的值,由于net有属性发生了变化,那么属性服务就会自动更新net.change,将其值设置为net.bt.name。
3.persist.属性,以文件的形式保存在/data/property路径下。persist.属性由于将其保存在了用户空间中,所以在property_init中是不能对其更新的,只能将其更新过程交给用户来处理。
4.ctl.属性,虽然是以属性的形式来进行设置,其实它的目的是为了启动或关闭它指定的service
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。

如果想要开关机之后属性值变回空,尽量不要使用以上三种属性前缀命名你的属性值。或者可以在获取到你需要的属性之后,设置它成别的属性。

例子:

    #include <cutils/properties.h> //要包含头文件
    char driver_status[PROPERTY_VALUE_MAX];

    memset(_prop_value, 0, PROPERTY_VALUE_MAX);
    //get获得 "wlan.driver.status" 的属性,放到 driver_status 数组中。这是默认属性设置为NULL
    property_get("wlan.driver.status", driver_status, "0");
    
    static char wlan_value[7] ="timeout";
     property_set("wlan.driver.status", wlan_value);
    // 将 "wlan.driver.status" 属性设置为 timeout。

在Android中有三种方式来设置和获取属性:
1、Native(c++/c)代码
当编写Native的程序时,可以使用property_get和property_set API来获得和设置属性。使用这两个API必须要包含头文件cutils/properties.h和链接libcutil库。

在c使用demo:
1
    char buf[20]="qqqqqq";

    char tempbuf[PROPERTY_VALUE_MAX];

    property_set("type_value",buf);

    property_get("type_value",tempbuf,"0");

2、Java代码
Android在Java库中提供System.getProperty和System.setProperty方法,我们Java程序可以通过他们来设置和获得属性。

但是请注意!虽然从语法上面看Java的代码和Native代码非常相近,但是Java版本存储把属性存在其他地方,而不是我们上面提到的属性系统中。在JVM中有一个hash表来维护Java的属性。所以Java属性和Android属性是不同的,不能用Java API(System.getProperty和System.setProperty)来设置系统属性。也不能通过Native的方法(property_get和property_set)设置Java的属性。

更新:Andrew指出android.os.SystemProperties可以操作Android系统属性(虽然这个类倾向于内部使用)。这个类通过JNI调用Native的property_get和property_set方法来获得和设置属性。

在JAVA的使用demo:
1
    String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");

    SystemProperties.set("service.bootanim.exit", "0");


3、Shell脚本
Android提供了命令行工具setprop和getprop来设置和获取属性,他们可以在脚本中被使用。

 在shell的使用demo:
 adb相应的命令获取和设置属性wlan.driver.status:

  getprop "wlan.driver.status"
  setprop "wlan.driver.status"  "timeout"
————————————————
版权声明:本文为CSDN博主「只是一些暗恋而已」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30624591/article/details/102679377

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章