summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alex Buynytskyy <alexbuy@google.com> 2022-05-09 17:14:23 -0700
committer Alex Buynytskyy <alexbuy@google.com> 2022-05-10 19:09:28 +0000
commit4a55c8a4164894b51cde950d6edb466ff5bfcfe3 (patch)
treeaf5f71ab019c0e82143be2a812885cd1db9c6cbc
parent4d72ee1293b64aff418d13eaa859ab0ab07fd060 (diff)
Make caller wait for installd to become available.
Bug: 231262144 Test: delay installd binding, observe no crashes and calls eventually succeed Change-Id: I571062806f11b0e9f75d230935e8979f21a413ba
-rw-r--r--services/core/java/com/android/server/pm/Installer.java27
1 files changed, 23 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 32f0f109821d..9de667fbc6f5 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -44,6 +44,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
public class Installer extends SystemService {
private static final String TAG = "Installer";
@@ -118,9 +121,13 @@ public class Installer extends SystemService {
public static final int FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES =
IInstalld.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES;
+ private static final long CONNECT_RETRY_DELAY_MS = DateUtils.SECOND_IN_MILLIS;
+ private static final long CONNECT_WAIT_MS = 10 * DateUtils.SECOND_IN_MILLIS;
+
private final boolean mIsolated;
private volatile boolean mDeferSetFirstBoot;
- private volatile IInstalld mInstalld;
+ private volatile IInstalld mInstalld = null;
+ private volatile CompletableFuture<IInstalld> mInstalldFuture = new CompletableFuture<>();
private volatile Object mWarnIfHeld;
public Installer(Context context) {
@@ -149,6 +156,7 @@ public class Installer extends SystemService {
public void onStart() {
if (mIsolated) {
mInstalld = null;
+ mInstalldFuture = null;
} else {
connect();
}
@@ -168,7 +176,9 @@ public class Installer extends SystemService {
}
if (binder != null) {
- mInstalld = IInstalld.Stub.asInterface(binder);
+ IInstalld installd = IInstalld.Stub.asInterface(binder);
+ mInstalld = installd;
+ mInstalldFuture.complete(installd);
try {
invalidateMounts();
executeDeferredActions();
@@ -202,9 +212,18 @@ public class Installer extends SystemService {
if (mIsolated) {
Slog.i(TAG, "Ignoring request because this installer is isolated");
return false;
- } else {
- return true;
}
+
+ if (mInstalld == null && mInstalldFuture != null) {
+ try {
+ Slog.i(TAG, "installd not ready, waiting for: " + CONNECT_WAIT_MS + "ms");
+ mInstalld = mInstalldFuture.get(CONNECT_WAIT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ Slog.e(TAG, "Ignoring request because this installer is not initialized", e);
+ }
+ }
+
+ return mInstalld != null;
}
// We explicitly do NOT set previousAppId because the default value should always be 0.