国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中Property模塊的鍵值設置

2019-10-23 18:33:42
字體:
來源:轉載
供稿:網友

Android中Property模塊的鍵值設置

Prop模塊是保存少量的全局共享信息,其保存的數據具有信息量少,跨進程共享數據等特性;每一條信息包含兩個屬性,鍵名和鍵名對應的鍵值,例如:

ro.product.locale.language=en

“Ro.product.locale.language”表示本產品本地語言,表示該條信息的名字,“en”表示該條信息的取值為英文,這樣任何一個應用程序就知道本機使用的語言情況。在接口設計時也需要有兩個參數,name和value(鍵名和鍵值),方法有set和get,例如:

Set(String name,String value);String Get(String name);

當然,無論上層怎么設計,在C底層鍵名name和鍵值value都是以char數組進行保存的,因為設計者并不知道傳入name和value的數據大小。

在android.os.SystemProperties類中對prop模塊進行了封裝,該類使用Set和Get直接進行設置和獲取,當然這些java接口最終還是調用系統接口完成的。在jni層有一個property_service.c文件,文件中有對應的實際處理接口,這些接口即可以給java調用,也可以一些系統命令使用(例如setprop和getprop命令就是調用這些接口方法)。SystemProperties類中的get方法沒有什么限制,但是set方法就有權限的限制,應用程序是不能隨便使用set接口的。

SystemProperties類的訪問必須要有系統權限,并且應用的uid必須是系統id:1000或者為root:0。因為set和get操作不同,set時該操作建立了一個socket管道通過發cmd出去完成的,服務端接收cmd同時比較權限,關鍵代碼如下:

if (uid == AID_SYSTEM || uid == AID_ROOT)  return check_control_mac_perms(name, sctx);

只有權限是AID_SYSTEM(系統ID)和AID_ROOT(root用戶ID)才能通過驗證;而get沒有權限檢查,不過試想也正常,如果誰都能進行修改,那這黑客也太好當了。當然個人覺得,對于set的設計使用權限驗證無可厚非,但對于查看系統屬性這樣的功能(get),應該還可以進行細分,比如有些屬性是不重要的,任何進程和用戶都可以讀取使用;當然有些敏感的數據在指定讀取權限時也可以進行指定(由于時間有限本人沒有更深入的細讀,也不知道android系統是否完成了這些功能)。

設置鍵值名時需要注意的地方

在進行設置時,包含兩個參數,變量名和變量值,形如:[[key]]: [[value]]。如果原來沒有對應的key值,那么就會在該模塊中創建一個新的鍵值,否則覆蓋原有鍵值。對于鍵值名在設計時最好按規范書寫,比如“類名.模塊.用途”,這樣清晰可記而且不容易沖突。另外,如果屬性名稱以“ro.”開頭,那么這個屬性被視為只讀屬性。一旦設置,屬性值不能改變。這個判斷動作是在property_service.c中的property_set函數中完成的:

if(!strncmp(name, "ro.", 3)) return -1;

如果是以“persist.”開頭,當設置這個屬性時,其值也將寫入/data/property/目錄中,鍵值名就是該屬性名,下次開機重新加載和讀取該屬性;該文件中的load_persistent_properties函數就是用來完成該功能。特別的屬性名以“net.change”開頭那么其值中必須以“net.”開頭,例如鍵值名為[net.change]: 那么鍵值為[net.qtaguid_enabled],這個設置目前還沒想到有什么作用。

Shell中對應的prop操作命令

在android的shell中也有對應的命令進行操作,有如下三個命令:

  • getprop [keyname] Keyname為需要獲取的鍵值名,如果沒有參數則打印全部的鍵值信息。
  • setprop [keyname] [value] Keyname為需要獲取的鍵值名,value為設置的值,這個值為字符串。
  • watchprops 監聽系統屬性的變化,如果期間系統的屬性發生變化則把變化的值顯示出來。

在init.rc中也使用setprop來設置一些屬性狀態。

補充setprop:

Property模塊的鍵值設置

Prop模塊是保存少量的全局共享信息,其保存的數據具有信息量少,跨進程共享數據等特性;每一條信息包含兩個屬性,鍵名和鍵名對應的鍵值。“Ro.product.locale.language”表示本產品本地語言,表示該條信息的名字,“en”表示該條信息的取值為英文,這樣任何一個應用程序就知道本機使用的語言情況。

Android終端屬性prop操作的底層實現

在init.c文件中main函數中會調用start_property_service(),而它分別調用load_properties_from_file函數讀取PROP_PATH_SYSTEM_BUILD(/system/build.prop)、PROP_PATH_SYSTEM_DEFAULT(/system/default.prop)和PROP_PATH_LOCAL_OVERRIDE(/data/local.prop)存放系統屬性的文件并設置到系統屬性。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

 

注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 静海县| 金坛市| 兴城市| 临沭县| 景洪市| 沅江市| 图木舒克市| 九龙城区| 兴隆县| 德州市| 龙井市| 漠河县| 台湾省| 德昌县| 万安县| 锡林郭勒盟| 江陵县| 玉树县| 辰溪县| 桃园市| 文登市| 宁河县| 静乐县| 临清市| 普陀区| 砀山县| 五华县| 理塘县| 泸水县| 阳西县| 慈溪市| 和平区| 铁岭市| 固安县| 金川县| 府谷县| 乌拉特后旗| 建始县| 丁青县| 岳池县| 怀集县|