diff options
| author | 2016-12-21 19:01:55 +0000 | |
|---|---|---|
| committer | 2016-12-21 19:01:55 +0000 | |
| commit | e286d1b2f8eaee8a6ee4c2df8817ae749ce68a33 (patch) | |
| tree | 08b98793b1ef269b97801519bb5242d6c2c3fa1e | |
| parent | 9947e79b263dbefcd760e0014d088db65f16eecd (diff) | |
| parent | fe35f0f4f6870e4891be1b171e7d691d7f49f23a (diff) | |
Merge "Reconnect to installd when it restarts." am: 48d5d6cda8
am: fe35f0f4f6
Change-Id: I63a78822f4a4c3c4d6e71af721c7a31a5bdba03a
| -rw-r--r-- | services/core/java/com/android/server/pm/Installer.java | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 203f841bb305..1f83d9e9230d 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -20,10 +20,15 @@ import android.annotation.Nullable; import android.content.Context; import android.content.pm.PackageStats; import android.os.Build; +import android.os.IBinder; +import android.os.IBinder.DeathRecipient; import android.os.IInstalld; +import android.os.RemoteException; import android.os.ServiceManager; +import android.text.format.DateUtils; import android.util.Slog; +import com.android.internal.os.BackgroundThread; import com.android.server.SystemService; import dalvik.system.VMRuntime; @@ -52,7 +57,6 @@ public class Installer extends SystemService { private final boolean mIsolated; - // TODO: reconnect if installd restarts private volatile IInstalld mInstalld; private volatile Object mWarnIfHeld; @@ -83,7 +87,33 @@ public class Installer extends SystemService { if (mIsolated) { mInstalld = null; } else { - mInstalld = IInstalld.Stub.asInterface(ServiceManager.getService("installd")); + connect(); + } + } + + private void connect() { + IBinder binder = ServiceManager.getService("installd"); + if (binder != null) { + try { + binder.linkToDeath(new DeathRecipient() { + @Override + public void binderDied() { + Slog.w(TAG, "installd died; reconnecting"); + connect(); + } + }, 0); + } catch (RemoteException e) { + binder = null; + } + } + + if (binder != null) { + mInstalld = IInstalld.Stub.asInterface(binder); + } else { + Slog.w(TAG, "installd not found; trying again"); + BackgroundThread.getHandler().postDelayed(() -> { + connect(); + }, DateUtils.SECOND_IN_MILLIS); } } |