diff options
| -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)); |