summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/AudioManager.java17
-rw-r--r--media/java/android/media/IAudioService.aidl4
-rw-r--r--services/core/java/com/android/server/audio/AudioManagerShellCommand.java18
-rw-r--r--services/core/java/com/android/server/audio/AudioPolicyFacade.java1
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java19
-rw-r--r--services/core/java/com/android/server/audio/DefaultAudioPolicyFacade.java10
6 files changed, 69 insertions, 0 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 71013f7f4e34..5dc49a07a6d6 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -10406,6 +10406,23 @@ public class AudioManager {
}
}
+ /**
+ * Enable strict audio hardening (background) enforcement, regardless of release or temporary
+ * exemptions for debugging purposes.
+ * Enforced hardening can be found in the audio dumpsys with the API being restricted and the
+ * level of restriction which was encountered.
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
+ public void setEnableHardening(boolean shouldEnable) {
+ final IAudioService service = getService();
+ try {
+ service.setEnableHardening(shouldEnable);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
//====================================================================
// Mute await connection
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 2a740f85aa72..7b8d6663c957 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -819,4 +819,8 @@ interface IAudioService {
@EnforcePermission("QUERY_AUDIO_STATE")
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.QUERY_AUDIO_STATE)")
boolean shouldNotificationSoundPlay(in AudioAttributes aa);
+
+ @EnforcePermission("MODIFY_AUDIO_SETTINGS_PRIVILEGED")
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)")
+ void setEnableHardening(in boolean shouldEnable);
}
diff --git a/services/core/java/com/android/server/audio/AudioManagerShellCommand.java b/services/core/java/com/android/server/audio/AudioManagerShellCommand.java
index fece7a899f0a..ae961b53f547 100644
--- a/services/core/java/com/android/server/audio/AudioManagerShellCommand.java
+++ b/services/core/java/com/android/server/audio/AudioManagerShellCommand.java
@@ -83,6 +83,8 @@ class AudioManagerShellCommand extends ShellCommand {
return setGroupVolume();
case "adj-group-volume":
return adjGroupVolume();
+ case "set-hardening":
+ return setEnableHardening();
}
return 0;
}
@@ -130,6 +132,8 @@ class AudioManagerShellCommand extends ShellCommand {
pw.println(" Sets the volume for GROUP_ID to VOLUME_INDEX");
pw.println(" adj-group-volume GROUP_ID <RAISE|LOWER|MUTE|UNMUTE>");
pw.println(" Adjusts the group volume for GROUP_ID given the specified direction");
+ pw.println(" set-enable-hardening <1|0>");
+ pw.println(" Enables full audio hardening enforcement, disabling any exemptions");
}
private int setSurroundFormatEnabled() {
@@ -405,6 +409,20 @@ class AudioManagerShellCommand extends ShellCommand {
return 0;
}
+ private int setEnableHardening() {
+ final Context context = mService.mContext;
+ final AudioManager am = context.getSystemService(AudioManager.class);
+ final boolean shouldEnable = !(readIntArg() == 0);
+ getOutPrintWriter().println(
+ "calling AudioManager.setEnableHardening(" + shouldEnable + ")");
+ try {
+ am.setEnableHardening(shouldEnable);
+ } catch (Exception e) {
+ getOutPrintWriter().println("Exception: " + e);
+ }
+ return 0;
+ }
+
private int readIntArg() throws IllegalArgumentException {
final String argText = getNextArg();
diff --git a/services/core/java/com/android/server/audio/AudioPolicyFacade.java b/services/core/java/com/android/server/audio/AudioPolicyFacade.java
index f652b33b3fd3..6c0b81f513be 100644
--- a/services/core/java/com/android/server/audio/AudioPolicyFacade.java
+++ b/services/core/java/com/android/server/audio/AudioPolicyFacade.java
@@ -26,4 +26,5 @@ public interface AudioPolicyFacade {
public boolean isHotwordStreamSupported(boolean lookbackAudio);
public INativePermissionController getPermissionController();
public void registerOnStartTask(Runnable r);
+ public void setEnableHardening(boolean shouldEnable);
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 320dd8f188c0..4ea1aabe1a1b 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -1190,6 +1190,11 @@ public class AudioService extends IAudioService.Stub
private @AttributeSystemUsage int[] mSupportedSystemUsages =
new int[]{AudioAttributes.USAGE_CALL_ASSISTANT};
+ // Tracks the API/shell override of hardening enforcement used for debugging
+ // When this is set to true, enforcement is on regardless of flag state and any specific
+ // exemptions in place for compat purposes.
+ private final AtomicBoolean mShouldEnableAllHardening = new AtomicBoolean(false);
+
// Defines the format for the connection "address" for ALSA devices
public static String makeAlsaAddressString(int card, int device) {
return "card=" + card + ";device=" + device;
@@ -1333,6 +1338,10 @@ public class AudioService extends IAudioService.Stub
mAudioVolumeGroupHelper = audioVolumeGroupHelper;
mSettings = settings;
mAudioPolicy = audioPolicy;
+ mAudioPolicy.registerOnStartTask(() -> {
+ mAudioPolicy.setEnableHardening(mShouldEnableAllHardening.get());
+ });
+
mPlatformType = AudioSystem.getPlatformType(context);
mBroadcastHandlerThread = new HandlerThread("AudioService Broadcast");
@@ -15070,6 +15079,16 @@ public class AudioService extends IAudioService.Stub
return true;
}
+ /**
+ * @see AudioManager#setEnableHardening(boolean)
+ */
+ @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
+ public void setEnableHardening(boolean shouldEnable) {
+ super.setEnableHardening_enforcePermission();
+ mShouldEnableAllHardening.set(shouldEnable);
+ mAudioPolicy.setEnableHardening(shouldEnable);
+ }
+
//======================
// Audioserver state dispatch
//======================
diff --git a/services/core/java/com/android/server/audio/DefaultAudioPolicyFacade.java b/services/core/java/com/android/server/audio/DefaultAudioPolicyFacade.java
index 09701e49a8ac..c41f41e0f31b 100644
--- a/services/core/java/com/android/server/audio/DefaultAudioPolicyFacade.java
+++ b/services/core/java/com/android/server/audio/DefaultAudioPolicyFacade.java
@@ -80,4 +80,14 @@ public class DefaultAudioPolicyFacade implements AudioPolicyFacade {
public void registerOnStartTask(Runnable task) {
mServiceHolder.registerOnStartTask(unused -> task.run());
}
+
+ @Override
+ public void setEnableHardening(boolean shouldEnable) {
+ IAudioPolicyService ap = mServiceHolder.waitForService();
+ try {
+ ap.setEnableHardening(shouldEnable);
+ } catch (RemoteException e) {
+ mServiceHolder.attemptClear(ap.asBinder());
+ }
+ }
}