2013年12月18日 星期三

[Coding] Android Property System

Android Property System是Android當中一個重要特性。它作為一個Service在背後運行,管理系統配置和狀態。所有系統的配置和狀態都屬於Property。每個Property則是一個key/value pair,其類型都是字串。
舉例來說:
ro.build.version.incremental=eng.ryan.20131218.151228
ro.build.version.sdk=17
ro.build.version.codename=REL
ro.build.version.release=4.2.2
ro.build.date=Wed Dec 18 15:12:52 CST 2013

從功能上看,Property與windows系統的註冊表(register table)非常相似。許多android application和library直接或者間接地依賴此特性,以決定它們的運行行為。例如:adbd查詢Property服務用來確認當前是否運行在模擬器環境中。另一個例子是java.io.File.pathSpearator,其回傳儲存於Property service中的值。

Android property的來源主要存在下面四個檔案之中;值得注意的是,直到目前,一旦Property被添加了以後,就只能夠讀取和設定,是不能夠刪除的。
  1. /default.prop
  2. /system/build.prop
  3. /system/default.prop
  4. /data/local.prop
那麼又該怎麼讀取Property的值呢?
Android有提供三種get/set property數值的方式

1. Native code
當編寫本地應用程序時,可以使用property_get和property_set 這兩個API來讀取/設置Property。要使用它們,我們需要include cutils/properties.h,並鏈結libcutils。

2. Java code

在Java archive(java.lang.System)中提供有System.getProperty和System.setProperty方法。但值得注意的是,儘管這兩個API在語義上等同native函數,但其將數據存儲於完全不同的位置。實際上,dalvik VM使用一個Hash table來儲存這些Property。所以,用這兩個API儲存的屬性是獨立的,不能存取native屬性,反之亦然。

然而Android有一個內部隱藏類(@hide,對SDK不可見)android.os.SystemProperties來操縱native屬性。其通過jni來存取native property library。


3. Shell script
Android提供getprop和setprop命令行工具來獲取和更新屬性。其依賴libcutils實現。


補充:查看property_service.c,我們可以發現以下事實:
1、  Property的key不是隨便取的。在property_perms數組中定義了當前系統上可用的所有屬性的Prefix,以及相對應的存取權限UID。對Property的設置要滿足權限要求,同時命名也要在這些定義的範圍內。
2、  PA_COUNT_MAX指定了系統(共享內存區域中)最多能存儲多少個Property
3、  PROP_NAME_MAX指定了一個Property的key最大允許長度;PROP_VALUE_MAX則指定了value的最大允許長度。
張貼留言