Loading core/java/android/hardware/CameraSessionStats.java +14 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ package android.hardware; import android.os.Parcel; import android.os.Parcelable; import android.util.Range; import java.util.ArrayList; import java.util.List; /** * The camera action state used for passing camera usage information from * camera service to camera service proxy . Loading Loading @@ -66,6 +68,7 @@ public class CameraSessionStats implements Parcelable { private int mVideoStabilizationMode; private boolean mUsedUltraWide; private boolean mUsedZoomOverride; private Range<Integer> mMostRequestedFpsRange; private int mSessionIndex; private CameraExtensionSessionStats mCameraExtensionSessionStats; Loading @@ -86,6 +89,7 @@ public class CameraSessionStats implements Parcelable { mVideoStabilizationMode = -1; mUsedUltraWide = false; mUsedZoomOverride = false; mMostRequestedFpsRange = new Range<Integer>(0, 0); mSessionIndex = 0; mCameraExtensionSessionStats = new CameraExtensionSessionStats(); } Loading @@ -109,6 +113,7 @@ public class CameraSessionStats implements Parcelable { mVideoStabilizationMode = -1; mUsedUltraWide = false; mUsedZoomOverride = false; mMostRequestedFpsRange = new Range<Integer>(0, 0); mSessionIndex = sessionIdx; mCameraExtensionSessionStats = new CameraExtensionSessionStats(); } Loading Loading @@ -158,6 +163,8 @@ public class CameraSessionStats implements Parcelable { dest.writeBoolean(mUsedZoomOverride); dest.writeInt(mSessionIndex); mCameraExtensionSessionStats.writeToParcel(dest, 0); dest.writeInt(mMostRequestedFpsRange.getLower()); dest.writeInt(mMostRequestedFpsRange.getUpper()); } public void readFromParcel(Parcel in) { Loading Loading @@ -188,6 +195,9 @@ public class CameraSessionStats implements Parcelable { mSessionIndex = in.readInt(); mCameraExtensionSessionStats = CameraExtensionSessionStats.CREATOR.createFromParcel(in); int minFps = in.readInt(); int maxFps = in.readInt(); mMostRequestedFpsRange = new Range<Integer>(minFps, maxFps); } public String getCameraId() { Loading Loading @@ -273,4 +283,8 @@ public class CameraSessionStats implements Parcelable { public CameraExtensionSessionStats getExtensionSessionStats() { return mCameraExtensionSessionStats; } public Range<Integer> getMostRequestedFpsRange() { return mMostRequestedFpsRange; } } services/core/java/com/android/server/camera/CameraServiceProxy.java +87 −4 Original line number Diff line number Diff line Loading @@ -61,6 +61,9 @@ import android.os.IBinder; import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.ShellCommand; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; Loading @@ -69,6 +72,7 @@ import android.stats.camera.nano.CameraProtos.CameraStreamProto; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.Range; import android.util.Slog; import android.view.Display; import android.view.IDisplayWindowListener; Loading @@ -85,6 +89,8 @@ import com.android.server.ServiceThread; import com.android.server.SystemService; import com.android.server.wm.WindowManagerInternal; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; Loading Loading @@ -243,6 +249,7 @@ public class CameraServiceProxy extends SystemService public int mVideoStabilizationMode; public boolean mUsedUltraWide; public boolean mUsedZoomOverride; public Range<Integer> mMostRequestedFpsRange; public final long mLogId; public final int mSessionIndex; Loading @@ -265,13 +272,15 @@ public class CameraServiceProxy extends SystemService mDeviceError = deviceError; mLogId = logId; mSessionIndex = sessionIdx; mMostRequestedFpsRange = new Range<Integer>(0, 0); } public void markCompleted(int internalReconfigure, long requestCount, long resultErrorCount, boolean deviceError, List<CameraStreamStats> streamStats, String userTag, int videoStabilizationMode, boolean usedUltraWide, boolean usedZoomOverride, CameraExtensionSessionStats extStats) { boolean usedZoomOverride, Range<Integer> mostRequestedFpsRange, CameraExtensionSessionStats extStats) { if (mCompleted) { return; } Loading @@ -287,6 +296,7 @@ public class CameraServiceProxy extends SystemService mUsedUltraWide = usedUltraWide; mUsedZoomOverride = usedZoomOverride; mExtSessionStats = extStats; mMostRequestedFpsRange = mostRequestedFpsRange; if (CameraServiceProxy.DEBUG) { Slog.v(TAG, "A camera facing " + cameraFacingToString(mCameraFacing) + " was in use by " + mClientName + " for " + Loading Loading @@ -637,6 +647,60 @@ public class CameraServiceProxy extends SystemService Binder.restoreCallingIdentity(ident); } } @Override public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, String[] args, ShellCallback callback, ResultReceiver resultReceiver) throws RemoteException { new CSPShellCmd(CameraServiceProxy.this) .exec(this, in, out, err, args, callback, resultReceiver); } private static class CSPShellCmd extends ShellCommand { private static final String TAG = "CSPShellCmd"; private static final String USAGE = """ usage: cmd media.camera.proxy SUBCMD [args] SUBCMDs: dump_events: Write out all collected camera usage events to statsd. Does not print to terminal. help: You're reading it. """; private final CameraServiceProxy mCameraServiceProxy; CSPShellCmd(CameraServiceProxy proxy) { mCameraServiceProxy = proxy; } @Override public int onCommand(String cmd) { if (cmd == null) { return handleDefaultCommands(cmd); } final PrintWriter pw = getOutPrintWriter(); try { switch (cmd.replace('-', '_')) { case "dump_events": int eventCount = mCameraServiceProxy.getUsageEventCount(); mCameraServiceProxy.dumpUsageEvents(); pw.println("Camera usage events dumped: " + eventCount); break; default: return handleDefaultCommands(cmd); } } catch (Exception e) { Slog.e(mCameraServiceProxy.TAG, "Error running shell command", e); return 1; } return 0; } @Override public void onHelp() { getOutPrintWriter().println(USAGE); } } }; private final FoldStateListener mFoldStateListener; Loading Loading @@ -882,6 +946,9 @@ public class CameraServiceProxy extends SystemService ? ", zoomOverrideUsage " + e.mUsedZoomOverride : ""; String mostRequestedFpsRangeDebug = Flags.analytics24q3() ? ", mostRequestedFpsRange " + e.mMostRequestedFpsRange : ""; Slog.v(TAG, "CAMERA_ACTION_EVENT: action " + e.mAction + " clientName " + e.mClientName + ", duration " + e.getDuration() Loading @@ -900,6 +967,7 @@ public class CameraServiceProxy extends SystemService + ", videoStabilizationMode " + e.mVideoStabilizationMode + ultrawideDebug + zoomOverrideDebug + mostRequestedFpsRangeDebug + ", logId " + e.mLogId + ", sessionIndex " + e.mSessionIndex + ", mExtSessionStats {type " + extensionType Loading Loading @@ -966,7 +1034,17 @@ public class CameraServiceProxy extends SystemService e.mUserTag, e.mVideoStabilizationMode, e.mLogId, e.mSessionIndex, extensionType, extensionIsAdvanced, e.mUsedUltraWide, e.mUsedZoomOverride); e.mUsedZoomOverride, e.mMostRequestedFpsRange.getLower(), e.mMostRequestedFpsRange.getUpper()); } } /** * Get camera usage event count */ int getUsageEventCount() { synchronized (mLock) { return mCameraUsageHistory.size(); } } Loading Loading @@ -1173,6 +1251,10 @@ public class CameraServiceProxy extends SystemService long logId = cameraState.getLogId(); int sessionIdx = cameraState.getSessionIndex(); CameraExtensionSessionStats extSessionStats = cameraState.getExtensionSessionStats(); Range<Integer> mostRequestedFpsRange = Flags.analytics24q3() ? cameraState.getMostRequestedFpsRange() : new Range<Integer>(0, 0); synchronized(mLock) { // Update active camera list and notify NFC if necessary boolean wasEmpty = mActiveCameraUsage.isEmpty(); Loading Loading @@ -1228,7 +1310,8 @@ public class CameraServiceProxy extends SystemService oldEvent.markCompleted(/*internalReconfigure*/0, /*requestCount*/0, /*resultErrorCount*/0, /*deviceError*/false, streamStats, /*userTag*/"", /*videoStabilizationMode*/-1, /*usedUltraWide*/false, /*usedZoomOverride*/false, new CameraExtensionSessionStats()); /*usedZoomOverride*/false, new Range<Integer>(0, 0), new CameraExtensionSessionStats()); mCameraUsageHistory.add(oldEvent); } break; Loading @@ -1240,7 +1323,7 @@ public class CameraServiceProxy extends SystemService doneEvent.markCompleted(internalReconfigureCount, requestCount, resultErrorCount, deviceError, streamStats, userTag, videoStabilizationMode, usedUltraWide, usedZoomOverride, extSessionStats); mostRequestedFpsRange, extSessionStats); mCameraUsageHistory.add(doneEvent); // Do not double count device error deviceError = false; Loading Loading
core/java/android/hardware/CameraSessionStats.java +14 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ package android.hardware; import android.os.Parcel; import android.os.Parcelable; import android.util.Range; import java.util.ArrayList; import java.util.List; /** * The camera action state used for passing camera usage information from * camera service to camera service proxy . Loading Loading @@ -66,6 +68,7 @@ public class CameraSessionStats implements Parcelable { private int mVideoStabilizationMode; private boolean mUsedUltraWide; private boolean mUsedZoomOverride; private Range<Integer> mMostRequestedFpsRange; private int mSessionIndex; private CameraExtensionSessionStats mCameraExtensionSessionStats; Loading @@ -86,6 +89,7 @@ public class CameraSessionStats implements Parcelable { mVideoStabilizationMode = -1; mUsedUltraWide = false; mUsedZoomOverride = false; mMostRequestedFpsRange = new Range<Integer>(0, 0); mSessionIndex = 0; mCameraExtensionSessionStats = new CameraExtensionSessionStats(); } Loading @@ -109,6 +113,7 @@ public class CameraSessionStats implements Parcelable { mVideoStabilizationMode = -1; mUsedUltraWide = false; mUsedZoomOverride = false; mMostRequestedFpsRange = new Range<Integer>(0, 0); mSessionIndex = sessionIdx; mCameraExtensionSessionStats = new CameraExtensionSessionStats(); } Loading Loading @@ -158,6 +163,8 @@ public class CameraSessionStats implements Parcelable { dest.writeBoolean(mUsedZoomOverride); dest.writeInt(mSessionIndex); mCameraExtensionSessionStats.writeToParcel(dest, 0); dest.writeInt(mMostRequestedFpsRange.getLower()); dest.writeInt(mMostRequestedFpsRange.getUpper()); } public void readFromParcel(Parcel in) { Loading Loading @@ -188,6 +195,9 @@ public class CameraSessionStats implements Parcelable { mSessionIndex = in.readInt(); mCameraExtensionSessionStats = CameraExtensionSessionStats.CREATOR.createFromParcel(in); int minFps = in.readInt(); int maxFps = in.readInt(); mMostRequestedFpsRange = new Range<Integer>(minFps, maxFps); } public String getCameraId() { Loading Loading @@ -273,4 +283,8 @@ public class CameraSessionStats implements Parcelable { public CameraExtensionSessionStats getExtensionSessionStats() { return mCameraExtensionSessionStats; } public Range<Integer> getMostRequestedFpsRange() { return mMostRequestedFpsRange; } }
services/core/java/com/android/server/camera/CameraServiceProxy.java +87 −4 Original line number Diff line number Diff line Loading @@ -61,6 +61,9 @@ import android.os.IBinder; import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.ShellCommand; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; Loading @@ -69,6 +72,7 @@ import android.stats.camera.nano.CameraProtos.CameraStreamProto; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.Range; import android.util.Slog; import android.view.Display; import android.view.IDisplayWindowListener; Loading @@ -85,6 +89,8 @@ import com.android.server.ServiceThread; import com.android.server.SystemService; import com.android.server.wm.WindowManagerInternal; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; Loading Loading @@ -243,6 +249,7 @@ public class CameraServiceProxy extends SystemService public int mVideoStabilizationMode; public boolean mUsedUltraWide; public boolean mUsedZoomOverride; public Range<Integer> mMostRequestedFpsRange; public final long mLogId; public final int mSessionIndex; Loading @@ -265,13 +272,15 @@ public class CameraServiceProxy extends SystemService mDeviceError = deviceError; mLogId = logId; mSessionIndex = sessionIdx; mMostRequestedFpsRange = new Range<Integer>(0, 0); } public void markCompleted(int internalReconfigure, long requestCount, long resultErrorCount, boolean deviceError, List<CameraStreamStats> streamStats, String userTag, int videoStabilizationMode, boolean usedUltraWide, boolean usedZoomOverride, CameraExtensionSessionStats extStats) { boolean usedZoomOverride, Range<Integer> mostRequestedFpsRange, CameraExtensionSessionStats extStats) { if (mCompleted) { return; } Loading @@ -287,6 +296,7 @@ public class CameraServiceProxy extends SystemService mUsedUltraWide = usedUltraWide; mUsedZoomOverride = usedZoomOverride; mExtSessionStats = extStats; mMostRequestedFpsRange = mostRequestedFpsRange; if (CameraServiceProxy.DEBUG) { Slog.v(TAG, "A camera facing " + cameraFacingToString(mCameraFacing) + " was in use by " + mClientName + " for " + Loading Loading @@ -637,6 +647,60 @@ public class CameraServiceProxy extends SystemService Binder.restoreCallingIdentity(ident); } } @Override public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, String[] args, ShellCallback callback, ResultReceiver resultReceiver) throws RemoteException { new CSPShellCmd(CameraServiceProxy.this) .exec(this, in, out, err, args, callback, resultReceiver); } private static class CSPShellCmd extends ShellCommand { private static final String TAG = "CSPShellCmd"; private static final String USAGE = """ usage: cmd media.camera.proxy SUBCMD [args] SUBCMDs: dump_events: Write out all collected camera usage events to statsd. Does not print to terminal. help: You're reading it. """; private final CameraServiceProxy mCameraServiceProxy; CSPShellCmd(CameraServiceProxy proxy) { mCameraServiceProxy = proxy; } @Override public int onCommand(String cmd) { if (cmd == null) { return handleDefaultCommands(cmd); } final PrintWriter pw = getOutPrintWriter(); try { switch (cmd.replace('-', '_')) { case "dump_events": int eventCount = mCameraServiceProxy.getUsageEventCount(); mCameraServiceProxy.dumpUsageEvents(); pw.println("Camera usage events dumped: " + eventCount); break; default: return handleDefaultCommands(cmd); } } catch (Exception e) { Slog.e(mCameraServiceProxy.TAG, "Error running shell command", e); return 1; } return 0; } @Override public void onHelp() { getOutPrintWriter().println(USAGE); } } }; private final FoldStateListener mFoldStateListener; Loading Loading @@ -882,6 +946,9 @@ public class CameraServiceProxy extends SystemService ? ", zoomOverrideUsage " + e.mUsedZoomOverride : ""; String mostRequestedFpsRangeDebug = Flags.analytics24q3() ? ", mostRequestedFpsRange " + e.mMostRequestedFpsRange : ""; Slog.v(TAG, "CAMERA_ACTION_EVENT: action " + e.mAction + " clientName " + e.mClientName + ", duration " + e.getDuration() Loading @@ -900,6 +967,7 @@ public class CameraServiceProxy extends SystemService + ", videoStabilizationMode " + e.mVideoStabilizationMode + ultrawideDebug + zoomOverrideDebug + mostRequestedFpsRangeDebug + ", logId " + e.mLogId + ", sessionIndex " + e.mSessionIndex + ", mExtSessionStats {type " + extensionType Loading Loading @@ -966,7 +1034,17 @@ public class CameraServiceProxy extends SystemService e.mUserTag, e.mVideoStabilizationMode, e.mLogId, e.mSessionIndex, extensionType, extensionIsAdvanced, e.mUsedUltraWide, e.mUsedZoomOverride); e.mUsedZoomOverride, e.mMostRequestedFpsRange.getLower(), e.mMostRequestedFpsRange.getUpper()); } } /** * Get camera usage event count */ int getUsageEventCount() { synchronized (mLock) { return mCameraUsageHistory.size(); } } Loading Loading @@ -1173,6 +1251,10 @@ public class CameraServiceProxy extends SystemService long logId = cameraState.getLogId(); int sessionIdx = cameraState.getSessionIndex(); CameraExtensionSessionStats extSessionStats = cameraState.getExtensionSessionStats(); Range<Integer> mostRequestedFpsRange = Flags.analytics24q3() ? cameraState.getMostRequestedFpsRange() : new Range<Integer>(0, 0); synchronized(mLock) { // Update active camera list and notify NFC if necessary boolean wasEmpty = mActiveCameraUsage.isEmpty(); Loading Loading @@ -1228,7 +1310,8 @@ public class CameraServiceProxy extends SystemService oldEvent.markCompleted(/*internalReconfigure*/0, /*requestCount*/0, /*resultErrorCount*/0, /*deviceError*/false, streamStats, /*userTag*/"", /*videoStabilizationMode*/-1, /*usedUltraWide*/false, /*usedZoomOverride*/false, new CameraExtensionSessionStats()); /*usedZoomOverride*/false, new Range<Integer>(0, 0), new CameraExtensionSessionStats()); mCameraUsageHistory.add(oldEvent); } break; Loading @@ -1240,7 +1323,7 @@ public class CameraServiceProxy extends SystemService doneEvent.markCompleted(internalReconfigureCount, requestCount, resultErrorCount, deviceError, streamStats, userTag, videoStabilizationMode, usedUltraWide, usedZoomOverride, extSessionStats); mostRequestedFpsRange, extSessionStats); mCameraUsageHistory.add(doneEvent); // Do not double count device error deviceError = false; Loading