- android如何在init.rc中添加/dev/字符设备节点创建权限
- system/core/init/init.c
- system/core/init/keywords.h:77: KEYWORD(device, COMMAND, 4, do_device)
- do_device
- add_devperms_partners
- /init.rc中我们可以为/dev/下具体设备节点的当被创建时,控制信息
- on early-init
- device /dev/gpio 644 system wifi
- device /dev/snd* 664 system audio
- 其中*表示prefix为1,没有*表示prefix为0[luther.gliethttp]
- 上面的device关键字后面的system和wifi字符串描述对应的id为
- static struct android_id_info android_ids[] = {
- { "root", AID_ROOT, },
- { "system", AID_SYSTEM, },
- { "radio", AID_RADIO, },
- { "bluetooth", AID_BLUETOOTH, },
- { "graphics", AID_GRAPHICS, },
- { "input", AID_INPUT, },
- { "audio", AID_AUDIO, },
- { "camera", AID_CAMERA, },
- { "log", AID_LOG, },
- { "compass", AID_COMPASS, },
- { "mount", AID_MOUNT, },
- { "wifi", AID_WIFI, },
- { "dhcp", AID_DHCP, },
- { "adb", AID_ADB, },
- { "install", AID_INSTALL, },
- { "media", AID_MEDIA, },
- { "shell", AID_SHELL, },
- { "cache", AID_CACHE, },
- { "diag", AID_DIAG, },
- { "net_bt_admin", AID_NET_BT_ADMIN, },
- { "net_bt", AID_NET_BT, },
- { "sdcard_rw", AID_SDCARD_RW, },
- { "vpn", AID_VPN, },
- { "keystore", AID_KEYSTORE, },
- { "inet", AID_INET, },
- { "net_raw", AID_NET_RAW, },
- { "net_admin", AID_NET_ADMIN, },
- { "misc", AID_MISC, },
- { "nobody", AID_NOBODY, },
- };
- // =======================================
- system/core/init/init.c
- int main(int argc, char **argv)
- {
- ......
- INFO("reading config file\n");
- parse_config_file("/init.rc");
- /* pull the kernel commandline and ramdisk properties file in */
- qemu_init();
- import_kernel_cmdline(0);
- get_hardware_name();
- snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
- parse_config_file(tmp);
- // 需要在on early-init加入device
- // 这样下面的device_init();创建节点动作
- // 才会根据这里的对device设备的描述创建出相应权限的节点[luther.gliethttp]
- action_for_each_trigger("early-init", action_add_queue_tail);
- drain_action_queue();
- // 因为device_init()将依赖sysfs文件系统提供的uevent机制
- // 对builtin到kernel中的所有char,block,net等设备,
- // 在/dev/目录下动态创建出对应的节点,此时会使用到
- // init.rc中device添加的内容device信息,
- // 因此device命令必须添加到early-init字段中
- // 即[luther.gliethttp]
- // on early-init
- // device /dev/gpio 644 system wifi
- // device /dev/snd* 644system audio
- INFO("device init\n");
- device_fd = device_init();
- ......
- }
|