diff options
| author | 2016-07-06 19:45:14 +0000 | |
|---|---|---|
| committer | 2016-07-06 19:45:15 +0000 | |
| commit | e6fcebbf50d91e37cda0377999e22ea3284c9cd1 (patch) | |
| tree | accfcd9aedea328247c833812b0807699b69fb19 | |
| parent | c71fc2456a2c3b9ce0651cddfaceb900c022f2a1 (diff) | |
| parent | 6e16714c688ed9c52763696f5a5e7b90802a471b (diff) | |
Merge "Frameworks/base: Refactor UserHandle and Environment a bit" into nyc-mr1-dev
| -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 3f15a755bd79..fef1e2c63e46 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -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()); 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); |