From 16c3a3e7e811f44b257d1ee557e5e2ac7bb67e52 Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Mon, 3 Apr 2017 12:03:35 -0700 Subject: [PATCH] rebind if the connection drops Change-Id: I9d91e9080b99690ff1e50dc28b01df0dcda4e97a Fixes: 36566927 Test: Manual; stop gms:persistent process using "kill -9" Test: Manual; stop process using "adb shell am force-stop com.google.android.gms" Test: Manual; stop process using "adb install -r PrebuiltGmsCore.apk" --- .../server/pm/EphemeralResolverConnection.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java index b0730efe635c5..0e13f974c0a7e 100644 --- a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java +++ b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java @@ -27,6 +27,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.IBinder.DeathRecipient; import android.os.IRemoteCallback; import android.os.RemoteException; import android.os.SystemClock; @@ -47,7 +48,7 @@ import java.util.concurrent.TimeoutException; * service and handling all interactions in a timely manner. * @hide */ -final class EphemeralResolverConnection { +final class EphemeralResolverConnection implements DeathRecipient { // This is running in a critical section and the timeout must be sufficiently low private static final long BIND_SERVICE_TIMEOUT_MS = ("eng".equals(Build.TYPE)) ? 300 : 200; @@ -171,6 +172,15 @@ final class EphemeralResolverConnection { } } + @Override + public void binderDied() { + if (mRemoteInstance != null) { + mRemoteInstance.asBinder().unlinkToDeath(this, 0 /*flags*/); + } + mRemoteInstance = null; + mBindRequested = false; + } + /** * Asynchronous callback when results come back from ephemeral resolution phase two. */ @@ -183,7 +193,11 @@ final class EphemeralResolverConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { synchronized (mLock) { - mRemoteInstance = IInstantAppResolver.Stub.asInterface(service); + try { + service.linkToDeath(EphemeralResolverConnection.this, 0 /*flags*/); + mRemoteInstance = IInstantAppResolver.Stub.asInterface(service); + } catch (RemoteException e) { + } mLock.notifyAll(); } }