From a270b7c0e52ec00d49c5f9a7f5f295b941472541 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Mon, 4 Nov 2019 17:22:02 -0800 Subject: [PATCH] AudioService: communicate audio HAL process pids to native audioserver Retrieve audio HAL processes pids from service manager and send them to AudioFlinger native service. This is needed to dump audio HAL process tombstones and because audioserver process does not have the SELinux permission to list services. Bug: 141528385 Test: Force watchdog and verify tombstone creation Change-Id: I3e35b8040779e041b8d8c2e72d1e650d6f8fe818 Merged-In: I3e35b8040779e041b8d8c2e72d1e650d6f8fe818 --- core/jni/android_media_AudioSystem.cpp | 15 +++++++ media/java/android/media/AudioSystem.java | 6 +++ .../android/server/audio/AudioService.java | 42 +++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 6417b283f5200..541b937860c3f 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -2250,6 +2250,20 @@ android_media_AudioSystem_setRttEnabled(JNIEnv *env, jobject thiz, jboolean enab return (jint) check_AudioSystem_Command(AudioSystem::setRttEnabled(enabled)); } +static jint +android_media_AudioSystem_setAudioHalPids(JNIEnv *env, jobject clazz, jintArray jPids) +{ + if (jPids == NULL) { + return (jint)AUDIO_JAVA_BAD_VALUE; + } + pid_t *nPidsArray = (pid_t *)env->GetIntArrayElements(jPids, NULL); + std::vector nPids(nPidsArray, nPidsArray + env->GetArrayLength(jPids)); + status_t status = AudioSystem::setAudioHalPids(nPids); + env->ReleaseIntArrayElements(jPids, nPidsArray, 0); + jint jStatus = nativeToJavaStatus(status); + return jStatus; +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gMethods[] = { @@ -2328,6 +2342,7 @@ static const JNINativeMethod gMethods[] = { (void*)android_media_AudioSystem_getHwOffloadEncodingFormatsSupportedForA2DP}, {"setAllowedCapturePolicy", "(II)I", (void *)android_media_AudioSystem_setAllowedCapturePolicy}, {"setRttEnabled", "(Z)I", (void *)android_media_AudioSystem_setRttEnabled}, + {"setAudioHalPids", "([I)I", (void *)android_media_AudioSystem_setAudioHalPids}, }; static const JNINativeMethod gEventHandlerMethods[] = { diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index bb731a8189f96..900572dabc942 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -1124,6 +1124,12 @@ public class AudioSystem */ public static native boolean isHapticPlaybackSupported(); + /** + * Send audio HAL server process pids to native audioserver process for use + * when generating audio HAL servers tombstones + */ + public static native int setAudioHalPids(int[] pids); + // Items shared with audio service /** diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 48f08e3226e36..bae96804171ba 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -61,6 +61,7 @@ import android.hardware.hdmi.HdmiPlaybackClient; import android.hardware.hdmi.HdmiTvClient; import android.hardware.input.InputManager; import android.hardware.usb.UsbManager; +import android.hidl.manager.V1_0.IServiceManager; import android.media.AudioAttributes; import android.media.AudioFocusInfo; import android.media.AudioFocusRequest; @@ -148,10 +149,12 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; @@ -721,6 +724,8 @@ public class AudioService extends IAudioService.Stub AudioSystem.setErrorCallback(mAudioSystemCallback); + updateAudioHalPids(); + boolean cameraSoundForced = readCameraSoundForced(); mCameraSoundForced = new Boolean(cameraSoundForced); sendMsg(mAudioHandler, @@ -949,6 +954,8 @@ public class AudioService extends IAudioService.Stub } Log.e(TAG, "Audioserver started."); + updateAudioHalPids(); + // indicate to audio HAL that we start the reconfiguration phase after a media // server crash // Note that we only execute this when the media server @@ -7290,6 +7297,41 @@ public class AudioService extends IAudioService.Stub return (AudioSystem.checkAudioFlinger() == AudioSystem.AUDIO_STATUS_OK); } + //====================== + // Audio HAL process dump + //====================== + + private static final String AUDIO_HAL_SERVICE_PREFIX = "android.hardware.audio"; + + private Set getAudioHalPids() { + try { + IServiceManager serviceManager = IServiceManager.getService(); + ArrayList dump = + serviceManager.debugDump(); + HashSet pids = new HashSet<>(); + for (IServiceManager.InstanceDebugInfo info : dump) { + if (info.pid != IServiceManager.PidConstant.NO_PID + && info.interfaceName != null + && info.interfaceName.startsWith(AUDIO_HAL_SERVICE_PREFIX)) { + pids.add(info.pid); + } + } + return pids; + } catch (RemoteException e) { + return new HashSet(); + } + } + + private void updateAudioHalPids() { + Set pidsSet = getAudioHalPids(); + if (pidsSet.isEmpty()) { + Slog.w(TAG, "Could not retrieve audio HAL service pids"); + return; + } + int[] pidsArray = pidsSet.stream().mapToInt(Integer::intValue).toArray(); + AudioSystem.setAudioHalPids(pidsArray); + } + //====================== // misc //======================