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
This commit is contained in:
@@ -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<pid_t> 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[] = {
|
||||
|
||||
@@ -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
|
||||
|
||||
/**
|
||||
|
||||
@@ -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<Integer> getAudioHalPids() {
|
||||
try {
|
||||
IServiceManager serviceManager = IServiceManager.getService();
|
||||
ArrayList<IServiceManager.InstanceDebugInfo> dump =
|
||||
serviceManager.debugDump();
|
||||
HashSet<Integer> 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<Integer>();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateAudioHalPids() {
|
||||
Set<Integer> 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
|
||||
//======================
|
||||
|
||||
Reference in New Issue
Block a user