Fix AIDL lazy camera HAL startup.
AServiceManager_getService() won't start a service if it isn't already
running.
Bug: 285546208
Test: Vendor testing
Test: Kill camera provider process, make sure it comes up again and
cameraserver adds it
Change-Id: I1bfd2c2af29afa795caa074d4de38a8d2119ee12
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
index 23051ef..b3474e5 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -35,6 +35,7 @@
#include <android/binder_manager.h>
#include <android/hidl/manager/1.2/IServiceManager.h>
#include <hidl/ServiceManagement.h>
+#include <com_android_internal_camera_flags.h>
#include <functional>
#include <camera_metadata_hidden.h>
#include <android-base/parseint.h>
@@ -57,6 +58,8 @@
using std::literals::chrono_literals::operator""s;
using hardware::camera2::utils::CameraIdAndSessionConfiguration;
+namespace flags = com::android::internal::camera::flags;
+
namespace {
const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false));
const std::string kExternalProviderName = "external/0";
@@ -1918,9 +1921,15 @@
status_t CameraProviderManager::tryToInitializeAidlProviderLocked(
const std::string& providerName, const sp<ProviderInfo>& providerInfo) {
using aidl::android::hardware::camera::provider::ICameraProvider;
+
+ AIBinder *binder = nullptr;
+ if (flags::lazy_aidl_wait_for_service()) {
+ binder = AServiceManager_waitForService(providerName.c_str());
+ } else {
+ binder = AServiceManager_getService(providerName.c_str());
+ }
std::shared_ptr<ICameraProvider> interface =
- ICameraProvider::fromBinder(ndk::SpAIBinder(
- AServiceManager_getService(providerName.c_str())));
+ ICameraProvider::fromBinder(ndk::SpAIBinder(binder));
if (interface == nullptr) {
ALOGW("%s: AIDL Camera provider HAL '%s' is not actually available", __FUNCTION__,
@@ -1956,15 +1965,18 @@
bool providerPresent = false;
bool preexisting =
(mAidlProviderWithBinders.find(newProvider) != mAidlProviderWithBinders.end());
-
- // We need to use the extracted provider name here since 'newProvider' has
- // the fully qualified name of the provider service in case of AIDL. We want
- // just instance name.
using aidl::android::hardware::camera::provider::ICameraProvider;
- std::string extractedProviderName =
+ std::string providerNameUsed =
newProvider.substr(std::string(ICameraProvider::descriptor).size() + 1);
+ if (flags::lazy_aidl_wait_for_service()) {
+ // 'newProvider' has the fully qualified name of the provider service in case of AIDL.
+ // ProviderInfo::mProviderName also has the fully qualified name - so we just compare them
+ // here.
+ providerNameUsed = newProvider;
+ }
+
for (const auto& providerInfo : mProviders) {
- if (providerInfo->mProviderName == extractedProviderName) {
+ if (providerInfo->mProviderName == providerNameUsed) {
ALOGW("%s: Camera provider HAL with name '%s' already registered",
__FUNCTION__, newProvider.c_str());
// Do not add new instances for lazy HAL external provider or aidl
@@ -1981,7 +1993,7 @@
}
sp<AidlProviderInfo> providerInfo =
- new AidlProviderInfo(extractedProviderName, providerInstance, this);
+ new AidlProviderInfo(providerNameUsed, providerInstance, this);
if (!providerPresent) {
status_t res = tryToInitializeAidlProviderLocked(newProvider, providerInfo);
@@ -2061,6 +2073,9 @@
if (providerInfo->mProviderName == removedProviderName) {
IPCTransport providerTransport = providerInfo->getIPCTransport();
std::string removedAidlProviderName = getFullAidlProviderName(removedProviderName);
+ if (flags::lazy_aidl_wait_for_service()) {
+ removedAidlProviderName = removedProviderName;
+ }
switch(providerTransport) {
case IPCTransport::HIDL:
return tryToInitializeHidlProviderLocked(removedProviderName, providerInfo);
@@ -2230,7 +2245,13 @@
}
bool CameraProviderManager::ProviderInfo::isExternalLazyHAL() const {
- return kEnableLazyHal && (mProviderName == kExternalProviderName);
+ std::string providerName = mProviderName;
+ if (flags::lazy_aidl_wait_for_service() && getIPCTransport() == IPCTransport::AIDL) {
+ using aidl::android::hardware::camera::provider::ICameraProvider;
+ providerName =
+ mProviderName.substr(std::string(ICameraProvider::descriptor).size() + 1);
+ }
+ return kEnableLazyHal && (providerName == kExternalProviderName);
}
status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {