summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gampe <agampe@google.com>2016-07-06 19:57:08 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-07-06 19:57:08 +0000
commit9b4725d0716c8bd14e087e34bd32b981111ce553 (patch)
treee47d234bff1766d8e66bc98e3c7ac53b3848cfd8
parent26fcca7a3353c4c9b05a3fe48b5d579f196e2fc3 (diff)
parente6fcebbf50d91e37cda0377999e22ea3284c9cd1 (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.java2
-rw-r--r--core/java/android/os/Environment.java57
-rw-r--r--core/java/android/os/UserHandle.java6
-rw-r--r--services/java/com/android/server/SystemServer.java3
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);