2017-09-09 6 views
0

Androidのブートシーケンスは、system/core/rootdir/init.rcとその他の*.rcファイルで定義されています。このようなアプローチでは、任意のアクションを任意のブートステージにバインドできます(early-initinitなど)。 system/core/init/init.cppには、ブートの次のシーケンスが定義されています。
-...;
-early-init;
-wait_for_coldboot_done;
-...;
-init;
-...コールドブート完了前に初期initでネイティブサービスを開始

は、これは、いくつかのアクションが内部coldboot(とSELinuxの初期化)ueventdによって終了される前に開始することができearly-initステージにバインドさ*.rcファイルをインポートすることを意味します。

coldbootが実行される前にネイティブサービスが正常に動作するかどうか(明らかに、そのようなサービスにはueventdによって作成されるデバイスは必要ありません)。

答えて

0

私の質問:ネイティブサービスは、coldbootが完了する前に開始されると正しく動作しますか?

場合によっては正しく動作することがありますが、一般的には失敗することがあります。ネイティブサービスがどのデバイスとも対話しない場合は、/dev/ファイルシステムは必要ありません。しかしbinderizedサービスは(相互作用カーネルとユーザ空間層間のための)バインダードライバを開く必要があるBinder IPC介して通信:

フレームワーク/ネイティブ/含む/バインダー/ 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); 
    } 

フレームワーク/native/libs/binder/IServiceManager.cpp

sp<IServiceManager> defaultServiceManager() 
{ 
       ... 
       ProcessState::self()->getContextObject(NULL)); 

フレームワーク/ネイティブ/ libsに/ BI NDER/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; 
} 

しかしバインダードライバ/der/binder(ならびに/dev/hwbinder/dev/vndbinder)はueventd.rcに従ってueventdによってcoldboot段階で作成されます。

システム/コア/ ROOTDIR/ueventd.rc

... 
/dev/binder    0666 root  root 
/dev/hwbinder    0666 root  root 
/dev/vndbinder   0666 root  root 
... 

ので、ネイティブのサービスが前に開始された場合 coldbootそれは /dev/binderを開けませんやりました!
システム/コア/ ROOTDIR/INIT:前coldbootでも

cgropsSELinux(わからない)初期化されませんが行わ。rc

on init 
    ... 
    # Mount cgroup mount point for cpu accounting 
    mount cgroup none /acct cpuacct 
    mkdir /acct/uid 

P.S.しかし、サービスがpassthroughモードで通信する場合は?

関連する問題