在Android中,由于没有mdev和udev,所以它没有办法动态的生成设备节点,那么它是如何做的呢?

我们可以在system/core/init/下的init.c和devices.c中找到答案:

init.c中

        
  1. intmain(intargc,char**argv)
  2. {
  3. ...
  4. /*Getthebasicfilesystemsetupweneedput
  5. *togetherintheinitramdiskon/andthenwe'll
  6. *letthercfilefigureouttherest.
  7. */
  8. mkdir("/dev",0755);
  9. mkdir("/proc",0755);
  10. mkdir("/sys",0755);
  11. mount("tmpfs","/dev","tmpfs",0,"mode=0755");
  12. mkdir("/dev/pts",0755);
  13. mkdir("/dev/socket",0755);
  14. mount("devpts","/dev/pts","devpts",0,NULL);
  15. mount("proc","/proc","proc",0,NULL);
  16. mount("sysfs","/sys","sysfs",0,NULL);
  17. for(;;){
  18. ...
  19. if(ufds[0].revents==POLLIN)
  20. handle_device_fd(device_fd);
  21. if(ufds[1].revents==POLLIN)
  22. handle_property_set_fd(property_set_fd);
  23. if(ufds[3].revents==POLLIN)
  24. handle_keychord(keychord_fd);
  25. }
  26. return0;
  27. }

我们再来看看handle_device_fd(),该函数定义在devices.c中

        
  1. voidhandle_device_fd(intfd)
  2. {
  3. ...
  4. handle_device_event(&uevent);
  5. handle_firmware_event(&uevent);
  6. }
  7. }

而handle_device_event定义如下:

        
  1. staticvoidhandle_device_event(structuevent*uevent)
  2. {
  3. ...
  4. if(!strcmp(uevent->action,"add")){
  5. make_device(devpath,block,uevent->major,uevent->minor);
  6. return;
  7. }
  8. ...
  9. }

make_device定义如下:

        
  1. staticvoidmake_device(constchar*path,intblock,intmajor,intminor)
  2. {
  3. ...
  4. mode=get_device_perm(path,&uid,&gid)|(block?S_IFBLK:S_IFCHR);
  5. dev=(major<<8)|minor;
  6. ...
  7. setegid(gid);
  8. mknod(path,mode,dev);
  9. chown(path,uid,-1);
  10. setegid(AID_ROOT);
  11. }

我们看看get_device_perm如下实现:

        
  1. staticmode_tget_device_perm(constchar*path,unsigned*uid,unsigned*gid)
  2. {
  3. mode_tperm;
  4. if(get_device_perm_inner(qemu_perms,path,uid,gid,&perm)==0){
  5. returnperm;
  6. }elseif(get_device_perm_inner(devperms,path,uid,gid,&perm)==0){
  7. returnperm;
  8. }else{
  9. structlistnode*node;
  10. structperm_node*perm_node;
  11. structperms_*dp;
  12. /*Checkpartnerslist.*/
  13. list_for_each(node,&devperms_partners){
  14. perm_node=node_to_item(node,structperm_node,plist);
  15. dp=&perm_node->dp;
  16. if(dp->prefix){
  17. if(strncmp(path,dp->name,strlen(dp->name)))
  18. continue;
  19. }else{
  20. if(strcmp(path,dp->name))
  21. continue;
  22. }
  23. /*Foundperminpartnerlist.*/
  24. *uid=dp->uid;
  25. *gid=dp->gid;
  26. returndp->perm;
  27. }
  28. /*Defaultifnothingfound.*/
  29. *uid=0;
  30. *gid=0;
  31. return0600;
  32. }
  33. }

我们最后可以看到在devperms中定义了要生成的设备节点:

        
  1. staticstructperms_devperms[]={
  2. {"/dev/null",0666,AID_ROOT,AID_ROOT,0},
  3. {"/dev/zero",0666,AID_ROOT,AID_ROOT,0},
  4. {"/dev/full",0666,AID_ROOT,AID_ROOT,0},
  5. {"/dev/ptmx",0666,AID_ROOT,AID_ROOT,0},
  6. {"/dev/tty",0666,AID_ROOT,AID_ROOT,0},
  7. {"/dev/random",0666,AID_ROOT,AID_ROOT,0},
  8. {"/dev/urandom",0666,AID_ROOT,AID_ROOT,0},
  9. {"/dev/ashmem",0666,AID_ROOT,AID_ROOT,0},
  10. {"/dev/binder",0666,AID_ROOT,AID_ROOT,0},
  11. /*loggershouldbeworldwritable(forlogging)butnotreadable*/
  12. {"/dev/log/",0662,AID_ROOT,AID_LOG,1},
  13. /*themsmhw3dclientdevicenodeisworldwritable/readable.*/
  14. {"/dev/msm_hw3dc",0666,AID_ROOT,AID_ROOT,0},
  15. /*gpudriverforadreno200isgloballyaccessible*/
  16. {"/dev/kgsl",0666,AID_ROOT,AID_ROOT,0},
  17. /*theseshouldnotbeworldwritable*/
  18. {"/dev/diag",0660,AID_RADIO,AID_RADIO,0},
  19. {"/dev/diag_arm9",0660,AID_RADIO,AID_RADIO,0},
  20. {"/dev/android_adb",0660,AID_ADB,AID_ADB,0},
  21. {"/dev/android_adb_enable",0660,AID_ADB,AID_ADB,0},
  22. {"/dev/ttyMSM0",0600,AID_BLUETOOTH,AID_BLUETOOTH,0},
  23. {"/dev/ttyHS0",0600,AID_BLUETOOTH,AID_BLUETOOTH,0},
  24. {"/dev/uinput",0660,AID_SYSTEM,AID_BLUETOOTH,0},
  25. {"/dev/alarm",0664,AID_SYSTEM,AID_RADIO,0},
  26. {"/dev/tty0",0660,AID_ROOT,AID_SYSTEM,0},
  27. {"/dev/graphics/",0660,AID_ROOT,AID_GRAPHICS,1},
  28. {"/dev/msm_hw3dm",0660,AID_SYSTEM,AID_GRAPHICS,0},
  29. {"/dev/input/",0660,AID_ROOT,AID_INPUT,1},
  30. {"/dev/eac",0660,AID_ROOT,AID_AUDIO,0},
  31. {"/dev/cam",0660,AID_ROOT,AID_CAMERA,0},
  32. {"/dev/pmem",0660,AID_SYSTEM,AID_GRAPHICS,0},
  33. {"/dev/pmem_adsp",0660,AID_SYSTEM,AID_AUDIO,1},
  34. {"/dev/pmem_camera",0660,AID_SYSTEM,AID_CAMERA,1},
  35. {"/dev/oncrpc/",0660,AID_ROOT,AID_SYSTEM,1},
  36. {"/dev/adsp/",0660,AID_SYSTEM,AID_AUDIO,1},
  37. {"/dev/snd/",0660,AID_SYSTEM,AID_AUDIO,1},
  38. {"/dev/mt9t013",0660,AID_SYSTEM,AID_SYSTEM,0},
  39. {"/dev/msm_camera/",0660,AID_SYSTEM,AID_SYSTEM,1},
  40. {"/dev/akm8976_daemon",0640,AID_COMPASS,AID_SYSTEM,0},
  41. {"/dev/akm8976_aot",0640,AID_COMPASS,AID_SYSTEM,0},
  42. {"/dev/akm8973_daemon",0640,AID_COMPASS,AID_SYSTEM,0},
  43. {"/dev/akm8973_aot",0640,AID_COMPASS,AID_SYSTEM,0},
  44. {"/dev/bma150",0640,AID_COMPASS,AID_SYSTEM,0},
  45. {"/dev/cm3602",0640,AID_COMPASS,AID_SYSTEM,0},
  46. {"/dev/akm8976_pffd",0640,AID_COMPASS,AID_SYSTEM,0},
  47. {"/dev/lightsensor",0640,AID_SYSTEM,AID_SYSTEM,0},
  48. {"/dev/msm_pcm_out",0660,AID_SYSTEM,AID_AUDIO,1},
  49. {"/dev/msm_pcm_in",0660,AID_SYSTEM,AID_AUDIO,1},
  50. {"/dev/msm_pcm_ctl",0660,AID_SYSTEM,AID_AUDIO,1},
  51. {"/dev/msm_snd",0660,AID_SYSTEM,AID_AUDIO,1},
  52. {"/dev/msm_mp3",0660,AID_SYSTEM,AID_AUDIO,1},
  53. {"/dev/audience_a1026",0660,AID_SYSTEM,AID_AUDIO,1},
  54. {"/dev/tpa2018d1",0660,AID_SYSTEM,AID_AUDIO,1},
  55. {"/dev/msm_audpre",0660,AID_SYSTEM,AID_AUDIO,0},
  56. {"/dev/msm_audio_ctl",0660,AID_SYSTEM,AID_AUDIO,0},
  57. {"/dev/htc-acoustic",0660,AID_SYSTEM,AID_AUDIO,0},
  58. {"/dev/vdec",0660,AID_SYSTEM,AID_AUDIO,0},
  59. {"/dev/q6venc",0660,AID_SYSTEM,AID_AUDIO,0},
  60. {"/dev/snd/dsp",0660,AID_SYSTEM,AID_AUDIO,0},
  61. {"/dev/snd/dsp1",0660,AID_SYSTEM,AID_AUDIO,0},
  62. {"/dev/snd/mixer",0660,AID_SYSTEM,AID_AUDIO,0},
  63. {"/dev/smd0",0640,AID_RADIO,AID_RADIO,0},
  64. {"/dev/qemu_trace",0666,AID_SYSTEM,AID_SYSTEM,0},
  65. {"/dev/qmi",0640,AID_RADIO,AID_RADIO,0},
  66. {"/dev/qmi0",0640,AID_RADIO,AID_RADIO,0},
  67. {"/dev/qmi1",0640,AID_RADIO,AID_RADIO,0},
  68. {"/dev/qmi2",0640,AID_RADIO,AID_RADIO,0},
  69. /*CDMAradiointerfaceMUX*/
  70. {"/dev/ts0710mux",0640,AID_RADIO,AID_RADIO,1},
  71. {"/dev/ppp",0660,AID_RADIO,AID_VPN,0},
  72. {"/dev/tun",0640,AID_VPN,AID_VPN,0},
  73. {NULL,0,0,0,0},
  74. };

更多相关文章

  1. 为android系统添加USB AUDIO设备的放音和录音功能
  2. android 自定义xml属性
  3. Android自定义对话框的大小
  4. android构建自定义View和自定义组件
  5. 基于Android设备的 Kali Linux渗透测试教程(内部资料)
  6. Android USB Host开发之manager.getDeviceList()获取不到设备列
  7. 使用attrs.xml自定义属性
  8. 自定义android圆形ImageView
  9. Android 开发:(十四)NavigationBar篇-自定义顶部导航栏

随机推荐

  1. 在Ubuntu下获取Android4.0源代码并编译
  2. 《Java和Android开发实战详解》——1.5节
  3. Android将后台应用唤起到前台的方法
  4. Android图片压缩上传之基础篇
  5. Android(安卓)中的“后台无效动画“行为
  6. Android设置字体大小, 该用sp还是dp?
  7. Android(安卓)App支付系列(二):支付宝SDK接
  8. Android过度绘制深度优化---View提前绘制
  9. 老罗将死,或者Android也将就换代,但是互联
  10. Android(安卓)SDK 1.5中文版 (Applicatio