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

++wythern++

X presents Y for a better Z

[轉]Android系統systemProperties設置分析

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

Android 的系統屬性包括兩部分:文件保存的持久屬性和每次開機導入的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     }

該接口類在初始化運行環境中注冊對應的cpp接口android_os_SystemProperties.cpp,實際操作通過JNI調用的是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時,需要作鑒權,根據設置程序所在進程的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操作中,會執行一個loop循環,當檢測到有新的設置時,進入設置流程,鑒權失敗會提示相關的異常,如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>
            亚洲精品国产精品国自产在线| 免费成人高清视频| 久久综合五月| 美国成人毛片| 欧美fxxxxxx另类| 亚洲国产日日夜夜| 亚洲精品视频在线看| 一区二区三区**美女毛片| 日韩天天综合| 一本大道久久a久久综合婷婷| 一本色道久久综合| 亚洲伊人伊色伊影伊综合网| 久久黄色影院| 欧美高清视频一区| 99国产精品久久久久久久成人热| 中文日韩在线视频| 欧美一区二区高清| 久久夜色精品国产| 欧美精品一区二区三区四区| 国产精品区二区三区日本| 国模叶桐国产精品一区| 亚洲精品少妇| 久久国产黑丝| 亚洲国产欧美一区二区三区丁香婷| 日韩午夜av电影| 久久精品国产综合精品| 欧美日本中文字幕| 国产亚洲午夜| 一区二区三区**美女毛片| 久久久精品日韩欧美| 亚洲国产精品小视频| 午夜免费日韩视频| 欧美日韩不卡合集视频| 狠狠综合久久av一区二区小说| 一本久久综合| 欧美激情1区| 欧美专区第一页| 国产精品久久久久久久久借妻| 亚洲国产高清自拍| 欧美一区二区三区免费观看视频| 欧美激情精品久久久久久| 亚洲欧美日韩在线一区| 欧美日本一区二区高清播放视频| 国产性天天综合网| 亚洲网站在线观看| 亚洲精品欧美专区| 美女久久一区| 亚洲电影毛片| 卡一卡二国产精品| 欧美专区亚洲专区| 国产情人节一区| 亚洲欧美一区二区三区久久| 夜夜嗨一区二区| 欧美精品亚洲精品| 日韩一级大片在线| 亚洲国产日韩在线一区模特| 久久综合狠狠综合久久综青草| 国产日产欧产精品推荐色| 亚洲男人的天堂在线| 日韩亚洲欧美一区| 欧美日韩天天操| 国产精品99久久99久久久二8| 亚洲精品乱码视频| 欧美日韩不卡在线| 一本色道久久综合狠狠躁的推荐| 亚洲激情av| 欧美日韩国产另类不卡| 农夫在线精品视频免费观看| 国产一区二区三区最好精华液| 久久大逼视频| 久久久精品午夜少妇| 在线观看精品| 亚洲高清不卡在线| 欧美激情精品久久久久久免费印度| 91久久精品国产91性色| 亚洲国产精品一区二区第四页av| 欧美成人免费小视频| 日韩午夜av电影| 一本色道久久综合亚洲精品高清| 国产精品jizz在线观看美国| 午夜精品久久99蜜桃的功能介绍| 亚洲欧美日韩精品一区二区| 国产视频一区欧美| 欧美国产日韩精品免费观看| 欧美精选在线| 欧美一区二区视频免费观看| 欧美一区二区三区免费观看 | 麻豆精品视频在线观看| 久久久久中文| 日韩一级在线观看| 亚洲一区国产| 在线播放豆国产99亚洲| 亚洲高清影视| 国产精品久久久久影院色老大 | 欧美一二三区精品| 亚洲福利视频三区| 99综合电影在线视频| 国产日本欧洲亚洲| 欧美国产高潮xxxx1819| 国产精品s色| 欧美成年视频| 国产欧美不卡| 亚洲精品免费一二三区| 国产欧美日韩亚洲| 亚洲高清色综合| 9l国产精品久久久久麻豆| 激情成人亚洲| 99国产麻豆精品| 一区二区在线视频观看| 一本色道久久综合亚洲精品不卡 | 久久精品视频亚洲| 亚洲视频1区2区| 久久久久久高潮国产精品视| 亚洲视频axxx| 免费中文字幕日韩欧美| 欧美一区二区三区啪啪| 欧美69wwwcom| 久久久久欧美| 国产精品一区免费视频| 亚洲精品国产欧美| 亚洲大片精品永久免费| 性欧美办公室18xxxxhd| 欧美国产三级| 奶水喷射视频一区| 国产亚洲精品一区二555| 亚洲美女精品久久| 最新国产の精品合集bt伙计| 午夜精品久久久久久久久| 中文日韩欧美| 欧美精品日韩三级| 欧美激情欧美狂野欧美精品 | 国产乱人伦精品一区二区| 日韩写真视频在线观看| 夜夜爽99久久国产综合精品女不卡| 久久综合网络一区二区| 麻豆av福利av久久av| 极品日韩久久| 久久久久久久久综合| 久久综合激情| **网站欧美大片在线观看| 久久精品一本久久99精品| 久久精品亚洲| 狠久久av成人天堂| 久久久久免费| 亚洲大胆在线| 在线亚洲免费| 国产精品一区二区三区四区五区 | 欧美一区二区三区免费看| 欧美在线啊v| 国内自拍视频一区二区三区 | 亚洲小视频在线| 久久久久国色av免费观看性色| 国产一区二区日韩| 美女精品在线观看| 99在线|亚洲一区二区| 欧美一级网站| 精品不卡一区二区三区| 免费成人网www| 亚洲精品网址在线观看| 欧美一级艳片视频免费观看| 合欧美一区二区三区| 欧美成人情趣视频| 亚洲图片欧洲图片av| 久久久久久久激情视频| 亚洲国产日韩精品| 欧美日韩亚洲一区| 欧美一区二区精品| 亚洲国产精品视频一区| 性欧美超级视频| 亚洲精品国产精品久久清纯直播| 欧美四级剧情无删版影片| 欧美一二区视频| 日韩网站在线| 欧美大片在线观看一区| 亚洲婷婷国产精品电影人久久| 国产夜色精品一区二区av| 欧美大片网址| 欧美呦呦网站| 一区二区三区欧美| 欧美成人久久| 欧美在线播放| 日韩视频一区二区三区| 国产偷国产偷精品高清尤物| 欧美成人自拍视频| 欧美有码在线视频| 日韩午夜av电影| 欧美大片在线观看一区| 悠悠资源网亚洲青| 国产精品高潮视频| 美女日韩欧美| 欧美在线综合| 午夜精品免费视频| 亚洲人成人一区二区在线观看 | 裸体歌舞表演一区二区| 亚洲视屏在线播放| 亚洲激情网址| 韩国免费一区| 国产区在线观看成人精品| 欧美精品一区二区三| 葵司免费一区二区三区四区五区|