Android屬性系統(tǒng)簡介及使用

屬性系統(tǒng)介紹

Android 里有很多屬性(property)涮瞻,每個屬性都有一個名稱和值近顷,他們都是字符串格式。這些屬性定義了 Android 系統(tǒng)的一些公共系統(tǒng)屬性饱须。借用大神的一句話譬挚,系統(tǒng)屬性就是 真·全局變量

屬性變更的請求時init事件循環(huán)處理的另一個事件,在Android平臺中蚪腋,為了讓運行中的所有進(jìn)程共享系統(tǒng)運行時所需要的各種設(shè)置值,系統(tǒng)開辟了屬性存儲區(qū)域悠砚,并提供了訪問該區(qū)域的API。屬性由鍵(key)與值(value)構(gòu)成枢泰,其表現(xiàn)形式為“鍵=值”。

在Android平臺中毛甲,在訪問屬性值時,添加了訪問權(quán)限控制七咧,增強了訪問的安全性。系統(tǒng)中所有運行中的進(jìn)程都可以訪問屬性值终蒂,但僅有init進(jìn)程才能修改屬性值。其他進(jìn)程修改屬性值時矮锈,必須向init進(jìn)程提出請求褪贵,最終由init進(jìn)程負(fù)責(zé)修改屬性值震蒋。在此過程中沐寺,init進(jìn)程會先檢查各屬性的訪問權(quán)限,而后再修改屬性值囊拜。

當(dāng)屬性值更改后冠跷,若定義在init.rc文件中的某個特定條件得到滿足,則與此條件相匹配的動作就會發(fā)生,每個動作都有一個觸發(fā)器仪糖,決定動作的執(zhí)行時間,記錄在“on property”關(guān)鍵字后的命令即被執(zhí)行故爵。

屬性系統(tǒng)有什么強大的地方

個人看來屬性系統(tǒng)有一下四個優(yōu)點劲室,當(dāng)然缺點也很明顯,只能支持三種基本類型:string喉磁、int、boolean

  • 全局:只要擁有對應(yīng)的權(quán)限斤讥,就可以同步獲取和修改
  • 通用:在Java層,native層,shell層都可以獲取和修改
  • 初始化早:屬性服務(wù)實在 init 進(jìn)程中啟動的簸州,
  • 使用簡單:主要就兩個方法 set 和 get

如何使用系統(tǒng)屬性

native

當(dāng)編寫本地應(yīng)用程序時,可以使用 property_get 和 property_set 這兩個API來讀取/設(shè)置屬性矢洲。要使用它們,我們需要 include cutils/properties.h,并鏈接 libcutils 庫揩徊。

int property_get(const char *key, char *value, const char *default_value);
int8_t property_get_bool(const char *key, int8_t default_value);
int64_t property_get_int64(const char *key, int64_t default_value);
int32_t property_get_int32(const char *key, int32_t default_value);
int property_set(const char *key, const char *value);
int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie);    

以上就是 properties.h 中申明的所有方法,其中 property_set 返回 0 表示執(zhí)行成功,返回值 <0 表示失敗。

Java

java 層調(diào)用 /frameworks/base/core/java/android/os/SystemProperties.java 中的 set 和 get 方法即可設(shè)置和獲取系統(tǒng)屬性

    public static String get(String key) {}
    public static String get(String key, String def) {}
    public static int getInt(String key, int def) {
    public static long getLong(String key, long def) {}
    public static boolean getBoolean(String key, boolean def) {}
    public static void set(String key, String val) {}
    public static void addChangeCallback(Runnable callback) {}

通過 JNI 最終調(diào)用的還是 /system/core/libcutils/properties.c 中的 property_get 和 property_set

Shell

Android toolbox 程序提供了兩個工具: setprop 和 getprop 獲取和設(shè)置屬性。其使用方法:

getprop <屬性名>
setprop <屬性名><<屬性值>

可以通過命令adb shell: getprop查看手機上所有屬性狀態(tài)值仆葡。

默認(rèn)情況下,設(shè)置屬性只會使 "init" 守護程序?qū)懭牍蚕韮?nèi)存,它不會執(zhí)行任何腳本或二進(jìn)制程序窖铡。但是,您可以將您的想要的實現(xiàn)的操作與init.rc中某個屬性的變化相關(guān)聯(lián).例如箍铲,在默認(rèn)的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

這樣膘融,如果你設(shè)置persist.service.adb.enable為1 春畔,"init"守護程序就知道需要采取行動:開啟adbd服務(wù)。

使用時需要注意什么

特殊屬性

  1. ro. 屬性扣孟,它表示只讀屬性,它一旦被設(shè)置就不能被修改利诺;

  2. NET. 屬性,顧名思義侣滩,就是與網(wǎng)絡(luò)相關(guān)的屬性,net.屬性中有一個特殊的屬性:net.change葛躏,它記錄了每一次最新設(shè)置和更新的net.屬性,也就是每次設(shè)置和更新net.屬性時則會自動的更新net.change屬性,net.change屬性的value就是這個被設(shè)置或者更新的net屬性的name猾愿。例如我們更新了屬性net.bt.name的值,由于net有屬性發(fā)生了變化姻僧,那么屬性服務(wù)就會自動更新net.change赌莺,[將其值設(shè)置為net.bt.name]

  3. persist. 屬性,以文件的形式保存在/data/property路徑下。persist.屬性由于將其保存在了用戶空間中港谊,所以在property_init中是不能對其更新的,只能將其更新過程交給用戶來處理。

  4. ctl. 屬性蛀缝,雖然是以屬性的形式來進(jìn)行設(shè)置,其實它的目的是為了啟動或關(guān)閉它指定的service 屬性“ ctrl.start ”和“ ctrl.stop ”是用來啟動和停止服務(wù)。每一項服務(wù)必須在/init.rc中定義.系統(tǒng)啟動時构哺,init守護進(jìn)程將解析init.rc和啟動屬性服務(wù)。一旦收到設(shè)置“ ctrl.start ”屬性的請求碟嘴,屬性服務(wù)將使用該屬性值作為服務(wù)名找到該服務(wù)眠菇,啟動該服務(wù)。這項服務(wù)的啟動結(jié)果將會放入“ init.svc.<服務(wù)名>“屬性中 》妫客戶端應(yīng)用程序可以輪詢那個屬性值,以確定結(jié)果续捂。

權(quán)限鑒定

只有有權(quán)限的進(jìn)程才能修改屬性间校,要不隨便寫一個就改系統(tǒng)屬性那當(dāng)黑客也太容易了胁附。權(quán)限相關(guān)定義在下面兩個文件里:

system/core/init/property_service.c

property_perms[] = {
    { "net.rmnet0.",      AID_RADIO,    0 },
    { "net.gprs.",        AID_RADIO,    0 },
    { "net.ppp",          AID_RADIO,    0 },
    { "net.qmi",          AID_RADIO,    0 },
    { "ril.",             AID_RADIO,    0 },
    { "gsm.",             AID_RADIO,    0 },
    { "persist.radio",    AID_RADIO,    0 },
    { "net.dns",          AID_RADIO,    0 },
    { "net.",             AID_SYSTEM,   0 },
    { "dev.",             AID_SYSTEM,   0 },
    { "runtime.",         AID_SYSTEM,   0 },
    { "hw.",              AID_SYSTEM,   0 },
    { "sys.",             AID_SYSTEM,   0 },
    ......

system/core/include/private/android_filesystem_config.h

#define AID_ROOT             0  /* traditional unix root user */
#define AID_SYSTEM        1000  /* system server */
#define AID_RADIO         1001  /* telephony subsystem, RIL */
#define AID_DHCP          1014  /* dhcp client */
#define AID_SHELL         2000  /* adb and debug shell user */
#define AID_CACHE         2001  /* cache access */
#define AID_APP          10000 /* first app user */
......

其實一般應(yīng)用程序都不會去修改系統(tǒng)屬性,所以也不用太在意弓叛。

在開機啟動后的init操作中,會執(zhí)行一個loop循環(huán)毕籽,當(dāng)檢測到有新的設(shè)置時,進(jìn)入設(shè)置流程睡榆,鑒權(quán)失敗會提示相關(guān)的異常,如sys_prop: permission denied uid:1000 name:gsm.phone.id

通過以上介紹我們可以了解什么是系統(tǒng)屬性宿崭,如何使用,以及一些需要注意的地方锭硼。后面會詳細(xì)介紹相關(guān)原理轰异。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廊镜,一起剝皮案震驚了整個濱河市配椭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘾境,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡卓嫂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門突照,熙熙樓的掌柜王于貴愁眉苦臉地迎上來末盔,“玉大人,你說我怎么就攤上這事∫娑校” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵熙卡,是天一觀的道長。 經(jīng)常有香客問我,道長甜滨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上酌予,老公的妹妹穿的比我還像新娘滞磺。我一直安慰自己涎劈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布撞蜂。 她就那樣靜靜地躺著溉贿,像睡著了一般九杂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音惶我,去河邊找鬼。 笑死听怕,一個胖子當(dāng)著我的面吹牛翅睛,可吹牛的內(nèi)容都是我干的疏旨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼喊暖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后燃箭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡厕诡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年醒第,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霞幅。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡扔傅,死狀恐怖试读,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倘屹,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布赠尾,位于F島的核電站当窗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巫员。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轧钓,春花似錦、人聲如沸霉晕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渐溶。三九已至,卻和暖如春拖陆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孔飒。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工鸠匀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爬范。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓斥难,卻偏偏與公主長得像哑诊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子暑劝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348