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

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