android 屬性系統 及其 補充

來源:互聯網
上載者:User

驗證了本人n年前提出的看法阿。

 

http://blog.csdn.net/tekkamanitachi/archive/2009/06/18/4280982.aspx

http://blog.csdn.net/chief1985/archive/2009/09/14/4551242.aspx

 

 由於對Android 的屬性系統不是很瞭解,所以翻譯了這篇文章《Android
Property System》

每個屬性都有一個名稱和值,他們都是字串格式。屬性被大量使用在Android系統中,用來記錄系統設定或進程之間的資訊交換。屬性是在整個系統中全域
可見的。每個進程可以get/set屬性。
在系統初始化時,Android將分配一個共用記憶體區來儲存的屬性。這些是由“init”守護進程完成的,其原始碼位於:device/system
/init。“init”守護進程將啟動一個屬性服務。屬性服務在“init”守護進程中運行。每一個用戶端想要設定屬性時,必須串連屬性服務,再向其發
送資訊。屬性服務將會在共用記憶體區中修改和建立屬性。任何用戶端想獲得屬性資訊,可以從共用記憶體直接讀取。這提高了讀取效能。
用戶端應用程式可以調用libcutils中的API函數以GET/SET屬性資訊。libcutils的原始碼位於:device/libs
/cutils。API函數是:
int property_get(const char *key, char *value, const char
*default_value);
int property_set(const char *key, const char *value);
而libcutils又調用libc中的 __system_property_xxx
函數獲得共用記憶體中的屬性。libc的原始碼位於:device/system/bionic。
屬性服務調用libc中的__system_property_init函數來初始化屬性系統的共用記憶體。當啟動屬性服務時,將從以下檔案中載入預設屬
性:
/ default.prop
/system/build.prop
/system/default.prop
/data/local.prop
屬性將會以上述順序載入。後載入的屬性將覆蓋原先的值。這些屬性載入之後,最後載入的屬性會被保持在/data/property中。

 特別屬性
如果屬性名稱以“ro.”開頭,那麼這個屬性被視為唯讀屬性。一旦設定,屬性值不能改變。
如果屬性名稱以“persist.”開頭,當設定這個屬性時,其值也將寫入/data/property。
如果屬性名稱以“net.”開頭,當設定這個屬性時,“net.change”屬性將會自動化佈建,以加入到最後修改的屬性名稱。(這是很巧妙的。
netresolve模組的使用這個屬性來追蹤在net.*屬性上的任何變化。)
屬性“ ctrl.start ”和“ ctrl.stop
”是用來啟動和停止服務。每一項服務必須在/init.rc中定義.系統啟動時,與init守護進程將解析init.rc和啟動屬性服務。一旦收到設定“
ctrl.start ”屬性的請求,屬性服務將使用該屬性值作為服務名找到該服務,啟動該服務。這項服務的啟動結果將會放入“
init.svc.<服務名>“屬性中 。用戶端應用程式可以輪詢那個屬性值,以確定結果。

Android toolbox程式
Android toolbox程式提供了兩個工具: setprop和getprop擷取和設定屬性。其使用方法:
getprop <屬性名稱>
setprop <屬性名稱><<屬性值>

Java
在Java應用程式可以使用System.getProperty()和System.setProperty()函數擷取和設定屬性。

Action
預設情況下,設定屬性只會使"init"精靈寫入共用記憶體,它不會執行任何指令碼或二進位程式。但是,您可以將您的想要的實現的操作與init.rc中
某個屬性的變化相關聯.例如,在預設的init.rc中有:

    # adbd on at boot in emulator
    on property:ro.kernel.qemu=1
       start adbd
    on property:persist.service.adb.enable=1
       start adbd
    on property:persist.service.adb.enable=0
       stop adbd

這樣,如果你設定persist.service.adb.enable為1 ,"init"精靈就知道需要採取行動:開啟adbd服務。

文章中提到的共用記憶體就是Android特有的共用方式:ashmen

Ashmem是一個匿名共用記憶體(Anonymous SHared
MEMory)系統,該系統增加了介面因此進程間可以共用具名記憶體塊。舉一個例子,系統可以利用Ashmem儲存表徵圖,當繪製使用者介面的時候多個進程也可
以訪問。Ashmem優於傳統Linux共用記憶體表現在當共用記憶體塊不再被用的時候,它為Kernel提供一種回收這些共用記憶體塊的手段。如果一個程式嘗
試訪問Kernel釋放的一個共用記憶體塊,它將會收到一個錯誤提示,然後重新分配記憶體並重載資料。

 

網上有一篇文章介紹了Android的屬性系統(http://blog.csdn.net/tekkamanitachi/archive/2009/06/18/4280982.aspx
),
我現在對其進行補充:

1. android現在好像只有/ default.prop,/system/build.prop兩個檔案,別的兩個檔案找不到

2.
/data/property下有4個prop文
件:persist.sys.timezone,persist.sys.language,persist.sys.country,persist.sys.localevar,
裡面儲存著屬性名稱以“persist.”開頭的屬性值。

3.
libcutils的源碼位於system/core/libcutils/下面,擷取和設定屬性的代碼在properties.c裡面,讀取屬性通過讀
共用記憶體得到,設定屬性通過發送請求到property_service進行設定。

4. 相關的函數有property_set,property_get,property_list。

5.
屬性系統的初始化通過__system_properties_init函數完成,__system_properties_init函數代碼如下:

view
plain
copy
to clipboard
print
?
  1. int
     __system_properties_init(
    void
    )  
  2. {  
  3. prop_area *pa;  
  4. int
     s, fd;  
  5. unsigned sz;  
  6. char
     *env;  
  7. if
    (__system_property_area__ != ((
    void
    *) &dummy_props)) {  
  8. return
     0;  
  9. }  
  10. env = getenv("ANDROID_PROPERTY_WORKSPACE"
    );  
  11. if
     (!env) {  
  12. return
     -1;  
  13. }  
  14. fd = atoi(env);  
  15. env = strchr(env, ','
    );  
  16. if
     (!env) {  
  17. return
     -1;  
  18. }  
  19. sz = atoi(env + 1);  
  20. pa = mmap(0, sz, PROT_READ, MAP_SHARED, fd, 0);  
  21. if
    (pa == MAP_FAILED) {  
  22. return
     -1;  
  23. }  
  24. if
    ((pa->magic != PROP_AREA_MAGIC) || (pa->version != PROP_AREA_VERSION)) {  
  25. munmap(pa, sz);  
  26. return
     -1;  
  27. }  
  28. __system_property_area__ = pa;  
  29. return
     0;  
  30. }  

int<br />__system_properties_init(void)<br />{<br />prop_area *pa;<br />int s, fd;<br />unsigned sz;<br />char *env;<br />if(__system_property_area__ != ((void*) &dummy_props)) {<br />return 0;<br />}<br />env = getenv("ANDROID_PROPERTY_WORKSPACE");<br />if (!env) {<br />return -1;<br />}<br />fd = atoi(env);<br />env = strchr(env, ',');<br />if (!env) {<br />return -1;<br />}<br />sz = atoi(env + 1);<br />pa = mmap(0, sz, PROT_READ, MAP_SHARED, fd, 0);<br />if(pa == MAP_FAILED) {<br />return -1;<br />}<br />if((pa->magic != PROP_AREA_MAGIC) || (pa->version !=<br />PROP_AREA_VERSION)) {<br />munmap(pa, sz);<br />return -1;<br />}<br />__system_property_area__ = pa;<br />return 0;<br />}
 

可以看到首先從環境變數裡面擷取ANDROID_PROPERTY_WORKSPACE,ANDROID_PROPERTY_WORKSPACE的
值為如下形式:ANDROID_PROPERTY_WORKSPACE=9,32768。然後擷取共用記憶體的檔案控制代碼和長度,最後對共用記憶體進行檢查並設
置全域變數__system_property_area__的值,property_get就是從__system_property_area__裡
面讀取的屬性值。環境變數的初始化在init.c的service_start函數裡面。

6. /init.rc裡面有設定屬性的代碼,例如:

# Define the oom_adj values for the classes of processes that can be

# killed by the kernel. These are used in ActivityManagerService.

setprop ro.FOREGROUND_APP_ADJ 0

setprop ro.VISIBLE_APP_ADJ 1

setprop ro.SECONDARY_SERVER_ADJ 2

setprop ro.HOME_APP_ADJ 4

setprop ro.HIDDEN_APP_MIN_ADJ 7

setprop ro.CONTENT_PROVIDER_ADJ 14

setprop ro.EMPTY_APP_ADJ 15

7. 通過property_list可以枚舉所有的屬性,下面是一段列印所有屬性的代碼。

view
plain
copy
to clipboard
print
?
  1. #include <cutils/properties.h>
      
  2. #include <stdio.h>
      
  3. void
     print_prop(
    const
     
    char
    * key,
    const
     
    char
    * value,
    void
    * cookie)  
  4. {  
  5.     printf("key=%s,value=%s/n"
    ,key,value);  
  6. }  
  7.   
  8. int
     main()  
  9. {  
  10.     property_list(print_prop,NULL);  
  11. }  

#include<br /><cutils/properties.h><br />#include <stdio.h><br />void print_prop(const char* key,const char* value,void* cookie)<br />{<br />printf("key=%s,value=%s/n",key,value);<br />}<br />int main()<br />{<br />property_list(print_prop,NULL);<br />}
 

Android.mk檔案:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= /

list_property.cpp /

LOCAL_SHARED_LIBRARIES := /

libcutils /

libutils /

LOCAL_MODULE:= list_prop

include $(BUILD_EXECUTABLE)

include $(call all-makefiles-under,$(LOCAL_PATH))

所有的屬性如下:

key=ro.secure,value=0

key=ro.allow.mock.location,value=1

key=ro.debuggable,value=1

key=persist.service.adb.enable,value=1

key=ro.kernel.qemu,value=1

key=ro.kernel.console,value=ttyS0

key=ro.kernel.android.checkjni,value=1

key=ro.kernel.android.qemud,value=ttyS1

key=ro.factorytest,value=0

key=ro.serialno,value=

key=ro.bootmode,value=unknown

key=ro.baseband,value=unknown

key=ro.carrier,value=unknown

key=ro.bootloader,value=unknown

key=ro.hardware,value=goldfish

key=ro.revision,value=0

key=ro.build.id,value=CUPCAKE

key=ro.build.display.id,value=sdk-eng 1.5 CUPCAKE 148875 test-keys

key=ro.build.version.incremental,value=148875

key=ro.build.version.sdk,value=3

key=ro.build.version.release,value=1.5

key=ro.build.date,value=Thu May 14 17:29:49 PDT 2009

key=ro.build.date.utc,value=1242347389

key=ro.build.type,value=eng

key=ro.build.user,value=android-build

key=ro.build.host,value=e-honda.mtv.corp.google.com

key=ro.build.tags,value=test-keys

key=ro.product.model,value=sdk

key=ro.product.brand,value=generic

key=ro.product.name,value=sdk

key=ro.product.device,value=generic

key=ro.product.board,value=

key=ro.product.manufacturer,value=unknown

key=ro.product.locale.language,value=en

key=ro.product.locale.region,value=US

key=ro.board.platform,value=

key=ro.build.product,value=generic

key=ro.build.description,value=sdk-eng 1.5 CUPCAKE 148875 test-keys

key=ro.build.fingerprint,value=generic/sdk/generic/:1.5/CUPCAKE/148875:eng/test-keys

key=rild.libpath,value=/system/lib/libreference-ril.so

key=rild.libargs,value=-d /dev/ttyS0

key=ro.config.notification_sound,value=F1_New_SMS.ogg

key=xmpp.auto-presence,value=true

key=ro.config.nocheckin,value=yes

key=net.bt.name,value=Android

key=net.change,value=net.gprs.local-ip

key=dalvik.vm.stack-trace-file,value=/data/anr/traces.txt

key=persist.sys.timezone,value=GMT

key=persist.sys.language,value=en

key=persist.sys.country,value=US

key=persist.sys.localevar,value=

key=ro.FOREGROUND_APP_ADJ,value=0

key=ro.VISIBLE_APP_ADJ,value=1

key=ro.SECONDARY_SERVER_ADJ,value=2

key=ro.HOME_APP_ADJ,value=4

key=ro.HIDDEN_APP_MIN_ADJ,value=7

key=ro.CONTENT_PROVIDER_ADJ,value=14

key=ro.EMPTY_APP_ADJ,value=15

key=ro.FOREGROUND_APP_MEM,value=1536

key=ro.VISIBLE_APP_MEM,value=2048

key=ro.SECONDARY_SERVER_MEM,value=4096

key=ro.HOME_APP_MEM,value=4096

key=ro.HIDDEN_APP_MEM,value=5120

key=ro.CONTENT_PROVIDER_MEM,value=5632

key=ro.EMPTY_APP_MEM,value=6144

key=net.tcp.buffersize.default,value=4096,87380,110208,4096,16384,110208

key=net.tcp.buffersize.wifi,value=4095,87380,110208,4096,16384,110208

key=net.tcp.buffersize.umts,value=4094,87380,110208,4096,16384,110208

key=net.tcp.buffersize.edge,value=4093,26280,35040,4096,16384,35040

key=net.tcp.buffersize.gprs,value=4092,8760,11680,4096,8760,11680

key=init.svc.console,value=running

key=init.svc.servicemanager,value=running

key=init.svc.vold,value=running

key=init.svc.debuggerd,value=running

key=init.svc.ril-daemon,value=running

key=init.svc.zygote,value=running

key=init.svc.media,value=running

key=init.svc.installd,value=running

key=init.svc.flash_recovery,value=stopped

key=init.svc.goldfish-setup,value=stopped

key=init.svc.qemud,value=stopped

key=init.svc.goldfish-logcat,value=stopped

key=ARGH,value=ARGH

key=net.eth0.dns1,value=10.0.2.3

key=net.gprs.local-ip,value=10.0.2.15

key=ro.radio.use-ppp,value=no

key=status.battery.state,value=Slow

key=status.battery.level,value=5

key=status.battery.level_raw,value=50

key=status.battery.level_scale,value=9

key=ro.setupwizard.mode,value=EMULATOR

key=ro.com.google.locationfeatures,value=1

key=init.svc.adbd,value=running

key=ro.qemu.init.completed,value=1

key=hw.keyboards.65536.devname,value=qwerty2

key=sys.settings_secure_version,value=2

key=dev.bootcomplete,value=1

key=sys.settings_system_version,value=6

key=gsm.sim.operator.numeric,value=

key=gsm.sim.operator.alpha,value=

key=gsm.sim.operator.iso-country,value=

key=gsm.sim.state,value=UNKNOWN

key=adb.connected,value=1

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.