Cameraservice: Cache camera service proxy interface

To improve camera launch performance, cache the proxy service
interface.  System tracing indicates fetching the interface can take
up to 8-10 ms during real camera opens, which is a percent or two
of total camera startup time.

Test: atest CameraCtsTestCases
Bug: 130173970
Change-Id: Icdf5218b04f608b897dcbf2085f971b04a913f3b
gugelfrei
Eino-Ville Talvala 5 years ago
parent 0e5a1b3bb6
commit 7d5569f51f

@ -117,6 +117,9 @@ static void setLogLevel(int level) {
static const String16 sManageCameraPermission("android.permission.MANAGE_CAMERA");
Mutex CameraService::sProxyMutex;
sp<hardware::ICameraServiceProxy> CameraService::sCameraServiceProxy;
CameraService::CameraService() :
mEventLog(DEFAULT_EVENT_LOG_LENGTH),
mNumberOfCameras(0),
@ -203,18 +206,20 @@ status_t CameraService::enumerateProviders() {
}
sp<ICameraServiceProxy> CameraService::getCameraServiceProxy() {
sp<ICameraServiceProxy> proxyBinder = nullptr;
#ifndef __BRILLO__
sp<IServiceManager> sm = defaultServiceManager();
// Use checkService because cameraserver normally starts before the
// system server and the proxy service. So the long timeout that getService
// has before giving up is inappropriate.
sp<IBinder> binder = sm->checkService(String16("media.camera.proxy"));
if (binder != nullptr) {
proxyBinder = interface_cast<ICameraServiceProxy>(binder);
Mutex::Autolock al(sProxyMutex);
if (sCameraServiceProxy == nullptr) {
sp<IServiceManager> sm = defaultServiceManager();
// Use checkService because cameraserver normally starts before the
// system server and the proxy service. So the long timeout that getService
// has before giving up is inappropriate.
sp<IBinder> binder = sm->checkService(String16("media.camera.proxy"));
if (binder != nullptr) {
sCameraServiceProxy = interface_cast<ICameraServiceProxy>(binder);
}
}
#endif
return proxyBinder;
return sCameraServiceProxy;
}
void CameraService::pingCameraServiceProxy() {

@ -930,6 +930,11 @@ private:
static StatusInternal mapToInternal(hardware::camera::common::V1_0::CameraDeviceStatus status);
static int32_t mapToInterface(StatusInternal status);
// Guard mCameraServiceProxy
static Mutex sProxyMutex;
// Cached interface to the camera service proxy in system service
static sp<hardware::ICameraServiceProxy> sCameraServiceProxy;
static sp<hardware::ICameraServiceProxy> getCameraServiceProxy();
static void pingCameraServiceProxy();

Loading…
Cancel
Save