Android中Property模塊的鍵值設(shè)置
Android中Property模塊的鍵值設(shè)置
Prop模塊是保存少量的全局共享信息,其保存的數(shù)據(jù)具有信息量少,跨進(jìn)程共享數(shù)據(jù)等特性;每一條信息包含兩個(gè)屬性,鍵名和鍵名對(duì)應(yīng)的鍵值,例如:
ro.product.locale.language=en
“Ro.product.locale.language”表示本產(chǎn)品本地語(yǔ)言,表示該條信息的名字,“en”表示該條信息的取值為英文,這樣任何一個(gè)應(yīng)用程序就知道本機(jī)使用的語(yǔ)言情況。在接口設(shè)計(jì)時(shí)也需要有兩個(gè)參數(shù),name和value(鍵名和鍵值),方法有set和get,例如:
Set(String name,String value); String Get(String name);
當(dāng)然,無(wú)論上層怎么設(shè)計(jì),在C底層鍵名name和鍵值value都是以char數(shù)組進(jìn)行保存的,因?yàn)樵O(shè)計(jì)者并不知道傳入name和value的數(shù)據(jù)大小。
在android.os.SystemProperties類(lèi)中對(duì)prop模塊進(jìn)行了封裝,該類(lèi)使用Set和Get直接進(jìn)行設(shè)置和獲取,當(dāng)然這些java接口最終還是調(diào)用系統(tǒng)接口完成的。在jni層有一個(gè)property_service.c文件,文件中有對(duì)應(yīng)的實(shí)際處理接口,這些接口即可以給java調(diào)用,也可以一些系統(tǒng)命令使用(例如setprop和getprop命令就是調(diào)用這些接口方法)。SystemProperties類(lèi)中的get方法沒(méi)有什么限制,但是set方法就有權(quán)限的限制,應(yīng)用程序是不能隨便使用set接口的。
SystemProperties類(lèi)的訪(fǎng)問(wèn)必須要有系統(tǒng)權(quán)限,并且應(yīng)用的uid必須是系統(tǒng)id:1000或者為root:0。因?yàn)閟et和get操作不同,set時(shí)該操作建立了一個(gè)socket管道通過(guò)發(fā)cmd出去完成的,服務(wù)端接收cmd同時(shí)比較權(quán)限,關(guān)鍵代碼如下:
if (uid == AID_SYSTEM || uid == AID_ROOT) return check_control_mac_perms(name, sctx);
只有權(quán)限是AID_SYSTEM(系統(tǒng)ID)和AID_ROOT(root用戶(hù)ID)才能通過(guò)驗(yàn)證;而get沒(méi)有權(quán)限檢查,不過(guò)試想也正常,如果誰(shuí)都能進(jìn)行修改,那這黑客也太好當(dāng)了。當(dāng)然個(gè)人覺(jué)得,對(duì)于set的設(shè)計(jì)使用權(quán)限驗(yàn)證無(wú)可厚非,但對(duì)于查看系統(tǒng)屬性這樣的功能(get),應(yīng)該還可以進(jìn)行細(xì)分,比如有些屬性是不重要的,任何進(jìn)程和用戶(hù)都可以讀取使用;當(dāng)然有些敏感的數(shù)據(jù)在指定讀取權(quán)限時(shí)也可以進(jìn)行指定(由于時(shí)間有限本人沒(méi)有更深入的細(xì)讀,也不知道android系統(tǒng)是否完成了這些功能)。
設(shè)置鍵值名時(shí)需要注意的地方
在進(jìn)行設(shè)置時(shí),包含兩個(gè)參數(shù),變量名和變量值,形如:[[key]]: [[value]]。如果原來(lái)沒(méi)有對(duì)應(yīng)的key值,那么就會(huì)在該模塊中創(chuàng)建一個(gè)新的鍵值,否則覆蓋原有鍵值。對(duì)于鍵值名在設(shè)計(jì)時(shí)最好按規(guī)范書(shū)寫(xiě),比如“類(lèi)名.模塊.用途”,這樣清晰可記而且不容易沖突。另外,如果屬性名稱(chēng)以“ro.”開(kāi)頭,那么這個(gè)屬性被視為只讀屬性。一旦設(shè)置,屬性值不能改變。這個(gè)判斷動(dòng)作是在property_service.c中的property_set函數(shù)中完成的:
if(!strncmp(name, "ro.", 3)) return -1;
如果是以“persist.”開(kāi)頭,當(dāng)設(shè)置這個(gè)屬性時(shí),其值也將寫(xiě)入/data/property/目錄中,鍵值名就是該屬性名,下次開(kāi)機(jī)重新加載和讀取該屬性;該文件中的load_persistent_properties函數(shù)就是用來(lái)完成該功能。特別的屬性名以“net.change”開(kāi)頭那么其值中必須以“net.”開(kāi)頭,例如鍵值名為[net.change]: 那么鍵值為[net.qtaguid_enabled],這個(gè)設(shè)置目前還沒(méi)想到有什么作用。
Shell中對(duì)應(yīng)的prop操作命令
在android的shell中也有對(duì)應(yīng)的命令進(jìn)行操作,有如下三個(gè)命令:
- getprop [keyname] Keyname為需要獲取的鍵值名,如果沒(méi)有參數(shù)則打印全部的鍵值信息。
- setprop [keyname] [value] Keyname為需要獲取的鍵值名,value為設(shè)置的值,這個(gè)值為字符串。
- watchprops 監(jiān)聽(tīng)系統(tǒng)屬性的變化,如果期間系統(tǒng)的屬性發(fā)生變化則把變化的值顯示出來(lái)。
在init.rc中也使用setprop來(lái)設(shè)置一些屬性狀態(tài)。
補(bǔ)充setprop:
Property模塊的鍵值設(shè)置
Prop模塊是保存少量的全局共享信息,其保存的數(shù)據(jù)具有信息量少,跨進(jìn)程共享數(shù)據(jù)等特性;每一條信息包含兩個(gè)屬性,鍵名和鍵名對(duì)應(yīng)的鍵值。“Ro.product.locale.language”表示本產(chǎn)品本地語(yǔ)言,表示該條信息的名字,“en”表示該條信息的取值為英文,這樣任何一個(gè)應(yīng)用程序就知道本機(jī)使用的語(yǔ)言情況。
Android終端屬性prop操作的底層實(shí)現(xiàn)
在init.c文件中main函數(shù)中會(huì)調(diào)用start_property_service(),而它分別調(diào)用load_properties_from_file函數(shù)讀取PROP_PATH_SYSTEM_BUILD(/system/build.prop)、PROP_PATH_SYSTEM_DEFAULT(/system/default.prop)和PROP_PATH_LOCAL_OVERRIDE(/data/local.prop)存放系統(tǒng)屬性的文件并設(shè)置到系統(tǒng)屬性。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
android開(kāi)發(fā)教程之實(shí)現(xiàn)listview下拉刷新和上拉刷新效果
這篇文章主要介紹了android實(shí)現(xiàn)listview下拉刷新和上拉刷新效果,Android的ListView上拉下拉刷新,原理都一樣,在Touch事件中操作header/footer的paddingTop屬性,需要的朋友可以參考下2014-02-02詳解Android應(yīng)用中ListView列表選項(xiàng)欄的編寫(xiě)方法
這篇文章主要介紹了Android應(yīng)用中ListView列表選項(xiàng)欄的編寫(xiě)方法,講解了使用安卓自帶的ListView與自定義multiple ListView的方法,需要的朋友可以參考下2016-03-03Kotlin Channel處理多個(gè)數(shù)據(jù)組合的流
最近項(xiàng)目中對(duì) kotlin 的使用比較多。不得不說(shuō) kotlin 確實(shí)可以極大的提高 android 的開(kāi)發(fā)效率,channel用于協(xié)程之間的通訊,使用send和receive往通道里寫(xiě)入或者讀取數(shù)據(jù),2個(gè)方法為非阻塞掛起函數(shù),channel是熱流,不管有沒(méi)有訂閱者都會(huì)發(fā)送2022-11-11AndroidStudio升級(jí)4.1坑(無(wú)法啟動(dòng)、插件plugin不好用、代碼不高亮)
這篇文章主要介紹了AndroidStudio升級(jí)4.1坑(無(wú)法啟動(dòng)、插件plugin不好用、代碼不高亮),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Android React Native原生模塊與JS模塊通信的方法總結(jié)
這篇文章主要介紹了Android React Native原生模塊與JS模塊通信的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-02-02