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

Commit b024fbcb authored by Christian Wailes's avatar Christian Wailes Committed by Android (Google) Code Review
Browse files

Merge "Adds Zygote policy flags to control how applications are launched"

parents 4d647c1b 4d051885
Loading
Loading
Loading
Loading
+39 −3
Original line number Original line Diff line number Diff line
@@ -528,6 +528,40 @@ public class Process {
     */
     */
    private static int sPidFdSupported = PIDFD_UNKNOWN;
    private static int sPidFdSupported = PIDFD_UNKNOWN;


    /**
     * Value used to indicate that there is no special information about an application launch.  App
     * launches with this policy will occur through the primary or secondary Zygote with no special
     * treatment.
     *
     * @hide
     */
    public static final int ZYGOTE_POLICY_FLAG_EMPTY = 0;

    /**
     * Flag used to indicate that an application launch is user-visible and latency sensitive.  Any
     * launch with this policy will use a Unspecialized App Process Pool if the target Zygote
     * supports it.
     *
     * @hide
     */
    public static final int ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE = 1 << 0;

    /**
     * Flag used to indicate that the launch is one in a series of app launches that will be
     * performed in quick succession.  For future use.
     *
     * @hide
     */
    public static final int ZYGOTE_POLICY_FLAG_BATCH_LAUNCH = 1 << 1;

    /**
     * Flag used to indicate that the current launch event is for a system process.  All system
     * processes are equally important, so none of them should be prioritized over the others.
     *
     * @hide
     */
    public static final int ZYGOTE_POLICY_FLAG_SYSTEM_PROCESS = 1 << 2;

    /**
    /**
     * State associated with the zygote process.
     * State associated with the zygote process.
     * @hide
     * @hide
@@ -567,6 +601,7 @@ public class Process {
     * @param appDataDir null-ok the data directory of the app.
     * @param appDataDir null-ok the data directory of the app.
     * @param invokeWith null-ok the command to invoke with.
     * @param invokeWith null-ok the command to invoke with.
     * @param packageName null-ok the name of the package this process belongs to.
     * @param packageName null-ok the name of the package this process belongs to.
     * @param zygotePolicyFlags Flags used to determine how to launch the application
     * @param isTopApp whether the process starts for high priority application.
     * @param isTopApp whether the process starts for high priority application.
     * @param disabledCompatChanges null-ok list of disabled compat changes for the process being
     * @param disabledCompatChanges null-ok list of disabled compat changes for the process being
     *                             started.
     *                             started.
@@ -590,6 +625,7 @@ public class Process {
                                           @Nullable String appDataDir,
                                           @Nullable String appDataDir,
                                           @Nullable String invokeWith,
                                           @Nullable String invokeWith,
                                           @Nullable String packageName,
                                           @Nullable String packageName,
                                           int zygotePolicyFlags,
                                           boolean isTopApp,
                                           boolean isTopApp,
                                           @Nullable long[] disabledCompatChanges,
                                           @Nullable long[] disabledCompatChanges,
                                           @Nullable Map<String, Pair<String, Long>>
                                           @Nullable Map<String, Pair<String, Long>>
@@ -598,7 +634,7 @@ public class Process {
        return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
        return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                    abi, instructionSet, appDataDir, invokeWith, packageName,
                    abi, instructionSet, appDataDir, invokeWith, packageName,
                    /*useUsapPool=*/ true, isTopApp, disabledCompatChanges,
                    zygotePolicyFlags, isTopApp, disabledCompatChanges,
                    pkgDataInfoMap, zygoteArgs);
                    pkgDataInfoMap, zygoteArgs);
    }
    }


@@ -622,8 +658,8 @@ public class Process {
        return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
        return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                    abi, instructionSet, appDataDir, invokeWith, packageName,
                    abi, instructionSet, appDataDir, invokeWith, packageName,
                    /*useUsapPool=*/ false, /*isTopApp=*/ false, disabledCompatChanges,
                    /*zygotePolicyFlags=*/ ZYGOTE_POLICY_FLAG_EMPTY, /*isTopApp=*/ false,
                    /* pkgDataInfoMap */ null, zygoteArgs);
                disabledCompatChanges, /* pkgDataInfoMap */ null, zygoteArgs);
    }
    }


    /**
    /**
+73 −11
Original line number Original line Diff line number Diff line
@@ -16,6 +16,9 @@


package android.os;
package android.os;


import static android.os.Process.ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE;
import static android.os.Process.ZYGOTE_POLICY_FLAG_SYSTEM_PROCESS;

import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.compat.annotation.UnsupportedAppUsage;
@@ -119,6 +122,10 @@ public class ZygoteProcess {
        mUsapPoolSecondarySocketAddress =
        mUsapPoolSecondarySocketAddress =
                new LocalSocketAddress(Zygote.USAP_POOL_SECONDARY_SOCKET_NAME,
                new LocalSocketAddress(Zygote.USAP_POOL_SECONDARY_SOCKET_NAME,
                                       LocalSocketAddress.Namespace.RESERVED);
                                       LocalSocketAddress.Namespace.RESERVED);

        // This constructor is used to create the primary and secondary Zygotes, which can support
        // Unspecialized App Process Pools.
        mUsapPoolSupported = true;
    }
    }


    public ZygoteProcess(LocalSocketAddress primarySocketAddress,
    public ZygoteProcess(LocalSocketAddress primarySocketAddress,
@@ -128,6 +135,10 @@ public class ZygoteProcess {


        mUsapPoolSocketAddress = null;
        mUsapPoolSocketAddress = null;
        mUsapPoolSecondarySocketAddress = null;
        mUsapPoolSecondarySocketAddress = null;

        // This constructor is used to create the primary and secondary Zygotes, which CAN NOT
        // support Unspecialized App Process Pools.
        mUsapPoolSupported = false;
    }
    }


    public LocalSocketAddress getPrimarySocketAddress() {
    public LocalSocketAddress getPrimarySocketAddress() {
@@ -266,6 +277,14 @@ public class ZygoteProcess {
     */
     */
    private ZygoteState secondaryZygoteState;
    private ZygoteState secondaryZygoteState;


    /**
     * If this Zygote supports the creation and maintenance of a USAP pool.
     *
     * Currently only the primary and secondary Zygotes support USAP pools. Any
     * child Zygotes will be unable to create or use a USAP pool.
     */
    private final boolean mUsapPoolSupported;

    /**
    /**
     * If the USAP pool should be created and used to start applications.
     * If the USAP pool should be created and used to start applications.
     *
     *
@@ -308,13 +327,14 @@ public class ZygoteProcess {
     * @param appDataDir null-ok the data directory of the app.
     * @param appDataDir null-ok the data directory of the app.
     * @param invokeWith null-ok the command to invoke with.
     * @param invokeWith null-ok the command to invoke with.
     * @param packageName null-ok the name of the package this process belongs to.
     * @param packageName null-ok the name of the package this process belongs to.
     * @param zygotePolicyFlags Flags used to determine how to launch the application.
     * @param isTopApp Whether the process starts for high priority application.
     * @param disabledCompatChanges null-ok list of disabled compat changes for the process being
     * @param disabledCompatChanges null-ok list of disabled compat changes for the process being
     *                             started.
     *                             started.
     * @param zygoteArgs Additional arguments to supply to the zygote process.
     * @param isTopApp Whether the process starts for high priority application.
     * @param pkgDataInfoMap Map from related package names to private data directory
     * @param pkgDataInfoMap Map from related package names to private data directory
     *                       volume UUID and inode number.
     *                       volume UUID and inode number.
     *
     *
     * @param zygoteArgs Additional arguments to supply to the Zygote process.
     * @return An object that describes the result of the attempt to start the process.
     * @return An object that describes the result of the attempt to start the process.
     * @throws RuntimeException on fatal start failure
     * @throws RuntimeException on fatal start failure
     */
     */
@@ -329,7 +349,7 @@ public class ZygoteProcess {
                                                  @Nullable String appDataDir,
                                                  @Nullable String appDataDir,
                                                  @Nullable String invokeWith,
                                                  @Nullable String invokeWith,
                                                  @Nullable String packageName,
                                                  @Nullable String packageName,
                                                  boolean useUsapPool,
                                                  int zygotePolicyFlags,
                                                  boolean isTopApp,
                                                  boolean isTopApp,
                                                  @Nullable long[] disabledCompatChanges,
                                                  @Nullable long[] disabledCompatChanges,
                                                  @Nullable Map<String, Pair<String, Long>>
                                                  @Nullable Map<String, Pair<String, Long>>
@@ -344,7 +364,7 @@ public class ZygoteProcess {
            return startViaZygote(processClass, niceName, uid, gid, gids,
            return startViaZygote(processClass, niceName, uid, gid, gids,
                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,
                    abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false,
                    abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false,
                    packageName, useUsapPool, isTopApp, disabledCompatChanges,
                    packageName, zygotePolicyFlags, isTopApp, disabledCompatChanges,
                    pkgDataInfoMap, zygoteArgs);
                    pkgDataInfoMap, zygoteArgs);
        } catch (ZygoteStartFailedEx ex) {
        } catch (ZygoteStartFailedEx ex) {
            Log.e(LOG_TAG,
            Log.e(LOG_TAG,
@@ -391,7 +411,7 @@ public class ZygoteProcess {
     */
     */
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    private Process.ProcessStartResult zygoteSendArgsAndGetResult(
    private Process.ProcessStartResult zygoteSendArgsAndGetResult(
            ZygoteState zygoteState, boolean useUsapPool, @NonNull ArrayList<String> args)
            ZygoteState zygoteState, int zygotePolicyFlags, @NonNull ArrayList<String> args)
            throws ZygoteStartFailedEx {
            throws ZygoteStartFailedEx {
        // Throw early if any of the arguments are malformed. This means we can
        // Throw early if any of the arguments are malformed. This means we can
        // avoid writing a partial response to the zygote.
        // avoid writing a partial response to the zygote.
@@ -417,7 +437,7 @@ public class ZygoteProcess {
         */
         */
        String msgStr = args.size() + "\n" + String.join("\n", args) + "\n";
        String msgStr = args.size() + "\n" + String.join("\n", args) + "\n";


        if (useUsapPool && mUsapPoolEnabled && canAttemptUsap(args)) {
        if (shouldAttemptUsapLaunch(zygotePolicyFlags, args)) {
            try {
            try {
                return attemptUsapSendArgsAndGetResult(zygoteState, msgStr);
                return attemptUsapSendArgsAndGetResult(zygoteState, msgStr);
            } catch (IOException ex) {
            } catch (IOException ex) {
@@ -488,7 +508,43 @@ public class ZygoteProcess {
    }
    }


    /**
    /**
     * Flags that may not be passed to a USAP.
     * Test various member properties and parameters to determine if a launch event should be
     * handled using an Unspecialized App Process Pool or not.
     *
     * @param zygotePolicyFlags Policy flags indicating special behavioral observations about the
     *                          Zygote command
     * @param args Arguments that will be passed to the Zygote
     * @return If the command should be sent to a USAP Pool member or an actual Zygote
     */
    private boolean shouldAttemptUsapLaunch(int zygotePolicyFlags, ArrayList<String> args) {
        return mUsapPoolSupported
                && mUsapPoolEnabled
                && policySpecifiesUsapPoolLaunch(zygotePolicyFlags)
                && commandSupportedByUsap(args);
    }

    /**
     * Tests a Zygote policy flag set for various properties that determine if it is eligible for
     * being handled by an Unspecialized App Process Pool.
     *
     * @param zygotePolicyFlags Policy flags indicating special behavioral observations about the
     *                          Zygote command
     * @return If the policy allows for use of a USAP pool
     */
    private static boolean policySpecifiesUsapPoolLaunch(int zygotePolicyFlags) {
        /*
         * Zygote USAP Pool Policy: Launch the new process from the USAP Pool iff the launch event
         * is latency sensitive but *NOT* a system process.  All system processes are equally
         * important so we don't want to prioritize one over another.
         */
        return (zygotePolicyFlags
                & (ZYGOTE_POLICY_FLAG_SYSTEM_PROCESS | ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE))
                == ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE;
    }

    /**
     * Flags that may not be passed to a USAP.  These may appear as prefixes to individual Zygote
     * arguments.
     */
     */
    private static final String[] INVALID_USAP_FLAGS = {
    private static final String[] INVALID_USAP_FLAGS = {
        "--query-abi-list",
        "--query-abi-list",
@@ -505,10 +561,11 @@ public class ZygoteProcess {


    /**
    /**
     * Tests a command list to see if it is valid to send to a USAP.
     * Tests a command list to see if it is valid to send to a USAP.
     *
     * @param args  Zygote/USAP command arguments
     * @param args  Zygote/USAP command arguments
     * @return  True if the command can be passed to a USAP; false otherwise
     * @return  True if the command can be passed to a USAP; false otherwise
     */
     */
    private static boolean canAttemptUsap(ArrayList<String> args) {
    private static boolean commandSupportedByUsap(ArrayList<String> args) {
        for (String flag : args) {
        for (String flag : args) {
            for (String badFlag : INVALID_USAP_FLAGS) {
            for (String badFlag : INVALID_USAP_FLAGS) {
                if (flag.startsWith(badFlag)) {
                if (flag.startsWith(badFlag)) {
@@ -544,6 +601,7 @@ public class ZygoteProcess {
     * @param startChildZygote Start a sub-zygote. This creates a new zygote process
     * @param startChildZygote Start a sub-zygote. This creates a new zygote process
     * that has its state cloned from this zygote process.
     * that has its state cloned from this zygote process.
     * @param packageName null-ok the name of the package this process belongs to.
     * @param packageName null-ok the name of the package this process belongs to.
     * @param zygotePolicyFlags Flags used to determine how to launch the application.
     * @param isTopApp Whether the process starts for high priority application.
     * @param isTopApp Whether the process starts for high priority application.
     * @param disabledCompatChanges a list of disabled compat changes for the process being started.
     * @param disabledCompatChanges a list of disabled compat changes for the process being started.
     * @param pkgDataInfoMap Map from related package names to private data directory volume UUID
     * @param pkgDataInfoMap Map from related package names to private data directory volume UUID
@@ -565,7 +623,7 @@ public class ZygoteProcess {
                                                      @Nullable String invokeWith,
                                                      @Nullable String invokeWith,
                                                      boolean startChildZygote,
                                                      boolean startChildZygote,
                                                      @Nullable String packageName,
                                                      @Nullable String packageName,
                                                      boolean useUsapPool,
                                                      int zygotePolicyFlags,
                                                      boolean isTopApp,
                                                      boolean isTopApp,
                                                      @Nullable long[] disabledCompatChanges,
                                                      @Nullable long[] disabledCompatChanges,
                                                      @Nullable Map<String, Pair<String, Long>>
                                                      @Nullable Map<String, Pair<String, Long>>
@@ -692,7 +750,7 @@ public class ZygoteProcess {
            // The USAP pool can not be used if the application will not use the systems graphics
            // The USAP pool can not be used if the application will not use the systems graphics
            // driver.  If that driver is requested use the Zygote application start path.
            // driver.  If that driver is requested use the Zygote application start path.
            return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
            return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
                                              useUsapPool,
                                              zygotePolicyFlags,
                                              argsForZygote);
                                              argsForZygote);
        }
        }
    }
    }
@@ -722,6 +780,10 @@ public class ZygoteProcess {
    private long mLastPropCheckTimestamp = 0;
    private long mLastPropCheckTimestamp = 0;


    private boolean fetchUsapPoolEnabledPropWithMinInterval() {
    private boolean fetchUsapPoolEnabledPropWithMinInterval() {
        // If this Zygote doesn't support USAPs there is no need to fetch any
        // properties.
        if (!mUsapPoolSupported) return false;

        final long currentTimestamp = SystemClock.elapsedRealtime();
        final long currentTimestamp = SystemClock.elapsedRealtime();


        if (mIsFirstPropCheck
        if (mIsFirstPropCheck
@@ -1219,7 +1281,7 @@ public class ZygoteProcess {
                    gids, runtimeFlags, 0 /* mountExternal */, 0 /* targetSdkVersion */, seInfo,
                    gids, runtimeFlags, 0 /* mountExternal */, 0 /* targetSdkVersion */, seInfo,
                    abi, instructionSet, null /* appDataDir */, null /* invokeWith */,
                    abi, instructionSet, null /* appDataDir */, null /* invokeWith */,
                    true /* startChildZygote */, null /* packageName */,
                    true /* startChildZygote */, null /* packageName */,
                    false /* useUsapPool */, false /* isTopApp */,
                    ZYGOTE_POLICY_FLAG_SYSTEM_PROCESS /* zygotePolicyFlags */, false /* isTopApp */,
                    null /* disabledCompatChanges */, null /* pkgDataInfoMap */, extraArgs);
                    null /* disabledCompatChanges */, null /* pkgDataInfoMap */, extraArgs);
        } catch (ZygoteStartFailedEx ex) {
        } catch (ZygoteStartFailedEx ex) {
            throw new RuntimeException("Starting child-zygote through Zygote failed", ex);
            throw new RuntimeException("Starting child-zygote through Zygote failed", ex);
+4 −1
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import static android.os.Process.NFC_UID;
import static android.os.Process.ROOT_UID;
import static android.os.Process.ROOT_UID;
import static android.os.Process.SHELL_UID;
import static android.os.Process.SHELL_UID;
import static android.os.Process.SYSTEM_UID;
import static android.os.Process.SYSTEM_UID;
import static android.os.Process.ZYGOTE_POLICY_FLAG_EMPTY;


import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKGROUND_CHECK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKGROUND_CHECK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOREGROUND_SERVICE;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOREGROUND_SERVICE;
@@ -2937,8 +2938,10 @@ public final class ActiveServices {
        // Not running -- get it started, and enqueue this service record
        // Not running -- get it started, and enqueue this service record
        // to be executed when the app comes up.
        // to be executed when the app comes up.
        if (app == null && !permissionsReviewRequired) {
        if (app == null && !permissionsReviewRequired) {
            // TODO (chriswailes): Change the Zygote policy flags based on if the launch-for-service
            //  was initiated from a notification tap or not.
            if ((app=mAm.startProcessLocked(procName, r.appInfo, true, intentFlags,
            if ((app=mAm.startProcessLocked(procName, r.appInfo, true, intentFlags,
                    hostingRecord, false, isolated, false)) == null) {
                    hostingRecord, ZYGOTE_POLICY_FLAG_EMPTY, false, isolated, false)) == null) {
                String msg = "Unable to launch app "
                String msg = "Unable to launch app "
                        + r.appInfo.packageName + "/"
                        + r.appInfo.packageName + "/"
                        + r.appInfo.uid + " for service "
                        + r.appInfo.uid + " for service "
+37 −22
Original line number Original line Diff line number Diff line
@@ -65,6 +65,10 @@ import static android.os.Process.SHELL_UID;
import static android.os.Process.SIGNAL_USR1;
import static android.os.Process.SIGNAL_USR1;
import static android.os.Process.SYSTEM_UID;
import static android.os.Process.SYSTEM_UID;
import static android.os.Process.THREAD_PRIORITY_FOREGROUND;
import static android.os.Process.THREAD_PRIORITY_FOREGROUND;
import static android.os.Process.ZYGOTE_POLICY_FLAG_BATCH_LAUNCH;
import static android.os.Process.ZYGOTE_POLICY_FLAG_EMPTY;
import static android.os.Process.ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE;
import static android.os.Process.ZYGOTE_POLICY_FLAG_SYSTEM_PROCESS;
import static android.os.Process.ZYGOTE_PROCESS;
import static android.os.Process.ZYGOTE_PROCESS;
import static android.os.Process.getTotalMemory;
import static android.os.Process.getTotalMemory;
import static android.os.Process.isThreadInProcess;
import static android.os.Process.isThreadInProcess;
@@ -3054,7 +3058,7 @@ public class ActivityManagerService extends IActivityManager.Stub
            info.targetSdkVersion = Build.VERSION.SDK_INT;
            info.targetSdkVersion = Build.VERSION.SDK_INT;
            ProcessRecord proc = mProcessList.startProcessLocked(processName, info /* info */,
            ProcessRecord proc = mProcessList.startProcessLocked(processName, info /* info */,
                    false /* knownToBeDead */, 0 /* intentFlags */,
                    false /* knownToBeDead */, 0 /* intentFlags */,
                    sNullHostingRecord  /* hostingRecord */,
                    sNullHostingRecord  /* hostingRecord */, ZYGOTE_POLICY_FLAG_EMPTY,
                    true /* allowWhileBooting */, true /* isolated */,
                    true /* allowWhileBooting */, true /* isolated */,
                    uid, true /* keepIfLarge */, abiOverride, entryPoint, entryPointArgs,
                    uid, true /* keepIfLarge */, abiOverride, entryPoint, entryPointArgs,
                    crashHandler);
                    crashHandler);
@@ -3065,12 +3069,12 @@ public class ActivityManagerService extends IActivityManager.Stub
    @GuardedBy("this")
    @GuardedBy("this")
    final ProcessRecord startProcessLocked(String processName,
    final ProcessRecord startProcessLocked(String processName,
            ApplicationInfo info, boolean knownToBeDead, int intentFlags,
            ApplicationInfo info, boolean knownToBeDead, int intentFlags,
            HostingRecord hostingRecord, boolean allowWhileBooting,
            HostingRecord hostingRecord, int zygotePolicyFlags, boolean allowWhileBooting,
            boolean isolated, boolean keepIfLarge) {
            boolean isolated, boolean keepIfLarge) {
        return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
        return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
                hostingRecord, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
                hostingRecord, zygotePolicyFlags, allowWhileBooting, isolated, 0 /* isolatedUid */,
                null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
                keepIfLarge, null /* ABI override */, null /* entryPoint */,
                null /* crashHandler */);
                null /* entryPointArgs */, null /* crashHandler */);
    }
    }
    boolean isAllowedWhileBooting(ApplicationInfo ai) {
    boolean isAllowedWhileBooting(ApplicationInfo ai) {
@@ -4953,7 +4957,8 @@ public class ActivityManagerService extends IActivityManager.Stub
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            app.resetPackageList(mProcessStats);
            app.resetPackageList(mProcessStats);
            mProcessList.startProcessLocked(app,
            mProcessList.startProcessLocked(app,
                    new HostingRecord("link fail", processName));
                    new HostingRecord("link fail", processName),
                    ZYGOTE_POLICY_FLAG_EMPTY);
            return false;
            return false;
        }
        }
@@ -5372,7 +5377,9 @@ public class ActivityManagerService extends IActivityManager.Stub
                for (int ip=0; ip<NP; ip++) {
                for (int ip=0; ip<NP; ip++) {
                    if (DEBUG_PROCESSES) Slog.v(TAG_PROCESSES, "Starting process on hold: "
                    if (DEBUG_PROCESSES) Slog.v(TAG_PROCESSES, "Starting process on hold: "
                            + procs.get(ip));
                            + procs.get(ip));
                    mProcessList.startProcessLocked(procs.get(ip), new HostingRecord("on-hold"));
                    mProcessList.startProcessLocked(procs.get(ip),
                            new HostingRecord("on-hold"),
                            ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
                }
                }
            }
            }
            if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) {
@@ -7225,7 +7232,8 @@ public class ActivityManagerService extends IActivityManager.Stub
                                    cpr.appInfo, false, 0,
                                    cpr.appInfo, false, 0,
                                    new HostingRecord("content provider",
                                    new HostingRecord("content provider",
                                        new ComponentName(cpi.applicationInfo.packageName,
                                        new ComponentName(cpi.applicationInfo.packageName,
                                            cpi.name)), false, false, false);
                                                cpi.name)),
                                    ZYGOTE_POLICY_FLAG_EMPTY, false, false, false);
                            checkTime(startTime, "getContentProviderImpl: after start process");
                            checkTime(startTime, "getContentProviderImpl: after start process");
                            if (proc == null) {
                            if (proc == null) {
                                Slog.w(TAG, "Unable to launch app "
                                Slog.w(TAG, "Unable to launch app "
@@ -7785,7 +7793,8 @@ public class ActivityManagerService extends IActivityManager.Stub
                        .getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList();
                        .getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList();
                for (ApplicationInfo app : apps) {
                for (ApplicationInfo app : apps) {
                    if (!"android".equals(app.packageName)) {
                    if (!"android".equals(app.packageName)) {
                        addAppLocked(app, null, false, null /* ABI override */);
                        addAppLocked(app, null, false, null /* ABI override */,
                                ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
                    }
                    }
                }
                }
            } catch (RemoteException ex) {
            } catch (RemoteException ex) {
@@ -8056,23 +8065,25 @@ public class ActivityManagerService extends IActivityManager.Stub
    @GuardedBy("this")
    @GuardedBy("this")
    final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
    final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
            String abiOverride) {
            String abiOverride, int zygotePolicyFlags) {
        return addAppLocked(info, customProcess, isolated, false /* disableHiddenApiChecks */,
        return addAppLocked(info, customProcess, isolated, false /* disableHiddenApiChecks */,
                false /* mountExtStorageFull */, abiOverride);
                false /* mountExtStorageFull */, abiOverride, zygotePolicyFlags);
    }
    }
    @GuardedBy("this")
    @GuardedBy("this")
    final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
    final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
            boolean disableHiddenApiChecks, boolean mountExtStorageFull, String abiOverride) {
            boolean disableHiddenApiChecks, boolean mountExtStorageFull, String abiOverride,
            int zygotePolicyFlags) {
        return addAppLocked(info, customProcess, isolated, disableHiddenApiChecks,
        return addAppLocked(info, customProcess, isolated, disableHiddenApiChecks,
                false /* disableTestApiChecks */, mountExtStorageFull, abiOverride);
                false /* disableTestApiChecks */, mountExtStorageFull, abiOverride,
                zygotePolicyFlags);
    }
    }
    // TODO: Move to ProcessList?
    // TODO: Move to ProcessList?
    @GuardedBy("this")
    @GuardedBy("this")
    final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
    final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
            boolean disableHiddenApiChecks, boolean disableTestApiChecks,
            boolean disableHiddenApiChecks, boolean disableTestApiChecks,
            boolean mountExtStorageFull, String abiOverride) {
            boolean mountExtStorageFull, String abiOverride, int zygotePolicyFlags) {
        ProcessRecord app;
        ProcessRecord app;
        if (!isolated) {
        if (!isolated) {
            app = getProcessRecordLocked(customProcess != null ? customProcess : info.processName,
            app = getProcessRecordLocked(customProcess != null ? customProcess : info.processName,
@@ -8107,7 +8118,8 @@ public class ActivityManagerService extends IActivityManager.Stub
            mPersistentStartingProcesses.add(app);
            mPersistentStartingProcesses.add(app);
            mProcessList.startProcessLocked(app, new HostingRecord("added application",
            mProcessList.startProcessLocked(app, new HostingRecord("added application",
                    customProcess != null ? customProcess : app.processName),
                    customProcess != null ? customProcess : app.processName),
                    disableHiddenApiChecks, disableTestApiChecks, mountExtStorageFull, abiOverride);
                    zygotePolicyFlags, disableHiddenApiChecks, disableTestApiChecks,
                    mountExtStorageFull, abiOverride);
        }
        }
        return app;
        return app;
@@ -14614,7 +14626,8 @@ public class ActivityManagerService extends IActivityManager.Stub
            mProcessList.addProcessNameLocked(app);
            mProcessList.addProcessNameLocked(app);
            app.pendingStart = false;
            app.pendingStart = false;
            mProcessList.startProcessLocked(app,
            mProcessList.startProcessLocked(app,
                    new HostingRecord("restart", app.processName));
                    new HostingRecord("restart", app.processName),
                    ZYGOTE_POLICY_FLAG_EMPTY);
            return true;
            return true;
        } else if (app.pid > 0 && app.pid != MY_PID) {
        } else if (app.pid > 0 && app.pid != MY_PID) {
            // Goodbye!
            // Goodbye!
@@ -14977,7 +14990,7 @@ public class ActivityManagerService extends IActivityManager.Stub
            ProcessRecord proc = startProcessLocked(app.processName, app,
            ProcessRecord proc = startProcessLocked(app.processName, app,
                    false, 0,
                    false, 0,
                    new HostingRecord("backup", hostingName),
                    new HostingRecord("backup", hostingName),
                    false, false, false);
                    ZYGOTE_POLICY_FLAG_SYSTEM_PROCESS, false, false, false);
            if (proc == null) {
            if (proc == null) {
                Slog.e(TAG, "Unable to start backup agent process " + r);
                Slog.e(TAG, "Unable to start backup agent process " + r);
                return false;
                return false;
@@ -16616,7 +16629,8 @@ public class ActivityManagerService extends IActivityManager.Stub
            }
            }
            ProcessRecord app = addAppLocked(ai, defProcess, false, disableHiddenApiChecks,
            ProcessRecord app = addAppLocked(ai, defProcess, false, disableHiddenApiChecks,
                    disableTestApiChecks, mountExtStorageFull, abiOverride);
                    disableTestApiChecks, mountExtStorageFull, abiOverride,
                    ZYGOTE_POLICY_FLAG_EMPTY);
            app.setActiveInstrumentation(activeInstr);
            app.setActiveInstrumentation(activeInstr);
            activeInstr.mFinished = false;
            activeInstr.mFinished = false;
            activeInstr.mSourceUid = callingUid;
            activeInstr.mSourceUid = callingUid;
@@ -18013,7 +18027,8 @@ public class ActivityManagerService extends IActivityManager.Stub
                mProcessList.mRemovedProcesses.remove(i);
                mProcessList.mRemovedProcesses.remove(i);
                if (app.isPersistent()) {
                if (app.isPersistent()) {
                    addAppLocked(app.info, null, false, null /* ABI override */);
                    addAppLocked(app.info, null, false, null /* ABI override */,
                            ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
                }
                }
            }
            }
        }
        }
@@ -19220,8 +19235,8 @@ public class ActivityManagerService extends IActivityManager.Stub
                    // preempted by other processes before attaching the process of top app.
                    // preempted by other processes before attaching the process of top app.
                    startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */,
                    startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */,
                            new HostingRecord(hostingType, hostingName, isTop),
                            new HostingRecord(hostingType, hostingName, isTop),
                            false /* allowWhileBooting */, false /* isolated */,
                            ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE, false /* allowWhileBooting */,
                            true /* keepIfLarge */);
                            false /* isolated */, true /* keepIfLarge */);
                }
                }
            } finally {
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+7 −1
Original line number Original line Diff line number Diff line
@@ -16,6 +16,9 @@


package com.android.server.am;
package com.android.server.am;


import static android.os.Process.ZYGOTE_POLICY_FLAG_EMPTY;
import static android.os.Process.ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE;

import static com.android.server.am.ActivityManagerDebugConfig.*;
import static com.android.server.am.ActivityManagerDebugConfig.*;


import android.app.ActivityManager;
import android.app.ActivityManager;
@@ -1593,7 +1596,9 @@ public final class BroadcastQueue {
                    + receiverUid);
                    + receiverUid);
        }
        }


        if (brOptions != null && brOptions.getTemporaryAppWhitelistDuration() > 0) {
        final boolean isActivityCapable =
                (brOptions != null && brOptions.getTemporaryAppWhitelistDuration() > 0);
        if (isActivityCapable) {
            scheduleTempWhitelistLocked(receiverUid,
            scheduleTempWhitelistLocked(receiverUid,
                    brOptions.getTemporaryAppWhitelistDuration(), r);
                    brOptions.getTemporaryAppWhitelistDuration(), r);
        }
        }
@@ -1648,6 +1653,7 @@ public final class BroadcastQueue {
                info.activityInfo.applicationInfo, true,
                info.activityInfo.applicationInfo, true,
                r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,
                r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,
                new HostingRecord("broadcast", r.curComponent),
                new HostingRecord("broadcast", r.curComponent),
                isActivityCapable ? ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE : ZYGOTE_POLICY_FLAG_EMPTY,
                (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false, false))
                (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false, false))
                        == null) {
                        == null) {
            // Ah, this recipient is unavailable.  Finish it if necessary,
            // Ah, this recipient is unavailable.  Finish it if necessary,
Loading