audioserver: do not prefetch audioserver services
ServiceManager may provide stale audioserver service handles
to the new audioserver instance when it is reinitializing.
Flag: EXEMPT bugfix
Test: for run in {1..100}; do (sleep 8; echo $run; adb shell pkill audioserver); done
Test: atest service_singleton_tests
Test: atest CtsMediaAudioTestCases
Bug: 379427790
Change-Id: Ifc237bdfecca308f8a7c5be1b82612293df8aed9
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index d511dc2..e3a96f5 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -35,6 +35,7 @@
#include <media/TypeConverter.h>
#include <mediautils/ServiceSingleton.h>
#include <math.h>
+#include <private/android_filesystem_config.h>
#include <system/audio.h>
#include <android/media/GetInputForAttrResponse.h>
@@ -169,9 +170,14 @@
if (!mDisableThreadPoolStart) {
ProcessState::self()->startThreadPool();
}
- mediautils::initService<media::IAudioFlingerService, AudioFlingerServiceTraits>();
- mWaitMs = std::chrono::milliseconds(
- property_get_int32(kServiceWaitProperty, kServiceClientWaitMs));
+ if (multiuser_get_app_id(getuid()) == AID_AUDIOSERVER) {
+ mediautils::skipService<media::IAudioFlingerService>(mediautils::SkipMode::kWait);
+ mWaitMs = std::chrono::milliseconds(INT32_MAX);
+ } else {
+ mediautils::initService<media::IAudioFlingerService, AudioFlingerServiceTraits>();
+ mWaitMs = std::chrono::milliseconds(
+ property_get_int32(kServiceWaitProperty, kServiceClientWaitMs));
+ }
init = true;
}
if (mValid) return mService;
@@ -1015,9 +1021,14 @@
if (!mDisableThreadPoolStart) {
ProcessState::self()->startThreadPool();
}
- mediautils::initService<IAudioPolicyService, AudioPolicyServiceTraits>();
- mWaitMs = std::chrono::milliseconds(
- property_get_int32(kServiceWaitProperty, kServiceClientWaitMs));
+ if (multiuser_get_app_id(getuid()) == AID_AUDIOSERVER) {
+ mediautils::skipService<IAudioPolicyService>(mediautils::SkipMode::kWait);
+ mWaitMs = std::chrono::milliseconds(INT32_MAX);
+ } else {
+ mediautils::initService<IAudioPolicyService, AudioPolicyServiceTraits>();
+ mWaitMs = std::chrono::milliseconds(
+ property_get_int32(kServiceWaitProperty, kServiceClientWaitMs));
+ }
init = true;
}
if (mValid) return mService;