Camera: Pass system health metrics to ServiceProxy
- Measure session statistics:
- Camera open, close, and session creation latency
- Session information such as camera id, is_ndk, operating mode,
and reconfiguration count.
- Measure stream statistics:
- width, height, format, dataspace, usage
- max buffer count
- buffer loss count
- startup latency.
Test: ./out/host/linux-x86/bin/statsd_testdrive 227
Test: Camera CTS, VNDK test
Bug: 154159000
Change-Id: I082ef26a312bddbfd4abcc2148728a4b7bf8a9f6
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 138e429..8400dae 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -37,7 +37,6 @@
#include <binder/ActivityManager.h>
#include <binder/AppOpsManager.h>
#include <binder/IPCThreadState.h>
-#include <binder/IServiceManager.h>
#include <binder/MemoryBase.h>
#include <binder/MemoryHeapBase.h>
#include <binder/PermissionController.h>
@@ -75,6 +74,7 @@
#include "utils/CameraTraces.h"
#include "utils/TagMonitor.h"
#include "utils/CameraThreadState.h"
+#include "utils/CameraServiceProxyWrapper.h"
namespace {
const char* kPermissionServiceName = "permission";
@@ -87,7 +87,6 @@
using frameworks::cameraservice::service::V2_0::implementation::HidlCameraService;
using hardware::ICamera;
using hardware::ICameraClient;
-using hardware::ICameraServiceProxy;
using hardware::ICameraServiceListener;
using hardware::camera::common::V1_0::CameraDeviceStatus;
using hardware::camera::common::V1_0::TorchModeStatus;
@@ -134,9 +133,6 @@
static constexpr int32_t kVendorClientState = 1;
const String8 CameraService::kOfflineDevice("offline-");
-Mutex CameraService::sProxyMutex;
-sp<hardware::ICameraServiceProxy> CameraService::sCameraServiceProxy;
-
CameraService::CameraService() :
mEventLog(DEFAULT_EVENT_LOG_LENGTH),
mNumberOfCameras(0),
@@ -178,7 +174,7 @@
// This needs to be last call in this function, so that it's as close to
// ServiceManager::addService() as possible.
- CameraService::pingCameraServiceProxy();
+ CameraServiceProxyWrapper::pingCameraServiceProxy();
ALOGI("CameraService pinged cameraservice proxy");
}
@@ -228,29 +224,6 @@
return OK;
}
-sp<ICameraServiceProxy> CameraService::getCameraServiceProxy() {
-#ifndef __BRILLO__
- 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 sCameraServiceProxy;
-}
-
-void CameraService::pingCameraServiceProxy() {
- sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
- if (proxyBinder == nullptr) return;
- proxyBinder->pingForUserUpdate();
-}
-
void CameraService::broadcastTorchModeStatus(const String8& cameraId, TorchModeStatus status) {
Mutex::Autolock lock(mStatusListenerLock);
@@ -1573,7 +1546,11 @@
"Camera API version %d", clientPid, clientName8.string(), cameraId.string(),
static_cast<int>(effectiveApiLevel));
+ nsecs_t openTimeNs = systemTime();
+
sp<CLIENT> client = nullptr;
+ int facing = -1;
+ bool isNdk = (clientPackageName.size() == 0);
{
// Acquire mServiceLock and prevent other clients from connecting
std::unique_ptr<AutoConditionLock> lock =
@@ -1638,7 +1615,6 @@
// give flashlight a chance to close devices if necessary.
mFlashlight->prepareDeviceOpen(cameraId);
- int facing = -1;
int deviceVersion = getDeviceVersion(cameraId, /*out*/&facing);
if (facing == -1) {
ALOGE("%s: Unable to get camera device \"%s\" facing", __FUNCTION__, cameraId.string());
@@ -1723,6 +1699,11 @@
// Important: release the mutex here so the client can call back into the service from its
// destructor (can be at the end of the call)
device = client;
+
+ int32_t openLatencyMs = ns2ms(systemTime() - openTimeNs);
+ CameraServiceProxyWrapper::logOpen(cameraId, facing, clientPackageName,
+ effectiveApiLevel, isNdk, openLatencyMs);
+
return ret;
}
@@ -2880,14 +2861,6 @@
// Transition device availability listeners from PRESENT -> NOT_AVAILABLE
sCameraService->updateStatus(StatusInternal::NOT_AVAILABLE, mCameraIdStr);
- int apiLevel = hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1;
- if (canCastToApiClient(API_2)) {
- apiLevel = hardware::ICameraServiceProxy::CAMERA_API_LEVEL_2;
- }
- // Transition device state to OPEN
- sCameraService->updateProxyDeviceState(ICameraServiceProxy::CAMERA_STATE_OPEN,
- mCameraIdStr, mCameraFacing, mClientPackageName, apiLevel);
-
sCameraService->mUidPolicy->registerMonitorUid(mClientUid);
// Notify listeners of camera open/close status
@@ -2916,14 +2889,6 @@
// Transition to PRESENT if the camera is not in either of the rejected states
sCameraService->updateStatus(StatusInternal::PRESENT,
mCameraIdStr, rejected);
-
- int apiLevel = hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1;
- if (canCastToApiClient(API_2)) {
- apiLevel = hardware::ICameraServiceProxy::CAMERA_API_LEVEL_2;
- }
- // Transition device state to CLOSED
- sCameraService->updateProxyDeviceState(ICameraServiceProxy::CAMERA_STATE_CLOSED,
- mCameraIdStr, mCameraFacing, mClientPackageName, apiLevel);
}
// Always stop watching, even if no camera op is active
if (mOpsCallback != nullptr && mAppOpsManager != nullptr) {
@@ -3803,14 +3768,6 @@
onStatusUpdatedLocked(cameraId, status);
}
-void CameraService::updateProxyDeviceState(int newState,
- const String8& cameraId, int facing, const String16& clientName, int apiLevel) {
- sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
- if (proxyBinder == nullptr) return;
- String16 id(cameraId);
- proxyBinder->notifyCameraState(id, newState, facing, clientName, apiLevel);
-}
-
status_t CameraService::getTorchStatusLocked(
const String8& cameraId,
TorchModeStatus *status) const {