Android中的启动顺序是通过system/core/rootdir/init.rc
和其他*.rc
文件定义的。这种方法允许将任何操作绑定到任何引导阶段(early-init
,init
等)。同样在system/core/init/init.cpp
中定义了以下启动顺序:
- ...
;
- early-init
;
- wait_for_coldboot_done
;
- ...
;
- init
;
- ...
。
这意味着绑定到*.rc
阶段的导入early-init
文件中的某些操作可以在coldboot
(以及SELinux初始化)由ueventd
完成之前启动。
所以我的问题是:如果本地服务在coldboot
完成之前启动,它是否正常工作(显然这意味着此类服务不需要任何应由ueventd
创建的设备)?
答案 0 :(得分:0)
所以我的问题是:如果本地服务在
coldboot
完成之前启动,它是否正常工作?
有时它可能正常工作,但一般情况下可能会失败。如果本机服务不与任何设备交互,则它不需要/dev/
文件系统。但是,binderized服务通过Binder IPC进行通信,这需要打开binder驱动程序(用于内核和用户空间层之间的交互):
<强>框架/天然的/包括/粘合剂/ BinderService.h 强>:
template<typename SERVICE>
class BinderService
{
public:
...
static void instantiate() { publish(); }
...
static status_t publish(bool allowIsolated = false) {
sp<IServiceManager> sm(defaultServiceManager());
return sm->addService(
String16(SERVICE::getServiceName()),
new SERVICE(), allowIsolated);
}
<强>框架/天然的/库/粘合剂/ IServiceManager.cpp 强>:
sp<IServiceManager> defaultServiceManager()
{
...
ProcessState::self()->getContextObject(NULL));
<强>框架/天然的/库/粘合剂/ ProcessState.cpp 强>:
sp<ProcessState> ProcessState::self()
{
...
gProcess = new ProcessState("/dev/binder");
return gProcess;
}
ProcessState::ProcessState(const char *driver)
: mDriverName(String8(driver))
, mDriverFD(open_driver(driver))
...
{
if (mDriverFD >= 0) {
// mmap the binder, providing a chunk of virtual address space to receive transactions.
mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
if (mVMStart == MAP_FAILED) {
// *sigh*
...
ALOGE("Using /dev/binder failed: unable to mmap transaction memory.\n");
LOG_ALWAYS_FATAL_IF(mDriverFD < 0, "Binder driver could not be opened. Terminating.");
}
static int open_driver(const char *driver)
{
int fd = open(driver, O_RDWR | O_CLOEXEC);
if (fd >= 0) {
...
} else {
ALOGW("Opening '%s' failed: %s\n", driver, strerror(errno));
}
return fd;
}
但根据{{1},/der/binder
在/dev/hwbinder
阶段创建了Binder驱动程序/dev/vndbinder
(以及coldboot
和ueventd
) }}
<强>系统/核心/ ROOTDIR / ueventd.rc 强>:
ueventd.rc
因此,如果在...
/dev/binder 0666 root root
/dev/hwbinder 0666 root root
/dev/vndbinder 0666 root root
...
完成之前启动了本机服务,则无法打开coldboot
!
同样在/dev/binder
完成之前,coldboot
和cgrops
(不确定)未初始化:
的系统/核心/ ROOTDIR / init.rc 强>:
SELinux
P.S。但是,如果服务以passthrough模式进行通信?