diff options
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()); + } + } } |