diff options
author | Andreas Gampe <agampe@google.com> | 2016-07-06 19:57:08 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-07-06 19:57:08 +0000 |
commit | 9b4725d0716c8bd14e087e34bd32b981111ce553 (patch) | |
tree | e47d234bff1766d8e66bc98e3c7ac53b3848cfd8 | |
parent | 26fcca7a3353c4c9b05a3fe48b5d579f196e2fc3 (diff) | |
parent | e6fcebbf50d91e37cda0377999e22ea3284c9cd1 (diff) |
Merge \"Frameworks/base: Refactor UserHandle and Environment a bit\" into nyc-mr1-dev
am: e6fcebbf50
Change-Id: Ib6be1e72ad9b0350256ec208c6aee051b746f9d0
-rw-r--r-- | core/java/android/app/ActivityThread.java | 2 | ||||
-rw-r--r-- | core/java/android/os/Environment.java | 57 | ||||
-rw-r--r-- | core/java/android/os/UserHandle.java | 6 | ||||
-rw-r--r-- | services/java/com/android/server/SystemServer.java | 3 |
4 files changed, 46 insertions, 22 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 7f7945ad4969..42d046314a84 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -6055,7 +6055,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()); diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 80927f368e0c..fa328090e90a 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -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 { + sCurrentUser = new UserEnvironment(UserHandle.myUserId()); + } + + // Empty function to be able to trigger static initialization. + public static void init() { + } - static { - initForCurrentUser(); + // 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()); } diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index b3f44536214b..10e3718601ea 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -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); } /** diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 76424d82a2b0..fa3479cca5e7 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -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); |