Merge "Notify the ART runtime when boot is complete."

This commit is contained in:
Nicolas Geoffray
2019-08-08 11:58:06 +00:00
committed by Gerrit Code Review
4 changed files with 50 additions and 1 deletions

View File

@@ -647,6 +647,31 @@ public class ZygoteProcess {
}
}
/**
* Notify the Zygote processes that boot completed.
*/
public void bootCompleted() {
// Notify both the 32-bit and 64-bit zygote.
if (Build.SUPPORTED_32_BIT_ABIS.length > 0) {
bootCompleted(Build.SUPPORTED_32_BIT_ABIS[0]);
}
if (Build.SUPPORTED_64_BIT_ABIS.length > 0) {
bootCompleted(Build.SUPPORTED_64_BIT_ABIS[0]);
}
}
private void bootCompleted(String abi) {
try {
synchronized (mLock) {
ZygoteState state = openZygoteSocketIfNeeded(abi);
state.mZygoteOutputWriter.write("1\n--boot-completed\n");
state.mZygoteOutputWriter.flush();
}
} catch (Exception ex) {
throw new RuntimeException("Failed to inform zygote of boot_completed", ex);
}
}
/**
* Push hidden API blacklisting exemptions into the zygote process(es).
*

View File

@@ -168,6 +168,11 @@ class ZygoteArguments {
*/
boolean mPidQuery;
/**
* Whether the current arguments constitute a notification that boot completed.
*/
boolean mBootCompleted;
/**
* Exemptions from API blacklisting. These are sent to the pre-forked zygote at boot time, or
* when they change, via --set-api-blacklist-exemptions.
@@ -330,6 +335,8 @@ class ZygoteArguments {
mAbiListQuery = true;
} else if (arg.equals("--get-pid")) {
mPidQuery = true;
} else if (arg.equals("--boot-completed")) {
mBootCompleted = true;
} else if (arg.startsWith("--instruction-set=")) {
mInstructionSet = arg.substring(arg.indexOf('=') + 1);
} else if (arg.startsWith("--app-data-dir=")) {
@@ -364,7 +371,11 @@ class ZygoteArguments {
}
}
if (mAbiListQuery || mPidQuery) {
if (mBootCompleted) {
if (args.length - curArg > 0) {
throw new IllegalArgumentException("Unexpected arguments after --boot-completed");
}
} else if (mAbiListQuery || mPidQuery) {
if (args.length - curArg > 0) {
throw new IllegalArgumentException("Unexpected arguments after --query-abi-list.");
}

View File

@@ -149,6 +149,11 @@ class ZygoteConnection {
parsedArgs = new ZygoteArguments(args);
if (parsedArgs.mBootCompleted) {
handleBootCompleted();
return null;
}
if (parsedArgs.mAbiListQuery) {
handleAbiListQuery();
return null;
@@ -291,6 +296,10 @@ class ZygoteConnection {
}
}
private void handleBootCompleted() {
VMRuntime.bootCompleted();
}
/**
* Preloads resources if the zygote is in lazily preload mode. Writes the result of the
* preload operation; {@code 0} when a preload was initiated due to this request and {@code 1}

View File

@@ -7898,6 +7898,10 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
// Let the ART runtime in zygote and system_server know that the boot completed.
ZYGOTE_PROCESS.bootCompleted();
VMRuntime.bootCompleted();
IntentFilter pkgFilter = new IntentFilter();
pkgFilter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
pkgFilter.addDataScheme("package");