diff options
| -rw-r--r-- | cmds/statsd/src/atoms.proto | 27 | ||||
| -rw-r--r-- | services/core/java/com/android/server/camera/CameraServiceProxy.java | 59 |
2 files changed, 86 insertions, 0 deletions
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 2c8a5562c979..ae751ce6d7ab 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -334,6 +334,7 @@ message Atom { 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 @@ message FrameTimingHistogram { // 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 8de259516890..09f52860e069 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.os.UserManager; 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.ServiceThread; 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 @@ public class CameraServiceProxy extends SystemService private final boolean mNotifyNfc; + private ScheduledThreadPoolExecutor mLogWriterService = new ScheduledThreadPoolExecutor( + /*corePoolSize*/ 1); + /** * Structure to track camera usage */ @@ -204,6 +211,9 @@ public class CameraServiceProxy extends SystemService 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 @@ public class CameraServiceProxy extends SystemService } } + 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 @@ public class CameraServiceProxy extends SystemService .setPackageName(e.mClientName); mLogger.write(l); } + + mLogWriterService.execute(new EventWriterTask( + new ArrayList<CameraUsageEvent>(mCameraUsageHistory))); + mCameraUsageHistory.clear(); } final long ident = Binder.clearCallingIdentity(); |