Loading services/core/java/com/android/server/audio/AudioService.java +9 −3 Original line number Diff line number Diff line Loading @@ -6994,6 +6994,7 @@ public class AudioService extends IAudioService.Stub final int LOG_NB_EVENTS_WIRED_DEV_CONNECTION = 30; final int LOG_NB_EVENTS_FORCE_USE = 20; final int LOG_NB_EVENTS_VOLUME = 40; final int LOG_NB_EVENTS_DYN_POLICY = 10; final private AudioEventLogger mModeLogger = new AudioEventLogger(LOG_NB_EVENTS_PHONE_STATE, "phone state (logged after successfull call to AudioSystem.setPhoneState(int))"); Loading @@ -7010,6 +7011,9 @@ public class AudioService extends IAudioService.Stub final private AudioEventLogger mVolumeLogger = new AudioEventLogger(LOG_NB_EVENTS_VOLUME, "volume changes (logged when command received by AudioService)"); final private AudioEventLogger mDynPolicyLogger = new AudioEventLogger(LOG_NB_EVENTS_DYN_POLICY, "dynamic policy events (logged when command received by AudioService)"); private static final String[] RINGER_MODE_NAMES = new String[] { "SILENT", "VIBRATE", Loading Loading @@ -7077,6 +7081,7 @@ public class AudioService extends IAudioService.Stub pw.print(" mAvrcpAbsVolSupported="); pw.println(mAvrcpAbsVolSupported); dumpAudioPolicies(pw); mDynPolicyLogger.dump(pw); mPlaybackMonitor.dump(pw); Loading Loading @@ -7401,8 +7406,6 @@ public class AudioService extends IAudioService.Stub boolean hasFocusListener, boolean isFocusPolicy, boolean isVolumeController) { AudioSystem.setDynamicPolicyCallback(mDynPolicyCallback); if (DEBUG_AP) Log.d(TAG, "registerAudioPolicy for " + pcb.asBinder() + " with config:" + policyConfig); String regId = null; // error handling boolean hasPermissionForPolicy = Loading @@ -7414,6 +7417,8 @@ public class AudioService extends IAudioService.Stub return null; } mDynPolicyLogger.log((new AudioEventLogger.StringEvent("registerAudioPolicy for " + pcb.asBinder() + " with config:" + policyConfig)).printLog(TAG)); synchronized (mAudioPolicies) { try { if (mAudioPolicies.containsKey(pcb.asBinder())) { Loading @@ -7436,7 +7441,8 @@ public class AudioService extends IAudioService.Stub } public void unregisterAudioPolicyAsync(IAudioPolicyCallback pcb) { if (DEBUG_AP) Log.d(TAG, "unregisterAudioPolicyAsync for " + pcb.asBinder()); mDynPolicyLogger.log((new AudioEventLogger.StringEvent("unregisterAudioPolicyAsync for " + pcb.asBinder()).printLog(TAG))); synchronized (mAudioPolicies) { AudioPolicyProxy app = mAudioPolicies.remove(pcb.asBinder()); if (app == null) { Loading services/core/java/com/android/server/audio/RecordingActivityMonitor.java +41 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,9 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin conf.dump(pw); } } pw.println("\n"); // log sEventLogger.dump(pw); } private ArrayList<AudioRecordingConfiguration> anonymizeForPublicConsumption( Loading Loading @@ -190,6 +193,9 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin case AudioManager.RECORD_CONFIG_EVENT_STOP: // return failure if an unknown recording session stopped configChanged = (mRecordConfigs.remove(new Integer(session)) != null); if (configChanged) { sEventLogger.log(new RecordingEvent(event, uid, session, source, null)); } break; case AudioManager.RECORD_CONFIG_EVENT_START: final AudioFormat clientFormat = new AudioFormat.Builder() Loading Loading @@ -231,6 +237,9 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin mRecordConfigs.put(sessionKey, updatedConfig); configChanged = true; } if (configChanged) { sEventLogger.log(new RecordingEvent(event, uid, session, source, packageName)); } break; default: Log.e(TAG, String.format("Unknown event %d for session %d, source %d", Loading Loading @@ -281,4 +290,36 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin mDispatcherCb.asBinder().unlinkToDeath(this, 0); } } /** * Inner class for recording event logging */ private static final class RecordingEvent extends AudioEventLogger.Event { private final int mRecEvent; private final int mClientUid; private final int mSession; private final int mSource; private final String mPackName; RecordingEvent(int event, int uid, int session, int source, String packName) { mRecEvent = event; mClientUid = uid; mSession = session; mSource = source; mPackName = packName; } @Override public String eventToString() { return new StringBuilder("rec ").append( mRecEvent == AudioManager.RECORD_CONFIG_EVENT_START ? "start" : "stop ") .append(" uid:").append(mClientUid) .append(" session:").append(mSession) .append(" src:").append(MediaRecorder.toLogFriendlyAudioSource(mSource)) .append(mPackName == null ? "" : " pack:" + mPackName).toString(); } } private static final AudioEventLogger sEventLogger = new AudioEventLogger(50, "recording activity as reported through AudioSystem.AudioRecordingCallback"); } Loading
services/core/java/com/android/server/audio/AudioService.java +9 −3 Original line number Diff line number Diff line Loading @@ -6994,6 +6994,7 @@ public class AudioService extends IAudioService.Stub final int LOG_NB_EVENTS_WIRED_DEV_CONNECTION = 30; final int LOG_NB_EVENTS_FORCE_USE = 20; final int LOG_NB_EVENTS_VOLUME = 40; final int LOG_NB_EVENTS_DYN_POLICY = 10; final private AudioEventLogger mModeLogger = new AudioEventLogger(LOG_NB_EVENTS_PHONE_STATE, "phone state (logged after successfull call to AudioSystem.setPhoneState(int))"); Loading @@ -7010,6 +7011,9 @@ public class AudioService extends IAudioService.Stub final private AudioEventLogger mVolumeLogger = new AudioEventLogger(LOG_NB_EVENTS_VOLUME, "volume changes (logged when command received by AudioService)"); final private AudioEventLogger mDynPolicyLogger = new AudioEventLogger(LOG_NB_EVENTS_DYN_POLICY, "dynamic policy events (logged when command received by AudioService)"); private static final String[] RINGER_MODE_NAMES = new String[] { "SILENT", "VIBRATE", Loading Loading @@ -7077,6 +7081,7 @@ public class AudioService extends IAudioService.Stub pw.print(" mAvrcpAbsVolSupported="); pw.println(mAvrcpAbsVolSupported); dumpAudioPolicies(pw); mDynPolicyLogger.dump(pw); mPlaybackMonitor.dump(pw); Loading Loading @@ -7401,8 +7406,6 @@ public class AudioService extends IAudioService.Stub boolean hasFocusListener, boolean isFocusPolicy, boolean isVolumeController) { AudioSystem.setDynamicPolicyCallback(mDynPolicyCallback); if (DEBUG_AP) Log.d(TAG, "registerAudioPolicy for " + pcb.asBinder() + " with config:" + policyConfig); String regId = null; // error handling boolean hasPermissionForPolicy = Loading @@ -7414,6 +7417,8 @@ public class AudioService extends IAudioService.Stub return null; } mDynPolicyLogger.log((new AudioEventLogger.StringEvent("registerAudioPolicy for " + pcb.asBinder() + " with config:" + policyConfig)).printLog(TAG)); synchronized (mAudioPolicies) { try { if (mAudioPolicies.containsKey(pcb.asBinder())) { Loading @@ -7436,7 +7441,8 @@ public class AudioService extends IAudioService.Stub } public void unregisterAudioPolicyAsync(IAudioPolicyCallback pcb) { if (DEBUG_AP) Log.d(TAG, "unregisterAudioPolicyAsync for " + pcb.asBinder()); mDynPolicyLogger.log((new AudioEventLogger.StringEvent("unregisterAudioPolicyAsync for " + pcb.asBinder()).printLog(TAG))); synchronized (mAudioPolicies) { AudioPolicyProxy app = mAudioPolicies.remove(pcb.asBinder()); if (app == null) { Loading
services/core/java/com/android/server/audio/RecordingActivityMonitor.java +41 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,9 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin conf.dump(pw); } } pw.println("\n"); // log sEventLogger.dump(pw); } private ArrayList<AudioRecordingConfiguration> anonymizeForPublicConsumption( Loading Loading @@ -190,6 +193,9 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin case AudioManager.RECORD_CONFIG_EVENT_STOP: // return failure if an unknown recording session stopped configChanged = (mRecordConfigs.remove(new Integer(session)) != null); if (configChanged) { sEventLogger.log(new RecordingEvent(event, uid, session, source, null)); } break; case AudioManager.RECORD_CONFIG_EVENT_START: final AudioFormat clientFormat = new AudioFormat.Builder() Loading Loading @@ -231,6 +237,9 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin mRecordConfigs.put(sessionKey, updatedConfig); configChanged = true; } if (configChanged) { sEventLogger.log(new RecordingEvent(event, uid, session, source, packageName)); } break; default: Log.e(TAG, String.format("Unknown event %d for session %d, source %d", Loading Loading @@ -281,4 +290,36 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin mDispatcherCb.asBinder().unlinkToDeath(this, 0); } } /** * Inner class for recording event logging */ private static final class RecordingEvent extends AudioEventLogger.Event { private final int mRecEvent; private final int mClientUid; private final int mSession; private final int mSource; private final String mPackName; RecordingEvent(int event, int uid, int session, int source, String packName) { mRecEvent = event; mClientUid = uid; mSession = session; mSource = source; mPackName = packName; } @Override public String eventToString() { return new StringBuilder("rec ").append( mRecEvent == AudioManager.RECORD_CONFIG_EVENT_START ? "start" : "stop ") .append(" uid:").append(mClientUid) .append(" session:").append(mSession) .append(" src:").append(MediaRecorder.toLogFriendlyAudioSource(mSource)) .append(mPackName == null ? "" : " pack:" + mPackName).toString(); } } private static final AudioEventLogger sEventLogger = new AudioEventLogger(50, "recording activity as reported through AudioSystem.AudioRecordingCallback"); }