青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

++wythern++

X presents Y for a better Z

[轉]Android系統(tǒng)systemProperties設置分析

作者:徐建祥(netpirate@gmail.com)
日期:2009/11/11
網(wǎng)址:http://www.anymobile.org

Android 的系統(tǒng)屬性包括兩部分:文件保存的持久屬性和每次開機導入的cache屬性。前者主要保存在下面幾個文件中:

bionic/libc/include/sys/_system_properties.h
1     #define PROP_SERVICE_NAME "property_service"
2     #define PROP_PATH_RAMDISK_DEFAULT  "/default.prop"
3     #define PROP_PATH_SYSTEM_BUILD     "/system/build.prop"
4     #define PROP_PATH_SYSTEM_DEFAULT   "/system/default.prop"
5     #define PROP_PATH_LOCAL_OVERRIDE   "/data/local.prop"

后者則通過frameworks/base/core/java/android/os/SystemProperties.java的接口定義,

 1     private static native String native_get(String key);
 2     private static native String native_get(String key, String def);
 3     private static native void native_set(String key, String def);
 4     public static void set(String key, String val) {
 5         if (key.length() > PROP_NAME_MAX) {
 6             throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
 7         }
 8         if (val != null && val.length() > PROP_VALUE_MAX) {
 9             throw new IllegalArgumentException("val.length > " +
10                 PROP_VALUE_MAX);
11         }
12         native_set(key, val);
13     }

該接口類在初始化運行環(huán)境中注冊對應的cpp接口android_os_SystemProperties.cpp,實際操作通過JNI調(diào)用的是cpp文件對應的接口:

frameworks/base/core/jni/AndroidRuntime.cpp
1     namespace android {
2     extern int register_android_os_SystemProperties(JNIEnv *env);
3     }

frameworks/base/core/jni/android_os_SystemProperties.cpp
 1     static void SystemProperties_set(JNIEnv *env, jobject clazz, jstring keyJ, jstring valJ)
 2     {
 3         int err;
 4         const char* key;
 5         const char* val;
 6         key = env->GetStringUTFChars(keyJ, NULL);
 7         if (valJ == NULL) {
 8             val = "";       /* NULL pointer not allowed here */
 9         } else {
10             val = env->GetStringUTFChars(valJ, NULL);
11         }
12         err = property_set(key, val);
13         env->ReleaseStringUTFChars(keyJ, key);        
14         if (valJ != NULL) {
15             env->ReleaseStringUTFChars(valJ, val);
16         }
17     }

設置key的value時,需要作鑒權,根據(jù)設置程序所在進程的fd獲知uid值,比如system server進程可以設置net打頭的key,不可以設置gsm打頭的key,相關的定義如下:

system/core/include/private/android_filesystem_config.h
1     #define AID_ROOT             0  /* traditional unix root user */
2     #define AID_SYSTEM        1000  /* system server */
3     #define AID_RADIO         1001  /* telephony subsystem, RIL */
4     #define AID_DHCP          1014  /* dhcp client */
5     #define AID_SHELL         2000  /* adb and debug shell user */
6     #define AID_CACHE         2001  /* cache access */
7     #define AID_APP          10000 /* first app user */

system/core/init/property_service.c
 1     #define PERSISTENT_PROPERTY_DIR  "/data/property"
 2     struct {
 3         const char *prefix;
 4         unsigned int uid;
 5     } property_perms[] = {
 6         { "net.rmnet0.",    AID_RADIO },
 7         { "net.gprs.",      AID_RADIO },
 8         { "ril.",           AID_RADIO },
 9         { "gsm.",           AID_RADIO },
10         { "net.dns",        AID_RADIO },
11         { "net.usb0",       AID_RADIO },
12         { "net.",           AID_SYSTEM },
13         { "dev.",           AID_SYSTEM },
14         { "runtime.",       AID_SYSTEM },
15         { "hw.",            AID_SYSTEM },
16         { "sys.",        AID_SYSTEM },
17         { "service.",    AID_SYSTEM },
18         { "wlan.",        AID_SYSTEM },
19         { "dhcp.",        AID_SYSTEM },
20         { "dhcp.",        AID_DHCP },
21         { "debug.",        AID_SHELL },
22         { "log.",        AID_SHELL },
23         { "service.adb.root",    AID_SHELL },
24         { "persist.sys.",    AID_SYSTEM },
25         { "persist.service.",   AID_SYSTEM },
26         { NULL, 0 }
27     };
28     int property_set(const char *name, const char *value)
29     {
30         property_changed(name, value);
31         return 0;
32     }
33     int start_property_service(void)
34     {
35         int fd;
36 
37         load_properties_from_file(PROP_PATH_SYSTEM_BUILD);
38         load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
39         load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);
40         /* Read persistent properties after all default values have been loaded. */
41         load_persistent_properties();
42 
43         fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 066600);
44         if(fd < 0return -1;
45         fcntl(fd, F_SETFD, FD_CLOEXEC);
46         fcntl(fd, F_SETFL, O_NONBLOCK);
47 
48         listen(fd, 8);
49         return fd;
50     }
51     void handle_property_set_fd(int fd)
52     {
53         switch(msg.cmd) {
54         case PROP_MSG_SETPROP:
55             msg.name[PROP_NAME_MAX-1= 0;
56             msg.value[PROP_VALUE_MAX-1= 0;
57 
58             if(memcmp(msg.name,"ctl.",4== 0) {
59                 if (check_control_perms(msg.value, cr.uid)) {
60                     handle_control_message((char*) msg.name + 4, (char*) msg.value);
61                 } else {
62                     ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",
63                             msg.name + 4, msg.value, cr.uid, cr.pid);
64                 }
65             } else {
66                 if (check_perms(msg.name, cr.uid)) {
67                     property_set((char*) msg.name, (char*) msg.value);
68                 } else {
69                     ERROR("sys_prop: permission denied uid:%d  name:%s\n",
70                           cr.uid, msg.name);
71                 }
72             }
73             break;
74 
75         default:
76             break;
77         }
78     }

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

system/core/init/init.c
 1     void property_changed(const char *name, const char *value)
 2     {
 3         if (property_triggers_enabled) {
 4             queue_property_triggers(name, value);
 5             drain_action_queue();
 6         }
 7     }
 8     int main(int argc, char **argv)
 9     {
10         parse_config_file("/init.rc");
11         qemu_init();
12         device_fd = device_init();
13         property_init();
14         fd = open(console_name, O_RDWR);
15         property_set_fd = start_property_service();
16         ufds[0].fd = device_fd;
17         ufds[0].events = POLLIN;
18         ufds[1].fd = property_set_fd;
19         ufds[1].events = POLLIN;
20         ufds[2].fd = signal_recv_fd;
21         ufds[2].events = POLLIN;
22         fd_count = 3;
23         for(;;) {
24             if (ufds[0].revents == POLLIN)
25                 handle_device_fd(device_fd);
26 
27             if (ufds[1].revents == POLLIN)
28                 handle_property_set_fd(property_set_fd);
29             if (ufds[3].revents == POLLIN)
30                 handle_keychord(keychord_fd);
31         }
32         return 0;
33     }

posted on 2012-09-29 10:35 wythern 閱讀(383) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产亚洲成年网址在线观看| 亚洲国产毛片完整版| 欧美体内谢she精2性欧美| 久久久国产精品一区| 午夜精品一区二区三区四区| 亚洲伦理网站| 亚洲黄一区二区| 亚洲乱码日产精品bd| 一区二区91| 亚洲一区二区精品在线| 欧美精品麻豆| 亚洲人永久免费| 亚洲精品国产日韩| 在线亚洲欧美视频| 亚洲欧美激情诱惑| 久久国内精品自在自线400部| 久久成人国产精品| 毛片一区二区| 亚洲东热激情| 一区二区三区毛片| 午夜精品久久久久久久蜜桃app| 久久国产精品久久国产精品 | 午夜精品美女自拍福到在线| 亚洲一区视频在线| 久久久久久欧美| 男女精品网站| 在线亚洲欧美| 久久深夜福利免费观看| 欧美日韩中文字幕精品| 国产一区视频网站| 日韩午夜在线观看视频| 小黄鸭精品aⅴ导航网站入口| 免费日韩av片| 国产精品久久久久婷婷| 亚洲国产影院| 久久久99久久精品女同性| 亚洲国产精品久久人人爱蜜臀 | 欧美亚洲视频在线观看| 久久久亚洲影院你懂的| 欧美性猛交xxxx乱大交蜜桃| 永久91嫩草亚洲精品人人| 中日韩美女免费视频网站在线观看| 久久精品人人爽| 99精品国产在热久久| 久久久久久午夜| 国产日韩亚洲欧美精品| 亚洲欧美中日韩| 亚洲毛片播放| 欧美黄色片免费观看| 激情综合在线| 国产精品久久久久久久久久尿 | 亚洲高清资源| 欧美中文在线字幕| 亚洲国产精品一区二区www在线| 欧美一区二区免费观在线| 欧美极品在线观看| 亚洲精品一区二| 久久阴道视频| 久久9热精品视频| 国产精品欧美一区二区三区奶水 | 久久精品一区二区国产| 国产日韩欧美中文| 欧美亚洲三级| 亚洲在线免费| 国产精品一二三| 亚洲免费在线电影| 一区二区三区成人精品| 欧美亚州一区二区三区| 亚洲一区中文字幕在线观看| 一区二区欧美视频| 国产精品成人aaaaa网站| 99视频国产精品免费观看| 亚洲国产精品一区二区三区| 欧美成人午夜激情| 99这里只有精品| 亚洲最新色图| 国产精品欧美日韩久久| 久久九九精品99国产精品| 欧美一区二区免费视频| 好吊日精品视频| 狼人社综合社区| 蜜桃久久精品一区二区| 夜久久久久久| 亚洲在线中文字幕| 黄色成人在线观看| 亚洲福利视频网站| 欧美日韩亚洲成人| 欧美一级日韩一级| 久久久国产成人精品| 亚洲精品在线一区二区| 一本久道综合久久精品| 国产亚洲激情| 亚洲国产精品久久久久秋霞影院 | 欧美精品一卡二卡| 欧美在线网站| 久久久久久网站| 亚洲精品中文字幕在线| 亚洲视频在线观看三级| 国一区二区在线观看| 亚洲福利在线看| 国产精品乱码| 亚洲第一中文字幕在线观看| 欧美日韩18| 一区二区国产日产| 午夜精品福利电影| 亚洲黄色成人| 一本大道久久a久久精品综合| 国产精品一香蕉国产线看观看| 久久天天综合| 国产精品成人一区二区网站软件| 麻豆国产精品一区二区三区 | 另类酷文…触手系列精品集v1小说| 另类欧美日韩国产在线| 亚洲尤物视频在线| 免费影视亚洲| 欧美在线在线| 欧美日韩国产一区二区| 久久一区视频| 国产精品系列在线| 亚洲精品视频在线看| 国产日韩欧美夫妻视频在线观看| 欧美激情区在线播放| 国产日韩欧美高清| 99国产精品久久| 亚洲精品婷婷| 麻豆成人在线观看| 久久一区中文字幕| 国产精品专区一| 亚洲男人第一av网站| 亚洲夜间福利| 欧美视频在线观看视频极品 | 一区二区三区久久精品| 欧美xart系列高清| 欧美不卡视频一区| 国产亚洲在线观看| 亚洲欧美美女| 欧美在线不卡| 国产精品久久久久7777婷婷| 亚洲精品久久久久久久久久久| 亚洲欧洲日产国产综合网| 久久久不卡网国产精品一区| 快射av在线播放一区| 尤物yw午夜国产精品视频| 久久er精品视频| 久久精品亚洲一区二区| 国产亚洲福利社区一区| 久久久免费精品视频| 免费观看成人| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲美女免费精品视频在线观看| 亚洲黄色成人久久久| 久久综合五月| 亚洲电影网站| 日韩一级免费| 欧美香蕉视频| 亚洲欧美日韩精品久久亚洲区| 久久国内精品视频| 亚洲第一二三四五区| 免费中文字幕日韩欧美| 亚洲美女av黄| 国产欧美日韩在线 | 午夜在线观看免费一区| 久久国产欧美| 国色天香一区二区| 欧美成人亚洲| 一本色道久久综合| 久久激五月天综合精品| 亚洲国产日韩欧美| 欧美日韩国产一区精品一区| 亚洲视频在线二区| 蜜桃久久av| 亚洲一区二区三区在线视频| 国产欧美精品日韩区二区麻豆天美| 羞羞答答国产精品www一本| 欧美成人r级一区二区三区| 亚洲深爱激情| 激情一区二区| 国产精品av一区二区| 欧美一区二区日韩一区二区| 美女图片一区二区| 在线视频你懂得一区| 国产午夜久久久久| 欧美精品久久久久久久久久| 先锋影音一区二区三区| 亚洲第一视频| 欧美一区二区三区啪啪| 亚洲精品免费一区二区三区| 国产精品视频网站| 欧美aa国产视频| 午夜视频一区| 日韩手机在线导航| 欧美www视频| 欧美在线亚洲综合一区| 亚洲国产日韩欧美在线图片| 国产日本欧美一区二区三区在线| 欧美国产丝袜视频| 久久成人精品| 亚洲尤物在线| 一本色道久久综合亚洲精品小说| 亚洲第一网站|