Camera: Propagate camera usage metrics StatsLog
Use new "StatsLog" API for camera usage metrics.
Bug: 139439353
Test: Clean build + statsd_testdrive
Change-Id: I36ad17bae69ae146e7687f27c780bb976ef3eaf1
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 2c8a556..ae751ce 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -334,6 +334,7 @@
BackGesture back_gesture_reported_reported = 224;
UpdateEngineUpdateAttemptReported update_engine_update_attempt_reported = 225;
UpdateEngineSuccessfulUpdateReported update_engine_successful_update_reported = 226;
+ CameraActionEvent camera_action_event = 227;
}
// Pulled events will start at field 10000.
@@ -7164,3 +7165,29 @@
// It's required that len(time_millis) == len(frame_count)
repeated int64 frame_counts = 2;
}
+
+
+/**
+ * Information about camera facing and API level usage.
+ * Logged from:
+ * frameworks/base/services/core/java/com/android/server/camera/CameraServiceProxy.java
+ */
+message CameraActionEvent {
+ // Camera session duration
+ optional int64 duration = 1;
+
+ // Camera API level used
+ optional int32 api_level = 2;
+
+ // Name of client package
+ optional string package_name = 3;
+
+ // Camera facing
+ enum Facing {
+ UNKNOWN = 0;
+ BACK = 1;
+ FRONT = 2;
+ EXTERNAL = 3;
+ }
+ optional Facing facing = 4;
+}
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index 8de2595..09f5286 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -36,6 +36,7 @@
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
+import android.util.StatsLog;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -44,6 +45,9 @@
import com.android.server.SystemService;
import com.android.server.wm.WindowManagerInternal;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -102,6 +106,9 @@
private final boolean mNotifyNfc;
+ private ScheduledThreadPoolExecutor mLogWriterService = new ScheduledThreadPoolExecutor(
+ /*corePoolSize*/ 1);
+
/**
* Structure to track camera usage
*/
@@ -204,6 +211,9 @@
mNotifyNfc = SystemProperties.getInt(NFC_NOTIFICATION_PROP, 0) > 0;
if (DEBUG) Slog.v(TAG, "Notify NFC behavior is " + (mNotifyNfc ? "active" : "disabled"));
+ // Don't keep any extra logging threads if not needed
+ mLogWriterService.setKeepAliveTime(1, TimeUnit.SECONDS);
+ mLogWriterService.allowCoreThreadTimeOut(true);
}
@Override
@@ -279,6 +289,51 @@
}
}
+ private class EventWriterTask implements Runnable {
+ private ArrayList<CameraUsageEvent> mEventList;
+ private static final long WRITER_SLEEP_MS = 100;
+
+ public EventWriterTask(ArrayList<CameraUsageEvent> eventList) {
+ mEventList = eventList;
+ }
+
+ @Override
+ public void run() {
+ if (mEventList != null) {
+ for (CameraUsageEvent event : mEventList) {
+ logCameraUsageEvent(event);
+ try {
+ Thread.sleep(WRITER_SLEEP_MS);
+ } catch (InterruptedException e) {}
+ }
+ mEventList.clear();
+ }
+ }
+
+ /**
+ * Write camera usage events to stats log.
+ * Package-private
+ */
+ private void logCameraUsageEvent(CameraUsageEvent e) {
+ int facing = StatsLog.CAMERA_ACTION_EVENT__FACING__UNKNOWN;
+ switch(e.mCameraFacing) {
+ case ICameraServiceProxy.CAMERA_FACING_BACK:
+ facing = StatsLog.CAMERA_ACTION_EVENT__FACING__BACK;
+ break;
+ case ICameraServiceProxy.CAMERA_FACING_FRONT:
+ facing = StatsLog.CAMERA_ACTION_EVENT__FACING__FRONT;
+ break;
+ case ICameraServiceProxy.CAMERA_FACING_EXTERNAL:
+ facing = StatsLog.CAMERA_ACTION_EVENT__FACING__EXTERNAL;
+ break;
+ default:
+ Slog.w(TAG, "Unknown camera facing: " + e.mCameraFacing);
+ }
+ StatsLog.write(StatsLog.CAMERA_ACTION_EVENT, e.getDuration(), e.mAPILevel,
+ e.mClientName, facing);
+ }
+ }
+
/**
* Dump camera usage events to log.
* Package-private
@@ -315,6 +370,10 @@
.setPackageName(e.mClientName);
mLogger.write(l);
}
+
+ mLogWriterService.execute(new EventWriterTask(
+ new ArrayList<CameraUsageEvent>(mCameraUsageHistory)));
+
mCameraUsageHistory.clear();
}
final long ident = Binder.clearCallingIdentity();