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

++wythern++

X presents Y for a better Z

[轉(zhuǎn)]Android系統(tǒng)systemProperties設(shè)置分析

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

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

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"

后者則通過(guò)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     }

該接口類(lèi)在初始化運(yùn)行環(huán)境中注冊(cè)對(duì)應(yīng)的cpp接口android_os_SystemProperties.cpp,實(shí)際操作通過(guò)JNI調(diào)用的是cpp文件對(duì)應(yīng)的接口:

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     }

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

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     }

在開(kāi)機(jī)啟動(dòng)后的init操作中,會(huì)執(zhí)行一個(gè)loop循環(huán),當(dāng)檢測(cè)到有新的設(shè)置時(shí),進(jìn)入設(shè)置流程,鑒權(quán)失敗會(huì)提示相關(guā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) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区性| 99在线精品视频在线观看| 亚洲第一搞黄网站| 国产一区二区三区四区hd| 国产精品自拍一区| 国产综合色一区二区三区| 狠狠入ady亚洲精品经典电影| 国内视频一区| 最新高清无码专区| 亚洲尤物精选| 久久裸体视频| 亚洲麻豆一区| 午夜性色一区二区三区免费视频 | 1024成人| 夜夜爽www精品| 欧美在线免费视屏| 亚洲福利在线看| 日韩午夜剧场| 久久久精品网| 欧美视频在线观看视频极品| 国产乱子伦一区二区三区国色天香| 国产一区二区三区四区hd| 亚洲精品国产精品久久清纯直播| 亚洲欧美另类国产| 久久综合中文| 中文高清一区| 久久亚洲视频| 亚洲成色999久久网站| 香蕉成人久久| 国产裸体写真av一区二区| 亚洲成在线观看| 欧美波霸影院| 欧美在线播放| 亚洲精品社区| 久久亚洲精选| 国产亚洲精品bt天堂精选| 99国产精品一区| 欧美a级一区| 久久9热精品视频| 国产精品一二三四| 亚洲素人在线| 亚洲另类黄色| 欧美精品免费在线| 亚洲国产视频a| 久久久天天操| 香蕉精品999视频一区二区 | 久久久天天操| 亚洲欧美日韩国产一区| 欧美日韩国产亚洲一区| 亚洲精品乱码久久久久久| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲香蕉成视频在线观看 | 久久久一二三| 黄色亚洲在线| 久久人人爽人人爽| 久久精品99国产精品日本| 国产精品国产福利国产秒拍| 亚洲精品永久免费| 亚洲人成艺术| 欧美日韩爆操| 亚洲免费在线电影| 一区二区三区日韩在线观看| 欧美午夜激情视频| 亚洲一区欧美| 亚洲午夜在线观看视频在线| 国产精品一区二区在线观看不卡| 亚洲自拍偷拍网址| 性做久久久久久久免费看| 国产一区二区精品久久91| 久久野战av| 欧美国产综合视频| 亚洲影院色在线观看免费| 亚洲精品色婷婷福利天堂| 每日更新成人在线视频| 麻豆成人在线播放| 99精品久久| 中文在线不卡| 国精产品99永久一区一区| 美女主播精品视频一二三四| 老色鬼精品视频在线观看播放| 亚洲国产网站| 99热在这里有精品免费| 国产欧美一区二区三区另类精品 | 亚洲第一主播视频| 欧美大片国产精品| 一区二区三区四区国产精品| 中文在线不卡| 在线播放不卡| 日韩天天综合| 国产一区二区久久久| 欧美福利视频一区| 欧美色123| 久久综合给合久久狠狠色| 欧美黑人在线观看| 久久久久国产一区二区三区四区| 久热国产精品| 欧美一区二区在线观看| 欧美成人一区在线| 欧美一区二区三区播放老司机| 久久久久综合| 午夜一区二区三区在线观看| 久久久人成影片一区二区三区观看| 99视频一区二区三区| 欧美一级视频| 亚洲午夜精品久久久久久浪潮| 久久精品国产亚洲a| 亚洲一区二区三区四区五区午夜| 久久精品官网| 欧美一区免费视频| 欧美日韩免费在线观看| 美女国产精品| 国产区日韩欧美| 9色国产精品| 最新成人av在线| 久久久久久精| 久久久久久久性| 国产精品激情电影| 91久久精品一区二区别| 国产在线一区二区三区四区| 亚洲巨乳在线| 亚洲乱码一区二区| 欧美成人一区二区三区| 欧美不卡视频| 1024亚洲| 久久久精品动漫| 久久久久久久综合狠狠综合| 国产精品久久中文| 亚洲午夜三级在线| 亚洲永久视频| 国产精品欧美一区喷水 | 亚洲欧美三级伦理| 欧美午夜精品理论片a级按摩| 欧美激情91| 亚洲精品一区二区三区婷婷月 | 久久在线免费| 欧美成人日本| 亚洲乱码久久| 欧美日韩一区二区三区高清| 亚洲日本中文字幕| 9l视频自拍蝌蚪9l视频成人| 欧美极品影院| 中文一区字幕| 久久九九精品| 麻豆国产va免费精品高清在线| 欧美日韩国产美| 最新国产成人在线观看| 亚洲精品资源美女情侣酒店| 久久久夜夜夜| 欧美国产欧美亚洲国产日韩mv天天看完整 | 免费成人黄色av| 亚洲第一狼人社区| 亚洲靠逼com| 欧美日韩激情网| 亚洲视频在线观看| 久久福利电影| 在线免费观看日韩欧美| 欧美成人午夜77777| 9久re热视频在线精品| 欧美一区二区女人| 在线观看日韩av先锋影音电影院| 久久中文久久字幕| 最新日韩在线| 香蕉尹人综合在线观看| 永久久久久久| 久久成人国产精品| 伊人婷婷欧美激情| 欧美日韩日韩| 久久精品国产欧美亚洲人人爽| 欧美国产视频日韩| 亚洲欧美日韩中文视频| 一区二区三区自拍| 欧美丝袜一区二区| 久久人人97超碰国产公开结果| 亚洲欧洲日韩综合二区| 欧美在线一区二区| 亚洲伦理在线观看| 国产在线视频不卡二| 亚洲第一在线综合在线| 午夜电影亚洲| 亚洲精品男同| 国模精品一区二区三区| 欧美日韩一区在线观看视频| 久久不射中文字幕| 99在线精品观看| 欧美激情亚洲自拍| 欧美怡红院视频一区二区三区| 最新亚洲视频| 在线不卡a资源高清| 国产精品入口66mio| 欧美精品日韩www.p站| 久久久久久尹人网香蕉| 亚洲欧美色一区| 一级成人国产| 亚洲国产精品精华液2区45| 久久精品国产亚洲高清剧情介绍| 一区二区三区回区在观看免费视频| 亚洲欧美日韩爽爽影院| 日韩视频在线免费观看| 亚洲第一搞黄网站| 免费在线播放第一区高清av|