Merge "Log audio recording and dynamic policy registration history" into pi-dev
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index cc2954d..7298983 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -6994,6 +6994,7 @@
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))");
@@ -7010,6 +7011,9 @@
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",
@@ -7077,6 +7081,7 @@
pw.print(" mAvrcpAbsVolSupported="); pw.println(mAvrcpAbsVolSupported);
dumpAudioPolicies(pw);
+ mDynPolicyLogger.dump(pw);
mPlaybackMonitor.dump(pw);
@@ -7401,8 +7406,6 @@
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 =
@@ -7414,6 +7417,8 @@
return null;
}
+ mDynPolicyLogger.log((new AudioEventLogger.StringEvent("registerAudioPolicy for "
+ + pcb.asBinder() + " with config:" + policyConfig)).printLog(TAG));
synchronized (mAudioPolicies) {
try {
if (mAudioPolicies.containsKey(pcb.asBinder())) {
@@ -7436,7 +7441,8 @@
}
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) {
diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
index 34309b6..2feea41 100644
--- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
@@ -103,6 +103,9 @@
conf.dump(pw);
}
}
+ pw.println("\n");
+ // log
+ sEventLogger.dump(pw);
}
private ArrayList<AudioRecordingConfiguration> anonymizeForPublicConsumption(
@@ -190,6 +193,9 @@
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()
@@ -231,6 +237,9 @@
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",
@@ -281,4 +290,36 @@
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");
}