在 Android Binder 中,binder_handle_t 被定义为 uint32_t 类型。它通常是通过调用 open_driver() 函数来获取的。open_driver() 函数的源代码如下:
#ifndef NO_BINDER_OPEN_DRIVER static int open_driver() { int fd;
if (s_fd >= 0) {
return s_fd;
}
#if defined(HAVE_ANDROID_OS) fd = open("/dev/binder", O_RDWR); if (fd >= 0) { goto success; } fd = open("/dev/binder", O_RDONLY); if (fd >= 0) { goto success; } #elif defined(HAVE_ANDROID_OSLO) fd = open("/dev/hwbinder", O_RDWR); if (fd >= 0) { goto success; } fd = open("/dev/hwbinder", O_RDONLY); if (fd >= 0) { goto success; } #else // platform without binder #endif
ALOGE("binder: open failed");
return -1;
success: fcntl(fd, F_SETFD, FD_CLOEXEC); return s_fd = fd; } #endif // NO_BINDER_OPEN_DRIVER
上面的代码中,通过 open() 函数打开 "/dev/binder" 或者 "/dev/hwbinder" 设备,并将打开的文件描述符返回。如果打开失败则返回 -1。如果打开成功,则在成功的分支中将文件描述符设置关闭时自动释放,并将其保存在静态变量 s_fd 中,并将 s_fd 的值作为函数的返回值返回。这个 s_fd 就是 binder 驱动的打开文件描述符,在接下来的操作中可以使用它向 binder 驱动发送命令或者接收命令。