diff options
author | Jeff Sharkey <jsharkey@android.com> | 2015-04-11 15:55:26 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-04-11 15:55:27 +0000 |
commit | 6036cd51265d31c08eefe0470a9f37e7f757aae8 (patch) | |
tree | 7bee6fba6e2c73ef2ceb49551af99cd00ec0252f /core/java/android/content | |
parent | 7c622e99062e0c46b55bbc2dc87e324f44891bef (diff) | |
parent | b9f3674c11ed9c89b80a69f728cbc5f540b2ecde (diff) | |
download | frameworks_base-6036cd51265d31c08eefe0470a9f37e7f757aae8.zip frameworks_base-6036cd51265d31c08eefe0470a9f37e7f757aae8.tar.gz frameworks_base-6036cd51265d31c08eefe0470a9f37e7f757aae8.tar.bz2 |
Merge "Support moving apps to expanded storage."
Diffstat (limited to 'core/java/android/content')
-rw-r--r-- | core/java/android/content/pm/PackageManager.java | 18 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageParser.java | 18 |
2 files changed, 27 insertions, 9 deletions
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 0396660..8844ea8 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -44,6 +44,7 @@ import android.os.Environment; import android.os.RemoteException; import android.os.UserHandle; import android.os.storage.VolumeInfo; +import android.text.TextUtils; import android.util.AndroidException; import com.android.internal.util.ArrayUtils; @@ -4184,16 +4185,19 @@ public abstract class PackageManager { public abstract @NonNull PackageInstaller getPackageInstaller(); /** - * Returns the data directory for a particular user and package, given the uid of the package. - * @param uid uid of the package, including the userId and appId - * @param packageName name of the package - * @return the user-specific data directory for the package + * Returns the data directory for a particular package and user. + * * @hide */ - public static String getDataDirForUser(int userId, String packageName) { + public static File getDataDirForUser(String volumeUuid, String packageName, int userId) { // TODO: This should be shared with Installer's knowledge of user directory - return Environment.getDataDirectory().toString() + "/user/" + userId - + "/" + packageName; + final File base; + if (TextUtils.isEmpty(volumeUuid)) { + base = Environment.getDataDirectory(); + } else { + base = new File("/mnt/expand/" + volumeUuid); + } + return new File(base, "user/" + userId + "/" + packageName); } /** diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 7523675..763a017 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -111,6 +111,9 @@ public class PackageParser { /** File name in an APK for the Android manifest. */ private static final String ANDROID_MANIFEST_FILENAME = "AndroidManifest.xml"; + /** Path prefix for apps on expanded storage */ + private static final String MNT_EXPAND = "/mnt/expand/"; + /** @hide */ public static class NewPermissionInfo { public final String name; @@ -860,6 +863,12 @@ public class PackageParser { throws PackageParserException { final String apkPath = apkFile.getAbsolutePath(); + String volumeUuid = null; + if (apkPath.startsWith(MNT_EXPAND)) { + final int end = apkPath.indexOf('/', MNT_EXPAND.length()); + volumeUuid = apkPath.substring(MNT_EXPAND.length(), end); + } + mParseError = PackageManager.INSTALL_SUCCEEDED; mArchiveSourcePath = apkFile.getAbsolutePath(); @@ -882,6 +891,7 @@ public class PackageParser { apkPath + " (at " + parser.getPositionDescription() + "): " + outError[0]); } + pkg.volumeUuid = volumeUuid; pkg.baseCodePath = apkPath; pkg.mSignatures = null; @@ -4206,6 +4216,8 @@ public class PackageParser { // TODO: work towards making these paths invariant + public String volumeUuid; + /** * Path where this package was found on disk. For monolithic packages * this is path to single base APK file; for cluster packages this is @@ -4727,7 +4739,8 @@ public class PackageParser { ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); if (userId != 0) { ai.uid = UserHandle.getUid(userId, ai.uid); - ai.dataDir = PackageManager.getDataDirForUser(userId, ai.packageName); + ai.dataDir = PackageManager.getDataDirForUser(ai.volumeUuid, ai.packageName, userId) + .getAbsolutePath(); } if ((flags & PackageManager.GET_META_DATA) != 0) { ai.metaData = p.mAppMetaData; @@ -4755,7 +4768,8 @@ public class PackageParser { ai = new ApplicationInfo(ai); if (userId != 0) { ai.uid = UserHandle.getUid(userId, ai.uid); - ai.dataDir = PackageManager.getDataDirForUser(userId, ai.packageName); + ai.dataDir = PackageManager.getDataDirForUser(ai.volumeUuid, ai.packageName, userId) + .getAbsolutePath(); } if (state.stopped) { ai.flags |= ApplicationInfo.FLAG_STOPPED; |