diff options
author | 2022-07-20 20:53:36 +0000 | |
---|---|---|
committer | 2022-07-25 20:41:06 +0000 | |
commit | 454bfd9e438094b29d69d63274063fdc67e69544 (patch) | |
tree | a8aa0ac2d1d268eeedb5920793804e8c349ec7fc | |
parent | dcc3db7bd101a67010d2739b75ac3869a4417bf2 (diff) |
servicemanager started property
If something starts before servicemanager does,
intelligently wait for servicemanager to start rather
than sleeping for 1s.
Bug: 239382640
Test: boot
Change-Id: Ic3df299d8b37c2caeeac4ae90402e7f5be1e7ecc
-rw-r--r-- | cmds/servicemanager/main.cpp | 14 | ||||
-rw-r--r-- | cmds/servicemanager/servicemanager.microdroid.rc | 1 | ||||
-rw-r--r-- | cmds/servicemanager/servicemanager.rc | 1 | ||||
-rw-r--r-- | cmds/servicemanager/servicemanager.recovery.rc | 1 | ||||
-rw-r--r-- | libs/binder/IServiceManager.cpp | 11 |
5 files changed, 24 insertions, 4 deletions
diff --git a/cmds/servicemanager/main.cpp b/cmds/servicemanager/main.cpp index 1d458b736a..a831d1b74d 100644 --- a/cmds/servicemanager/main.cpp +++ b/cmds/servicemanager/main.cpp @@ -15,6 +15,7 @@ */ #include <android-base/logging.h> +#include <android-base/properties.h> #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/Status.h> @@ -26,15 +27,14 @@ #include "ServiceManager.h" using ::android::Access; -using ::android::sp; +using ::android::IPCThreadState; using ::android::Looper; using ::android::LooperCallback; using ::android::ProcessState; -using ::android::IPCThreadState; -using ::android::ProcessState; using ::android::ServiceManager; -using ::android::os::IServiceManager; using ::android::sp; +using ::android::base::SetProperty; +using ::android::os::IServiceManager; class BinderCallback : public LooperCallback { public: @@ -140,6 +140,12 @@ int main(int argc, char** argv) { BinderCallback::setupTo(looper); ClientCallbackCallback::setupTo(looper, manager); +#ifndef VENDORSERVICEMANAGER + if (!SetProperty("servicemanager.ready", "true")) { + LOG(ERROR) << "Failed to set servicemanager ready property"; + } +#endif + while(true) { looper->pollAll(-1); } diff --git a/cmds/servicemanager/servicemanager.microdroid.rc b/cmds/servicemanager/servicemanager.microdroid.rc index e01f132c64..c516043bb7 100644 --- a/cmds/servicemanager/servicemanager.microdroid.rc +++ b/cmds/servicemanager/servicemanager.microdroid.rc @@ -3,6 +3,7 @@ service servicemanager /system/bin/servicemanager.microdroid user system group system readproc critical + onrestart setprop servicemanager.ready false onrestart restart apexd task_profiles ServiceCapacityLow shutdown critical diff --git a/cmds/servicemanager/servicemanager.rc b/cmds/servicemanager/servicemanager.rc index e5d689ff91..6b35265fc8 100644 --- a/cmds/servicemanager/servicemanager.rc +++ b/cmds/servicemanager/servicemanager.rc @@ -3,6 +3,7 @@ service servicemanager /system/bin/servicemanager user system group system readproc critical + onrestart setprop servicemanager.ready false onrestart restart apexd onrestart restart audioserver onrestart restart gatekeeperd diff --git a/cmds/servicemanager/servicemanager.recovery.rc b/cmds/servicemanager/servicemanager.recovery.rc index 067faf9c8f..b927c018df 100644 --- a/cmds/servicemanager/servicemanager.recovery.rc +++ b/cmds/servicemanager/servicemanager.recovery.rc @@ -1,4 +1,5 @@ service servicemanager /system/bin/servicemanager disabled group system readproc + onrestart setprop servicemanager.ready false seclabel u:r:servicemanager:s0 diff --git a/libs/binder/IServiceManager.cpp b/libs/binder/IServiceManager.cpp index fd47783acd..c0a8d74195 100644 --- a/libs/binder/IServiceManager.cpp +++ b/libs/binder/IServiceManager.cpp @@ -21,6 +21,7 @@ #include <inttypes.h> #include <unistd.h> +#include <android-base/properties.h> #include <android/os/BnServiceCallback.h> #include <android/os/IServiceManager.h> #include <binder/IPCThreadState.h> @@ -140,6 +141,16 @@ protected: sp<IServiceManager> defaultServiceManager() { std::call_once(gSmOnce, []() { +#if defined(__BIONIC__) && !defined(__ANDROID_VNDK__) + /* wait for service manager */ { + using std::literals::chrono_literals::operator""s; + using android::base::WaitForProperty; + while (!WaitForProperty("servicemanager.ready", "true", 1s)) { + ALOGE("Waited for servicemanager.ready for a second, waiting another..."); + } + } +#endif + sp<AidlServiceManager> sm = nullptr; while (sm == nullptr) { sm = interface_cast<AidlServiceManager>(ProcessState::self()->getContextObject(nullptr)); |