Merge "Make caller wait for installd to become available." into tm-dev

This commit is contained in:
Alex Buynytskyy
2022-05-11 13:43:25 +00:00
committed by Android (Google) Code Review

View File

@@ -44,6 +44,9 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; 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 { public class Installer extends SystemService {
private static final String TAG = "Installer"; 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 = public static final int FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES =
IInstalld.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 final boolean mIsolated;
private volatile boolean mDeferSetFirstBoot; private volatile boolean mDeferSetFirstBoot;
private volatile IInstalld mInstalld; private volatile IInstalld mInstalld = null;
private volatile CompletableFuture<IInstalld> mInstalldFuture = new CompletableFuture<>();
private volatile Object mWarnIfHeld; private volatile Object mWarnIfHeld;
public Installer(Context context) { public Installer(Context context) {
@@ -149,6 +156,7 @@ public class Installer extends SystemService {
public void onStart() { public void onStart() {
if (mIsolated) { if (mIsolated) {
mInstalld = null; mInstalld = null;
mInstalldFuture = null;
} else { } else {
connect(); connect();
} }
@@ -168,7 +176,9 @@ public class Installer extends SystemService {
} }
if (binder != null) { if (binder != null) {
mInstalld = IInstalld.Stub.asInterface(binder); IInstalld installd = IInstalld.Stub.asInterface(binder);
mInstalld = installd;
mInstalldFuture.complete(installd);
try { try {
invalidateMounts(); invalidateMounts();
executeDeferredActions(); executeDeferredActions();
@@ -202,9 +212,18 @@ public class Installer extends SystemService {
if (mIsolated) { if (mIsolated) {
Slog.i(TAG, "Ignoring request because this installer is isolated"); Slog.i(TAG, "Ignoring request because this installer is isolated");
return false; 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. // We explicitly do NOT set previousAppId because the default value should always be 0.