在冷启动完成之前,在早期初始化时启动本机服务

时间:2017-09-09 08:38:28

标签: android android-service android-source

Android中的启动顺序是通过system/core/rootdir/init.rc和其他*.rc文件定义的。这种方法允许将任何操作绑定到任何引导阶段(early-initinit等)。同样在system/core/init/init.cpp中定义了以下启动顺序:
  - ...;
  - early-init;
  - wait_for_coldboot_done;
  - ...;
  - init;
  - ...

这意味着绑定到*.rc阶段的导入early-init文件中的某些操作可以在coldboot(以及SELinux初始化)由ueventd完成之前启动。

所以我的问题是:如果本地服务在coldboot完成之前启动,它是否正常工作(显然这意味着此类服务不需要任何应由ueventd创建的设备)?

1 个答案:

答案 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(以及coldbootueventd) }}

<强>系统/核心/ ROOTDIR / ueventd.rc

ueventd.rc

因此,如果在... /dev/binder 0666 root root /dev/hwbinder 0666 root root /dev/vndbinder 0666 root root ... 完成之前启动了本机服务,则无法打开coldboot

同样在/dev/binder完成之前,coldbootcgrops(不确定)未初始化:
系统/核心/ ROOTDIR / init.rc

SELinux

P.S。但是,如果服务以passthrough模式进行通信?