diff options
| author | 2014-05-01 17:11:34 +0000 | |
|---|---|---|
| committer | 2014-05-01 17:11:34 +0000 | |
| commit | 67e2196d07dd4dc1f3ce82fdaaa34cdbce89e1ce (patch) | |
| tree | eb4bb9d5fc69356ba7f74f6b65a7b21afb9c9204 | |
| parent | 4a26164316b0d9a6d97dfbb85a2ac176384bb985 (diff) | |
| parent | a278ea7cecb59a73586e5dd74ec05e85caa370c5 (diff) | |
Merge "Add dump to MediaSessionService"
7 files changed, 121 insertions, 15 deletions
diff --git a/media/java/android/media/routeprovider/RouteRequest.java b/media/java/android/media/routeprovider/RouteRequest.java index 9913566259d6..68475c07bd10 100644 --- a/media/java/android/media/routeprovider/RouteRequest.java +++ b/media/java/android/media/routeprovider/RouteRequest.java @@ -20,6 +20,8 @@ import android.media.session.SessionInfo; import android.os.Parcel; import android.os.Parcelable; +import java.io.PrintWriter; + /** * A request to connect or discover routes with certain capabilities. * <p> @@ -70,6 +72,17 @@ public final class RouteRequest implements Parcelable { } @Override + public String toString() { + StringBuilder bob = new StringBuilder(); + bob.append("RouteRequest {"); + bob.append("active=").append(mActive); + bob.append(", info=").append(mSessionInfo.toString()); + bob.append(", options=").append(mOptions.toString()); + bob.append("}"); + return bob.toString(); + } + + @Override public int describeContents() { return 0; } diff --git a/media/java/android/media/session/SessionInfo.java b/media/java/android/media/session/SessionInfo.java index 22d8ab1943f9..2b6552832543 100644 --- a/media/java/android/media/session/SessionInfo.java +++ b/media/java/android/media/session/SessionInfo.java @@ -57,6 +57,11 @@ public final class SessionInfo implements Parcelable { } @Override + public String toString() { + return "SessionInfo {id=" + mId + ", pkg=" + mPackageName + "}"; + } + + @Override public int describeContents() { return 0; } diff --git a/services/core/java/com/android/server/media/MediaRouteProviderProxy.java b/services/core/java/com/android/server/media/MediaRouteProviderProxy.java index d314ea7cbbf6..c4e205892a4d 100644 --- a/services/core/java/com/android/server/media/MediaRouteProviderProxy.java +++ b/services/core/java/com/android/server/media/MediaRouteProviderProxy.java @@ -36,6 +36,7 @@ import android.os.UserHandle; import android.util.Log; import android.util.Slog; +import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -55,13 +56,12 @@ public class MediaRouteProviderProxy { private final String mId; private final ComponentName mComponentName; private final int mUserId; - - private Intent mBindIntent; // Interfaces declared in the manifest - private ArrayList<String> mInterfaces; - private ArrayList<RouteConnectionRecord> mConnections = new ArrayList<RouteConnectionRecord>(); - private Handler mHandler = new Handler(); + private final ArrayList<String> mInterfaces = new ArrayList<String>(); + private final ArrayList<RouteConnectionRecord> mConnections = new ArrayList<RouteConnectionRecord>(); + private final Handler mHandler = new Handler(); + private Intent mBindIntent; private IRouteProvider mBinder; private boolean mRunning; private boolean mInterested; @@ -76,7 +76,9 @@ public class MediaRouteProviderProxy { mId = id; mComponentName = component; mUserId = uid; - mInterfaces = interfaces; + if (interfaces != null) { + mInterfaces.addAll(interfaces); + } mBindIntent = new Intent(RouteProviderService.SERVICE_INTERFACE); mBindIntent.setComponent(mComponentName); } @@ -202,7 +204,7 @@ public class MediaRouteProviderProxy { if (connection != null) { RouteConnectionRecord record = new RouteConnectionRecord( - connection); + connection, mComponentName.getPackageName(), mUserId); mConnections.add(record); if (mRouteListener != null) { mRouteListener.onRouteConnected(sessionId, route, request, record); @@ -234,6 +236,19 @@ public class MediaRouteProviderProxy { return mId; } + public void dump(PrintWriter pw, String prefix) { + pw.println(prefix + mId + " " + this); + String indent = prefix + " "; + + pw.println(indent + "component=" + mComponentName.toString()); + pw.println(indent + "user id=" + mUserId); + pw.println(indent + "interfaces=" + mInterfaces.toString()); + pw.println(indent + "connections=" + mConnections.toString()); + pw.println(indent + "running=" + mRunning); + pw.println(indent + "interested=" + mInterested); + pw.println(indent + "bound=" + mBound); + } + private void updateBinding() { if (shouldBind()) { bind(); diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index ac7f4f37fc07..2a1e2c3a2686 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -46,6 +46,7 @@ import android.util.Pair; import android.util.Slog; import android.view.KeyEvent; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -226,6 +227,27 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { mService.sessionDied(this); } + public void dump(PrintWriter pw, String prefix) { + pw.println(prefix + mTag + " " + this); + + final String indent = prefix + " "; + pw.println(indent + "pid=" + mPid); + pw.println(indent + "info=" + mSessionInfo.toString()); + pw.println(indent + "published=" + mIsPublished); + pw.println(indent + "transport controls enabled=" + mTransportPerformerEnabled); + pw.println(indent + "rating type=" + mRatingType); + pw.println(indent + "controllers: " + mControllerCallbacks.size()); + pw.println(indent + "route requests {"); + int size = mRequests.size(); + for (int i = 0; i < size; i++) { + pw.println(indent + " " + mRequests.get(i).toString()); + } + pw.println(indent + "}"); + pw.println(indent + "route=" + (mRoute == null ? null : mRoute.toString())); + pw.println(indent + "connection=" + (mConnection == null ? null : mConnection.toString())); + pw.println(indent + "params=" + (mRequest == null ? null : mRequest.toString())); + } + private void onDestroy() { mService.destroySession(this); } diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index bc9137049726..107f6ad257f2 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -16,7 +16,9 @@ package com.android.server.media; +import android.Manifest; import android.content.Context; +import android.content.pm.PackageManager; import android.media.routeprovider.RouteRequest; import android.media.session.ISession; import android.media.session.ISessionCallback; @@ -30,13 +32,17 @@ import android.text.TextUtils; import android.util.Log; import com.android.server.SystemService; +import com.android.server.Watchdog; +import com.android.server.Watchdog.Monitor; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; /** * System implementation of MediaSessionManager */ -public class MediaSessionService extends SystemService { +public class MediaSessionService extends SystemService implements Monitor { private static final String TAG = "MediaSessionService"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -69,6 +75,7 @@ public class MediaSessionService extends SystemService { public void onStart() { publishBinderService(Context.MEDIA_SESSION_SERVICE, mSessionManagerImpl); mRouteProviderWatcher.start(); + Watchdog.getInstance().addMonitor(this); } /** @@ -114,14 +121,21 @@ public class MediaSessionService extends SystemService { } } + @Override + public void monitor() { + synchronized (mLock) { + // Check for deadlock + } + } + void sessionDied(MediaSessionRecord session) { - synchronized (mSessions) { + synchronized (mLock) { destroySessionLocked(session); } } void destroySession(MediaSessionRecord session) { - synchronized (mSessions) { + synchronized (mLock) { destroySessionLocked(session); } } @@ -160,9 +174,7 @@ public class MediaSessionService extends SystemService { } catch (RemoteException e) { throw new RuntimeException("Media Session owner died prematurely.", e); } - synchronized (mSessions) { - mSessions.add(session); - } + mSessions.add(session); if (DEBUG) { Log.d(TAG, "Created session for package " + packageName + " with tag " + tag); } @@ -259,6 +271,36 @@ public class MediaSessionService extends SystemService { Binder.restoreCallingIdentity(token); } } + + @Override + public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { + if (getContext().checkCallingOrSelfPermission(Manifest.permission.DUMP) + != PackageManager.PERMISSION_GRANTED) { + pw.println("Permission Denial: can't dump MediaSessionService from from pid=" + + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid()); + return; + } + + pw.println("MEDIA SESSION SERVICE (dumpsys media_session)"); + pw.println(); + + synchronized (mLock) { + int count = mSessions.size(); + pw.println("Sessions - have " + count + " states:"); + for (int i = 0; i < count; i++) { + MediaSessionRecord record = mSessions.get(i); + pw.println(); + record.dump(pw, ""); + } + pw.println("Providers:"); + count = mProviders.size(); + for (int i = 0; i < count; i++) { + MediaRouteProviderProxy provider = mProviders.get(i); + provider.dump(pw, ""); + } + } + } } } diff --git a/services/core/java/com/android/server/media/RouteConnectionRecord.java b/services/core/java/com/android/server/media/RouteConnectionRecord.java index 8da0f95125a5..90ddf29c31dd 100644 --- a/services/core/java/com/android/server/media/RouteConnectionRecord.java +++ b/services/core/java/com/android/server/media/RouteConnectionRecord.java @@ -29,10 +29,14 @@ import android.util.Log; public class RouteConnectionRecord { private static final String TAG = "RouteConnRecord"; private final IRouteConnection mBinder; + private final String mPackageName; + private final int mUid; private Listener mListener; - public RouteConnectionRecord(IRouteConnection binder) { + public RouteConnectionRecord(IRouteConnection binder, String packageName, int uid) { mBinder = binder; + mPackageName = packageName; + mUid = uid; } /** @@ -89,6 +93,12 @@ public class RouteConnectionRecord { } } + @Override + public String toString() { + return "RouteConnection { binder=" + mBinder.toString() + ", package=" + mPackageName + + ", uid=" + mUid + "}"; + } + /** * Listener to receive updates from the provider for this connection. */ diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 3d82027ebee4..7c9f7a8c058c 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -923,7 +923,6 @@ public final class SystemServer { } try { - Slog.i(TAG, "MediaSessionService"); mSystemServiceManager.startService(MediaSessionService.class); } catch (Throwable e) { reportWtf("starting MediaSessionService", e); |