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

Commit 6e16714c authored by Andreas Gampe's avatar Andreas Gampe
Browse files

Frameworks/base: Refactor UserHandle and Environment a bit

Refactor slightly to forbid using myUserId in the zygote (uid == 0).
Also factor Environment to put user data (vs shared data) into its
own class, which should keep the page the shared data is on actually
shared between processes.

Bug: 29338430
Change-Id: I05d1306b57658a83299e38076171f56cb364ea80
parent 3c32cf8a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -6057,7 +6057,7 @@ public final class ActivityThread {
        // StrictMode) on debug builds, but using DropBox, not logs.
        CloseGuard.setEnabled(false);

        Environment.initForCurrentUser();
        Environment.init();

        // Set the reporter for event logging in libcore
        EventLogger.setReporter(new EventLoggingReporter());
+37 −20
Original line number Diff line number Diff line
@@ -62,17 +62,34 @@ public class Environment {
    private static final File DIR_ODM_ROOT = getDirectory(ENV_ODM_ROOT, "/odm");
    private static final File DIR_VENDOR_ROOT = getDirectory(ENV_VENDOR_ROOT, "/vendor");

    private static UserEnvironment sCurrentUser;
    private static boolean sUserRequired;
    // NoPreloadHolder to separate shared data from user-specific data, and to be able to initialize
    // Environment without side effect (allowing a lazy init of the data where possible).
    private static class NoPreloadHolder {
        public final static UserEnvironment sCurrentUser;
        public static boolean sUserRequired;

        static {
        initForCurrentUser();
            sCurrentUser = new UserEnvironment(UserHandle.myUserId());
        }

        // Empty function to be able to trigger static initialization.
        public static void init() {
        }

        // Disallow allocation.
        private NoPreloadHolder() {
        }
    }

    /** {@hide} */
    public static void initForCurrentUser() {
        final int userId = UserHandle.myUserId();
        sCurrentUser = new UserEnvironment(userId);
    public static void init() {
        NoPreloadHolder.init();

        // Check for expected outcome. We only allow one initialization, this will trigger if
        // somebody tried to re-initialize.
        if (NoPreloadHolder.sCurrentUser.mUserId != UserHandle.myUserId()) {
            throw new IllegalStateException();
        }
    }

    /** {@hide} */
@@ -428,7 +445,7 @@ public class Environment {
     */
    public static File getExternalStorageDirectory() {
        throwIfUserRequired();
        return sCurrentUser.getExternalDirs()[0];
        return NoPreloadHolder.sCurrentUser.getExternalDirs()[0];
    }

    /** {@hide} */
@@ -612,7 +629,7 @@ public class Environment {
     */
    public static File getExternalStoragePublicDirectory(String type) {
        throwIfUserRequired();
        return sCurrentUser.buildExternalStoragePublicDirs(type)[0];
        return NoPreloadHolder.sCurrentUser.buildExternalStoragePublicDirs(type)[0];
    }

    /**
@@ -621,7 +638,7 @@ public class Environment {
     */
    public static File[] buildExternalStorageAndroidDataDirs() {
        throwIfUserRequired();
        return sCurrentUser.buildExternalStorageAndroidDataDirs();
        return NoPreloadHolder.sCurrentUser.buildExternalStorageAndroidDataDirs();
    }

    /**
@@ -630,7 +647,7 @@ public class Environment {
     */
    public static File[] buildExternalStorageAppDataDirs(String packageName) {
        throwIfUserRequired();
        return sCurrentUser.buildExternalStorageAppDataDirs(packageName);
        return NoPreloadHolder.sCurrentUser.buildExternalStorageAppDataDirs(packageName);
    }

    /**
@@ -639,7 +656,7 @@ public class Environment {
     */
    public static File[] buildExternalStorageAppMediaDirs(String packageName) {
        throwIfUserRequired();
        return sCurrentUser.buildExternalStorageAppMediaDirs(packageName);
        return NoPreloadHolder.sCurrentUser.buildExternalStorageAppMediaDirs(packageName);
    }

    /**
@@ -648,7 +665,7 @@ public class Environment {
     */
    public static File[] buildExternalStorageAppObbDirs(String packageName) {
        throwIfUserRequired();
        return sCurrentUser.buildExternalStorageAppObbDirs(packageName);
        return NoPreloadHolder.sCurrentUser.buildExternalStorageAppObbDirs(packageName);
    }

    /**
@@ -657,7 +674,7 @@ public class Environment {
     */
    public static File[] buildExternalStorageAppFilesDirs(String packageName) {
        throwIfUserRequired();
        return sCurrentUser.buildExternalStorageAppFilesDirs(packageName);
        return NoPreloadHolder.sCurrentUser.buildExternalStorageAppFilesDirs(packageName);
    }

    /**
@@ -666,7 +683,7 @@ public class Environment {
     */
    public static File[] buildExternalStorageAppCacheDirs(String packageName) {
        throwIfUserRequired();
        return sCurrentUser.buildExternalStorageAppCacheDirs(packageName);
        return NoPreloadHolder.sCurrentUser.buildExternalStorageAppCacheDirs(packageName);
    }

    /**
@@ -770,7 +787,7 @@ public class Environment {
     *         {@link #MEDIA_BAD_REMOVAL}, or {@link #MEDIA_UNMOUNTABLE}.
     */
    public static String getExternalStorageState() {
        final File externalDir = sCurrentUser.getExternalDirs()[0];
        final File externalDir = NoPreloadHolder.sCurrentUser.getExternalDirs()[0];
        return getExternalStorageState(externalDir);
    }

@@ -811,7 +828,7 @@ public class Environment {
     */
    public static boolean isExternalStorageRemovable() {
        if (isStorageDisabled()) return false;
        final File externalDir = sCurrentUser.getExternalDirs()[0];
        final File externalDir = NoPreloadHolder.sCurrentUser.getExternalDirs()[0];
        return isExternalStorageRemovable(externalDir);
    }

@@ -850,7 +867,7 @@ public class Environment {
     */
    public static boolean isExternalStorageEmulated() {
        if (isStorageDisabled()) return false;
        final File externalDir = sCurrentUser.getExternalDirs()[0];
        final File externalDir = NoPreloadHolder.sCurrentUser.getExternalDirs()[0];
        return isExternalStorageEmulated(externalDir);
    }

@@ -885,11 +902,11 @@ public class Environment {

    /** {@hide} */
    public static void setUserRequired(boolean userRequired) {
        sUserRequired = userRequired;
        NoPreloadHolder.sUserRequired = userRequired;
    }

    private static void throwIfUserRequired() {
        if (sUserRequired) {
        if (NoPreloadHolder.sUserRequired) {
            Log.wtf(TAG, "Path requests must specify a user by using UserEnvironment",
                    new Throwable());
        }
+5 −1
Original line number Diff line number Diff line
@@ -297,7 +297,11 @@ public final class UserHandle implements Parcelable {
     */
    @SystemApi
    public static @UserIdInt int myUserId() {
        return getUserId(Process.myUid());
        int myUid = Process.myUid();
        if (myUid == 0) {
            throw new IllegalStateException("myUserId unsupported in zygote.");
        }
        return getUserId(myUid);
    }

    /**
+3 −0
Original line number Diff line number Diff line
@@ -284,6 +284,9 @@ public final class SystemServer {
            // we've defined it before booting further.
            Build.ensureFingerprintProperty();

            // Initialize Environment for the system user.
            Environment.init();

            // Within the system server, it is an error to access Environment paths without
            // explicitly specifying a user.
            Environment.setUserRequired(true);