summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff Sharkey <jsharkey@android.com> 2016-12-21 22:27:30 +0000
committer android-build-merger <android-build-merger@google.com> 2016-12-21 22:27:30 +0000
commit32eed0e59fc64d3b0886d184c79f0961f8fa0acf (patch)
tree4b8e3bb9013309e70bc82b9dac7ba0319e336e64
parent09236deb0b7942311f1a7f9f192c8cf6489b0f05 (diff)
parent57c829c2910c68fc60fc69aca62298f262cc7136 (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.java34
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);
}
}