編輯:關於Android編程
在程序開發的時候,往往會共享一些數據信息,有一個環境變量或者屬性下面幾種情況:
1.該變量在多處需要使用,並且是跨進程或者跨線程的。
2.該環境變量一般只需讀取一次,不需要頻繁保存。
3.同時這個變量信息在關機重啟後任然可以保存。
對於這些需求,通常的做法是將這些信息保存到一個文件中,通過對該文件的讀寫來提取和保存信息,這些信息的數據量都比較小。這種方法是可以的,但是不是很系統完善,而且當需要讀取信息時都需要進行一次文件的io操作,這就很費時和浪費系統資源;還有一種情況,就是一個變量信息,開機啟動的時只需從flash中讀取一次,在系統運行時很少對它進行修改,所以這種信息保存到內存更顯得合適。
Window中有注冊表這樣完善的模塊對少量配置信息進行存儲,android中就有類似的Prop模塊。Prop模塊存儲著系統運行的很多配置信息,當程序運行時需要某種系統狀態時,會到該模塊中進行讀取。Prop模塊本質上來說,是系統運行時內存中保存的一塊數據區,讀寫數據都是對這一塊區域進行操作;好處是讀寫速度快,數據跨進程共享,缺點是突然斷電會丟失數據;當然Prop也能保存數據,這個在後面提到。
Android的啟動後,在property_service.c的property_init中完成prop的初始化。系統中存在著幾個文件,如build.prop和default.prop等,這些文件在系統構建時候生成的,裡面包含很多系統配置信息。系統開機時回去加載這些文件中的信息並保存到prop模塊中去,以便利用其它程序進行使用。
例如在build.prop中有如下信息:
dalvik.vm.heapstartsize=5m
dalvik.vm.heapgrowthlimit=96m
dalvik.vm.heapsize=256m
dalvik.vm.heaptargetutilization=0.75
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=2m
虛擬機的堆棧大小以及其它屬性。
persist.sys.timezone=Asia/Shanghai
時區信息。
ro.build.version.codename=REL
ro.build.version.release=4.2.2
ro.build.date=Fri Dec 26 15:56:10 UTC 2014
ro.build.date.utc=1419609370
構建信息。
ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
ro.product.manufacturer=unknown
ro.product.locale.language=en
ro.product.locale.region=US
Cpu信息,默認語言設置。
dalvik.vm.stack-trace-file=/data/anr/traces.txt
虛擬機的調試信息保存路徑。
這些動作都是在init.rc中完成的,該過程會調用property_service.c中的start_property_service函數,在該函數中完成以下文件的加載:
#define PROP_PATH_RAMDISK_DEFAULT "/default.prop"
#define PROP_PATH_SYSTEM_BUILD "/system/build.prop"
#define PROP_PATH_SYSTEM_DEFAULT "/system/default.prop"
#define PROP_PATH_LOCAL_OVERRIDE "/data/local.prop"
同時會調用load_persistent_properties函數,該函數會/data/property/中尋找用戶的保存設置。
Env環境變量中有一個ANDROID_PROPERTY_WORKSPACE變量,該變量中存儲著prop內存區域的大小,這個是在init_property_area中完成的。
Prop模塊中可以set和get進行相應的操作,這些在property_service.c中有property_set和property_get接口進行操作。Android的JAVA層也有對應的接口,這個應用到android.os.SystemProperties類中,該類的Set和Get直接進行設置和獲取,這些接口方法追到底層也是使用property_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);
只有權限通過以後才能set。而get沒有權限檢查,不過試想也正常,如果誰都能進行修改,那這黑客也太好當了。
在進行設置時,包含兩個參數,變量名和變量值,形如:[[key]]: [[value]]。如果原來沒有對應的key值,那麼就會在該模塊中創建一個新的鍵值,但是對於該鍵名有一些要求。使用時最好鍵名容易區別,不與其它鍵名沖突。如果屬性名稱以“ro.”開頭,那麼這個屬性被視為只讀屬性。一旦設置,屬性值不能改變。這個動作是在property_service.c中的property_set函數中完成的,有如下代碼:
if(!strncmp(name, "ro.", 3)) return -1;
如果是以“persist.”開頭,當設置這個屬性時,其值也將寫入/data/property/目錄中,下次開機該值任然存在,該文件的load_persistent_properties函數中,完成/data/property/的屬性加載與設置。
如果屬性名以“net.change”開頭那麼其值中必須以“net.”開頭。例如鍵值名為[net.change]: 那麼鍵值為[net.qtaguid_enabled]。
在android的shell中也有對應的命令進行操作,有如下三個命令:
getprop [keyname]
Keyname為需要獲取的鍵值名,如果沒有參數則打印全部的鍵值信息。
setprop [keyname] [value]
Keyname為需要獲取的鍵值名,value為設置的值,這個值為字符串。
watchprops
監聽系統屬性的變化,如果期間系統的屬性發生變化則把變化的值顯示出來。
在init.rc中也使用setprop來設置一些屬性狀態。
[本文是基於android4.2源碼進行分析]
很多用戶不知道,其實在隨著用戶使用微信的時間推移,微信應用會產生大量的緩存文件,這樣久而久之會造成手機內存不足的問題,並且在手機運行速度方面也有所影響,故此
前言安卓中為了給用戶的友好提示,一般的表現形式為Dialog、PopWindow、Toast,自從Snackbar的出現絕對是秒殺Toast了,Snackbar不僅能夠簡
一、自定義控件(一) --- 自定義屬性TextView1,定義屬性,制作attrs.xml文件;屬性值:string,color,attr,array,bool,dec
現在的安卓手機都可將手機網絡當作熱點供別人使用,小米也不例外,那麼小米手機熱點怎麼開啟,下面就為大家帶來小米手機熱點使用設置方法。第一步:點開系統設置,選擇