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

Commit b3a4aab3 authored by David Brazdil's avatar David Brazdil Committed by Nicolas Geoffray
Browse files

Refactor runtime hidden API flag from negative to positive

There are only two situations in which we want to enable hidden API
access flag checks. Turning the flag from DISABLE_ to ENABLE_
simplifies logic in ART and reduces the number places where the flag
had to be passed down to ART.

Bug: 64382372
Test: boot device, install and run apps, check log messages

(cherry picked from commit f7e31c0a)

Change-Id: Ib2f70696d98c6e1500d1d419d6acf0a8d0487213
parent 0db84fcc
Loading
Loading
Loading
Loading
+2 −5
Original line number Original line Diff line number Diff line
@@ -55,8 +55,8 @@ public final class Zygote {
    public static final int DISABLE_VERIFIER = 1 << 9;
    public static final int DISABLE_VERIFIER = 1 << 9;
    /** Only use oat files located in /system. Otherwise use dex/jar/apk . */
    /** Only use oat files located in /system. Otherwise use dex/jar/apk . */
    public static final int ONLY_USE_SYSTEM_OAT_FILES = 1 << 10;
    public static final int ONLY_USE_SYSTEM_OAT_FILES = 1 << 10;
    /** Do not enfore hidden API access restrictions. */
    /** Do enfore hidden API access restrictions. */
    public static final int DISABLE_HIDDEN_API_CHECKS = 1 << 11;
    public static final int ENABLE_HIDDEN_API_CHECKS = 1 << 11;
    /** Force generation of native debugging information for backtraces. */
    /** Force generation of native debugging information for backtraces. */
    public static final int DEBUG_GENERATE_MINI_DEBUG_INFO = 1 << 12;
    public static final int DEBUG_GENERATE_MINI_DEBUG_INFO = 1 << 12;


@@ -162,9 +162,6 @@ public final class Zygote {
     */
     */
    public static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
    public static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
            int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
            int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
        // SystemServer is always allowed to use hidden APIs.
        runtimeFlags |= DISABLE_HIDDEN_API_CHECKS;

        VM_HOOKS.preFork();
        VM_HOOKS.preFork();
        // Resets nice priority for zygote process.
        // Resets nice priority for zygote process.
        resetNicePriority();
        resetNicePriority();
+1 −8
Original line number Original line Diff line number Diff line
@@ -98,10 +98,6 @@ public class ZygoteInit {


    private static final String SOCKET_NAME_ARG = "--socket-name=";
    private static final String SOCKET_NAME_ARG = "--socket-name=";


    /* Dexopt flag to disable hidden API access checks when dexopting SystemServer.
     * Must be kept in sync with com.android.server.pm.Installer. */
    private static final int DEXOPT_DISABLE_HIDDEN_API_CHECKS = 1 << 10;

    /**
    /**
     * Used to pre-load resources.
     * Used to pre-load resources.
     */
     */
@@ -569,10 +565,7 @@ public class ZygoteInit {
            if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
            if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
                final String packageName = "*";
                final String packageName = "*";
                final String outputPath = null;
                final String outputPath = null;
                // Dexopt with a flag which lifts restrictions on hidden API usage.
                final int dexFlags = 0;
                // Offending methods would otherwise be re-verified at runtime and
                // we want to avoid the performance overhead of that.
                final int dexFlags = DEXOPT_DISABLE_HIDDEN_API_CHECKS;
                final String compilerFilter = systemServerFilter;
                final String compilerFilter = systemServerFilter;
                final String uuid = StorageManager.UUID_PRIVATE_INTERNAL;
                final String uuid = StorageManager.UUID_PRIVATE_INTERNAL;
                final String seInfo = null;
                final String seInfo = null;
+4 −4
Original line number Original line Diff line number Diff line
@@ -3891,10 +3891,10 @@ public class ActivityManagerService extends IActivityManager.Stub
                runtimeFlags |= Zygote.ONLY_USE_SYSTEM_OAT_FILES;
                runtimeFlags |= Zygote.ONLY_USE_SYSTEM_OAT_FILES;
            }
            }
            if (app.info.isAllowedToUseHiddenApi()) {
            if (!app.info.isAllowedToUseHiddenApi()) {
                // This app is allowed to use undocumented and private APIs. Set
                // This app is not allowed to use undocumented and private APIs.
                // up its runtime with the appropriate flag.
                // Set up its runtime with the appropriate flag.
                runtimeFlags |= Zygote.DISABLE_HIDDEN_API_CHECKS;
                runtimeFlags |= Zygote.ENABLE_HIDDEN_API_CHECKS;
            }
            }
            String invokeWith = null;
            String invokeWith = null;
+2 −3
Original line number Original line Diff line number Diff line
@@ -58,9 +58,8 @@ public class Installer extends SystemService {
    public static final int DEXOPT_STORAGE_DE     = 1 << 8;
    public static final int DEXOPT_STORAGE_DE     = 1 << 8;
    /** Indicates that dexopt is invoked from the background service. */
    /** Indicates that dexopt is invoked from the background service. */
    public static final int DEXOPT_IDLE_BACKGROUND_JOB = 1 << 9;
    public static final int DEXOPT_IDLE_BACKGROUND_JOB = 1 << 9;
    /* Indicates that dexopt should not restrict access to private APIs.
    /** Indicates that dexopt should restrict access to private APIs. */
     * Must be kept in sync with com.android.internal.os.ZygoteInit. */
    public static final int DEXOPT_ENABLE_HIDDEN_API_CHECKS = 1 << 10;
    public static final int DEXOPT_DISABLE_HIDDEN_API_CHECKS = 1 << 10;


    // NOTE: keep in sync with installd
    // NOTE: keep in sync with installd
    public static final int FLAG_CLEAR_CACHE_ONLY = 1 << 8;
    public static final int FLAG_CLEAR_CACHE_ONLY = 1 << 8;
+6 −8
Original line number Original line Diff line number Diff line
@@ -55,7 +55,7 @@ import static com.android.server.pm.Installer.DEXOPT_FORCE;
import static com.android.server.pm.Installer.DEXOPT_STORAGE_CE;
import static com.android.server.pm.Installer.DEXOPT_STORAGE_CE;
import static com.android.server.pm.Installer.DEXOPT_STORAGE_DE;
import static com.android.server.pm.Installer.DEXOPT_STORAGE_DE;
import static com.android.server.pm.Installer.DEXOPT_IDLE_BACKGROUND_JOB;
import static com.android.server.pm.Installer.DEXOPT_IDLE_BACKGROUND_JOB;
import static com.android.server.pm.Installer.DEXOPT_DISABLE_HIDDEN_API_CHECKS;
import static com.android.server.pm.Installer.DEXOPT_ENABLE_HIDDEN_API_CHECKS;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;


@@ -510,11 +510,9 @@ public class PackageDexOptimizer {
        boolean isProfileGuidedFilter = isProfileGuidedCompilerFilter(compilerFilter);
        boolean isProfileGuidedFilter = isProfileGuidedCompilerFilter(compilerFilter);
        boolean isPublic = !info.isForwardLocked() && !isProfileGuidedFilter;
        boolean isPublic = !info.isForwardLocked() && !isProfileGuidedFilter;
        int profileFlag = isProfileGuidedFilter ? DEXOPT_PROFILE_GUIDED : 0;
        int profileFlag = isProfileGuidedFilter ? DEXOPT_PROFILE_GUIDED : 0;
        // System apps are invoked with a runtime flag which exempts them from
        // Some apps are executed with restrictions on hidden API usage. If this app is one
        // restrictions on hidden API usage. We dexopt with the same runtime flag
        // of them, pass a flag to dexopt to enable the same restrictions during compilation.
        // otherwise offending methods would have to be re-verified at runtime
        int hiddenApiFlag = info.isAllowedToUseHiddenApi() ? 0 : DEXOPT_ENABLE_HIDDEN_API_CHECKS;
        // and we want to avoid the performance overhead of that.
        int hiddenApiFlag = info.isAllowedToUseHiddenApi() ? DEXOPT_DISABLE_HIDDEN_API_CHECKS : 0;
        int dexFlags =
        int dexFlags =
                (isPublic ? DEXOPT_PUBLIC : 0)
                (isPublic ? DEXOPT_PUBLIC : 0)
                | (debuggable ? DEXOPT_DEBUGGABLE : 0)
                | (debuggable ? DEXOPT_DEBUGGABLE : 0)
@@ -636,8 +634,8 @@ public class PackageDexOptimizer {
        if ((flags & DEXOPT_IDLE_BACKGROUND_JOB) == DEXOPT_IDLE_BACKGROUND_JOB) {
        if ((flags & DEXOPT_IDLE_BACKGROUND_JOB) == DEXOPT_IDLE_BACKGROUND_JOB) {
            flagsList.add("idle_background_job");
            flagsList.add("idle_background_job");
        }
        }
        if ((flags & DEXOPT_DISABLE_HIDDEN_API_CHECKS) == DEXOPT_DISABLE_HIDDEN_API_CHECKS) {
        if ((flags & DEXOPT_ENABLE_HIDDEN_API_CHECKS) == DEXOPT_ENABLE_HIDDEN_API_CHECKS) {
            flagsList.add("disable_hidden_api_checks");
            flagsList.add("enable_hidden_api_checks");
        }
        }


        return String.join(",", flagsList);
        return String.join(",", flagsList);