Android 屬性

屬性是Android系統的一大特點,它用來進行系統配置,模塊,組件間的通信。這篇文章主要是聊一下Android property的應用和工做原理以及一些經常使用的系統屬性。java

屬性配置文件

在主板系統上,屬性文件分別是:android

  • /default.prop -- 對應編譯系統 out 目錄下的 .../root/default.prop
  • /system/build.prop -- 對應編譯系統 out 目錄下.../system/build.prop
  • /data/property -- 這個目錄下,是persist開頭的可讀寫的屬性。

屬性的規則

  • 以"ro."開頭的屬性, 一旦設置,就不能再被改變;非 "ro." 開頭的屬性值能夠被修改。
  • 以"net."開頭的屬性,會被看成DNS屬性,屬於特殊屬性,不要隨便使用。
  • 以 "persist."開頭的屬性, 會保存到 /data/property/下面, 它是能夠保存的;其它屬性修改後,值不能保存,重啓後無效。

API

Java層:

java API 主要是在系統預置apk和framework裏面使用,它沒有拉出來做爲應用的API。數組

import android.os.SystemProperties;

set(String key, String val)
String get(String key, String def)
int getInt(String key, int def)
long getLong(String key, long def)
boolean getBoolean(String key, boolean def)

c 層:dom

#include "cutils/properties.h"

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_get(const char *key, char *value, const char *default_value)
int property_set(const char *key, const char *value);

bool 類型的有效值socket

  • true: "1", "true", "y", "yes", "on"
  • false: "0", "false", "n", "no", "off"

有效的數字字符串ionic

  • 符號字符: '+' 或者 '-'
  • '0'前綴表示是8進制數字
  • 0x / 0X 前綴表示是16進制數字

一些有用的系統屬性

ro.secure=0 -- 啓用root賬戶; 爲1,則是關閉root賬號。函數

ro.debuggable=1 -- 啓用adb網站

user版本軟件的配置是:ui

ro.secure=1
ro.debuggable=0

ro.HOME_APP_ADJ = 1 -- 加速launcher, 強制把launcher加載到內存。spa

設置DNS,如 8.8.8.8

net.dns1=8.8.8.8
net.ppp0.dns1=8.8.8.8
net.wlan0.dns1=8.8.8.8
net.eth0.dns1=8.8.8.8

dalvik.vm.usejit = true | false -- enable/disable JIT。

dalvik.vm.checkjni = true -- 啓動JNI檢查,調試用。

dalvik.vm.jniopts = forcecopy -- JNI檢查數組越界。

添加屬性

1: device.mk可使用 PRODUCT_PROPERTY_OVERRIDES,若是該屬性不存在,會追加到文件中。如:

PRODUCT_PROPERTY_OVERRIDES += ro.adb.secure=0

2: 能夠添加到build/tools/buildinfo.sh,如:

echo "ro.product.IME.default=xxx.inputmethod.pinyin/.PinyinIME"

build的時候,先 rm out/...../system/build.prop,否則,改動可能無效。
也能夠直接用root登陸文件系統,remount /system,而後修改 /system/build.prop文件,重啓便可生效。

具體實現

是典型的policy/function 分層結構,"/system/core/init/property_service.c"提供policy, "/bionic /libc/bionic/system_properties.c"提供function。

init進程初始化過程當中, 在 property_service.c 加載全部的屬性文件('load_all_props()'),而後,建立一個unix domain socket (/dev/socket/property_service)來監聽客戶的請求('start_property_service'),init初始化結束後,進入輪循狀態(for(;;)),經過poll函數獲得 socket文件事件,最後在"handle_property_set_fd()"來處理客戶請求。

system_properties.c 根據屬性名,用 ' . ' 區分各個節點,用二插樹來保存屬性數據。

/bionic/libc/include/sys/_system_properties.h

#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_VENDOR_BUILD "/vendor/build.prop"
#define PROP_PATH_LOCAL_OVERRIDE "/data/local.prop"

system_properties.c

__system_property_add
__system_property_get
__system_property_set
__system_property_update

權限配置

AN4: property_service.c property_perms[]

clipboard.png

AN5: external/sepolic/property_contexts
clipboard.png


歡迎你們來個人網站交流:般若程序蟬
qrcode_258.jpg

相關文章
相關標籤/搜索