私の質問:ネイティブサービスは、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
でも はcgrops
とSELinux
(わからない)初期化されませんが行わ。rc:
on init
...
# Mount cgroup mount point for cpu accounting
mount cgroup none /acct cpuacct
mkdir /acct/uid
P.S.しかし、サービスがpassthroughモードで通信する場合は?