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鐨勬帴鍙e畾涔夛紝

1 private static native Stringnative_get(Stringkey);
2 private static native Stringnative_get(Stringkey,Stringdef);
3 private static native void native_set(Stringkey,Stringdef);
4 public static void set(Stringkey,Stringval){
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 }
璇ユ帴鍙g被鍦ㄥ垵濮嬪寲杩愯鐜涓敞鍐屽搴旂殑cpp鎺ュ彛android_os_SystemProperties.cpp锛屽疄闄呮搷浣滈€氳繃JNI璋冪敤鐨勬槸cpp鏂囦欢瀵瑰簲鐨勬帴鍙o細

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,jobjectclazz,jstringkeyJ,jstringvalJ)
2 {
3 int err;
4 const char * key;
5 const char * val;
6 key = env -> GetStringUTFChars(keyJ,NULL);
7 if (valJ == NULL){
8 val = "" ; /* NULLpointernotallowedhere */
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鐨剉alue鏃讹紝闇€瑕佷綔閴存潈锛屾牴鎹缃▼搴忔墍鍦ㄨ繘绋嬬殑fd鑾风煡uid鍊硷紝姣斿system server杩涚▼鍙互璁剧疆net鎵撳ご鐨刱ey锛屼笉鍙互璁剧疆gsm鎵撳ご鐨刱ey锛岀浉鍏崇殑瀹氫箟濡備笅锛?

system/core/include/private/android_filesystem_config.h
1 #define AID_ROOT0/*traditionalunixrootuser*/
2 #define AID_SYSTEM1000/*systemserver*/
3 #define AID_RADIO1001/*telephonysubsystem,RIL*/
4 #define AID_DHCP1014/*dhcpclient*/
5 #define AID_SHELL2000/*adbanddebugshelluser*/
6 #define AID_CACHE2001/*cacheaccess*/
7 #define AID_APP10000/*firstappuser*/
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 /* Readpersistentpropertiesafteralldefaultvalueshavebeenloaded. */
41 load_persistent_properties();
42
43 fd = create_socket(PROP_SERVICE_NAME,SOCK_STREAM, 0666 , 0 , 0 );
44 if (fd < 0 ) return - 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:Unableto%sservicectl[%s]uid:%dpid:%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:permissiondenieduid:%dname:%s\n " ,
70 cr.uid,msg.name);
71 }
72 }
73 break ;
74
75 default :
76 break ;
77 }
78 }
鍦ㄥ紑鏈哄惎鍔ㄥ悗鐨刬nit鎿嶄綔涓紝浼氭墽琛屼竴涓猯oop寰幆锛屽綋妫€娴嬪埌鏈夋柊鐨勮缃椂锛岃繘鍏ヨ缃祦绋嬶紝閴存潈澶辫触浼氭彁绀虹浉鍏崇殑寮傚父锛屽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 }

OVER锛?/p>

http://www.blogjava.net/anymobile/articles/301989.html


更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. Android中播放GIF动画
  2. Android多线程下载远程图片
  3. Android(安卓)Hook 机制 简单实战
  4. Google Docs for Android(安卓)应用改进
  5. 后台应用不应做Android待机电池杀手
  6. Android编译系统入门(一)
  7. Unity导出android工程集成到android stud
  8. 大话企业级android读书笔记(一)
  9. Android(安卓)创建定时任务
  10. 【Android(安卓)开发入门】使用Android模