diff options
| author | 2016-12-21 22:27:30 +0000 | |
|---|---|---|
| committer | 2016-12-21 22:27:30 +0000 | |
| commit | 32eed0e59fc64d3b0886d184c79f0961f8fa0acf (patch) | |
| tree | 4b8e3bb9013309e70bc82b9dac7ba0319e336e64 | |
| parent | 09236deb0b7942311f1a7f9f192c8cf6489b0f05 (diff) | |
| parent | 57c829c2910c68fc60fc69aca62298f262cc7136 (diff) | |
Merge "Reconnect to installd when it restarts." am: 48d5d6cda8 am: fe35f0f4f6 am: e286d1b2f8
am: 57c829c291
Change-Id: I6bf169d83de6b9a300f9bb4717660183b1b9e24b
| -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); } } |