Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d0d7066 authored by David Srbecky's avatar David Srbecky Committed by Nicolas Geoffray
Browse files

Notify the ART runtime when boot is complete.

Needed for jit-zygote performance improvements.

Test: device boots
Bug: 119800099
Change-Id: I1e46f49d94440384473430d8afebe29fbee9c68e
parent 0473b08b
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -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).
     *
+12 −1
Original line number Diff line number Diff line
@@ -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.");
            }
+9 −0
Original line number Diff line number Diff line
@@ -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}
+4 −0
Original line number Diff line number Diff line
@@ -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");