diff options
| author | 2016-12-21 19:06:21 +0000 | |
|---|---|---|
| committer | 2016-12-21 19:06:21 +0000 | |
| commit | 57c829c2910c68fc60fc69aca62298f262cc7136 (patch) | |
| tree | 0debd4f399cacfe0d2cc028450329f7a37e6c06d | |
| parent | 6c00eb1f318a3aa135cef195e1431fde6e03c738 (diff) | |
| parent | e286d1b2f8eaee8a6ee4c2df8817ae749ce68a33 (diff) | |
Merge "Reconnect to installd when it restarts." am: 48d5d6cda8 am: fe35f0f4f6
am: e286d1b2f8
Change-Id: Ib7ff45fee2865a28e7cb138d9fd418d7a3e50c94
| -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); } } |