Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c
- index 8d571dc..4d9623a 100644
- --- a/cmds/installd/commands.c
- +++ b/cmds/installd/commands.c
- @@ -181,15 +181,18 @@ static int is_valid_apk_path(const char *path)
- {
- int len = strlen(APK_DIR_PREFIX);
- int nosubdircheck = 0;
- - if (strncmp(path, APK_DIR_PREFIX, len)) {
- - len = strlen(PROTECTED_DIR_PREFIX);
- - if (strncmp(path, PROTECTED_DIR_PREFIX, len)) {
- - len = strlen(SDCARD_DIR_PREFIX);
- - if (strncmp(path, SDCARD_DIR_PREFIX, len)) {
- - LOGE("invalid apk path '%s' (bad prefix)\n", path);
- - return 0;
- - } else {
- - nosubdircheck = 1;
- + if (strncmp(path, APK_EXT_DIR_PREFIX, len)) {
- + len = strlen(APK_DIR_PREFIX);
- + if (strncmp(path, APK_DIR_PREFIX, len)) {
- + len = strlen(PROTECTED_DIR_PREFIX);
- + if (strncmp(path, PROTECTED_DIR_PREFIX, len)) {
- + len = strlen(SDCARD_DIR_PREFIX);
- + if (strncmp(path, SDCARD_DIR_PREFIX, len)) {
- + LOGE("invalid apk path '%s' (bad prefix)\n", path);
- + return 0;
- + } else {
- + nosubdircheck = 1;
- + }
- }
- }
- }
- @@ -426,6 +429,10 @@ int create_cache_path(char path[PKG_PATH_MAX], const char *src)
- }
- }
- + if (!strncmp(src, "/sd-ext", 7)) {
- + cache_path = DALVIK_SDEXT_CACHE_PREFIX;
- + }
- +
- dstlen = srclen + strlen(cache_path) +
- strlen(DALVIK_CACHE_POSTFIX) + 1;
- diff --git a/cmds/installd/installd.h b/cmds/installd/installd.h
- index fc63b9f..5f94f0b 100644
- --- a/cmds/installd/installd.h
- +++ b/cmds/installd/installd.h
- @@ -57,14 +57,17 @@
- #define CACHE_DIR_POSTFIX "/cache"
- #define APK_DIR_PREFIX "/data/app/"
- +#define APK_EXT_DIR_PREFIX "/sd-ext/app/"
- /* other handy constants */
- #define PROTECTED_DIR_PREFIX "/data/app-private/"
- +#define PROTECTED_EXT_DIR_PREFIX "/sd-ext/app-private/"
- #define SDCARD_DIR_PREFIX getenv("ASEC_MOUNTPOINT")
- #define DALVIK_CACHE_PREFIX "/data/dalvik-cache/"
- #define DALVIK_SYSTEM_CACHE_PREFIX "/cache/dalvik-cache/"
- +#define DALVIK_SDEXT_CACHE_PREFIX "/sd-ext/dalvik-cache/"
- #define DALVIK_CACHE_POSTFIX "/classes.dex"
- #define UPDATE_COMMANDS_DIR_PREFIX "/system/etc/updatecmds/"
- diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
- index 9b8b0ac..689b218 100644
- --- a/cmds/pm/src/com/android/commands/pm/Pm.java
- +++ b/cmds/pm/src/com/android/commands/pm/Pm.java
- @@ -625,6 +625,8 @@ public final class Pm {
- locStr = "internal";
- } else if (loc == PackageHelper.APP_INSTALL_EXTERNAL) {
- locStr = "external";
- + } else if (loc == PackageHelper.APP_INSTALL_SDEXT) {
- + locStr = "sd-ext";
- }
- System.out.println(loc + "[" + locStr + "]");
- } catch (RemoteException e) {
- @@ -656,8 +658,11 @@ public final class Pm {
- // Override if -s option is specified.
- installFlags |= PackageManager.INSTALL_EXTERNAL;
- } else if (opt.equals("-f")) {
- - // Override if -s option is specified.
- + // Override if -f option is specified.
- installFlags |= PackageManager.INSTALL_INTERNAL;
- + } else if (opt.equals("-e")) {
- + // Override if -e option is specified.
- + installFlags |= PackageManager.INSTALL_SDEXT;
- } else {
- System.err.println("Error: Unknown option: " + opt);
- showUsage();
- @@ -921,6 +926,7 @@ public final class Pm {
- System.err.println(" -i: specify the installer package name.");
- System.err.println(" -s: install package on sdcard.");
- System.err.println(" -f: install package on internal flash.");
- + System.err.println(" -e: install package on sd-ext.");
- System.err.println("");
- System.err.println("The uninstall command removes a package from the system. Options:");
- System.err.println(" -k: keep the data and cache directories around.");
- @@ -930,13 +936,15 @@ public final class Pm {
- System.err.println("a given package or component (written as \"package/class\").");
- System.err.println("");
- System.err.println("The getInstallLocation command gets the current install location");
- - System.err.println(" 0 [auto]: Let system decide the best location");
- + System.err.println(" 0 [auto] : Let system decide the best location");
- System.err.println(" 1 [internal]: Install on internal device storage");
- System.err.println(" 2 [external]: Install on external media");
- + System.err.println(" 3 [sdext] : Install on sd-ext");
- System.err.println("");
- System.err.println("The setInstallLocation command changes the default install location");
- - System.err.println(" 0 [auto]: Let system decide the best location");
- + System.err.println(" 0 [auto] : Let system decide the best location");
- System.err.println(" 1 [internal]: Install on internal device storage");
- System.err.println(" 2 [external]: Install on external media");
- + System.err.println(" 3 [sdext] : Install on sd-ext");
- }
- }
- diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
- index 68b44e7..70a181e 100644
- --- a/core/java/android/content/pm/PackageManager.java
- +++ b/core/java/android/content/pm/PackageManager.java
- @@ -268,6 +268,13 @@ public abstract class PackageManager {
- public static final int INSTALL_INTERNAL = 0x00000010;
- /**
- + * Flag parameter for {@link #installPackage} to indicate that this
- + * package has to be installed on the sdext.
- + * @hide
- + */
- + public static final int INSTALL_SDEXT = 0x00000020;
- +
- + /**
- * Flag parameter for
- * {@link #setComponentEnabledSetting(android.content.ComponentName, int, int)} to indicate
- * that you don't want to kill the app containing the component. Be careful when you set this
- diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
- index 812391c..813fb65 100644
- --- a/core/java/android/os/Environment.java
- +++ b/core/java/android/os/Environment.java
- @@ -40,6 +40,9 @@ public class Environment {
- private static final File DATA_DIRECTORY
- = getDirectory("ANDROID_DATA", "/data");
- + private static final File SD_EXT_DIRECTORY
- + = getDirectory("SD_EXT_DIRECTORY", "/sd-ext");
- +
- private static final File EXTERNAL_STORAGE_DIRECTORY
- = getDirectory("EXTERNAL_STORAGE", "/sdcard");
- @@ -62,6 +65,15 @@ public class Environment {
- }
- /**
- + * Gets the SD EXT directory.
- + * @hide
- + */
- +
- + public static File getSdExtDirectory() {
- + return SD_EXT_DIRECTORY;
- + }
- +
- + /**
- * Gets the Android external storage directory. This directory may not
- * currently be accessible if it has been mounted by the user on their
- * computer, has been removed from the device, or some other problem has
- diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService
- index 774c337..88cf275 100644
- --- a/services/java/com/android/server/PackageManagerService.java
- +++ b/services/java/com/android/server/PackageManagerService.java
- @@ -213,9 +213,15 @@ class PackageManagerService extends IPackageManager.Stub {
- // This is the object monitoring mAppInstallDir.
- final FileObserver mAppInstallObserver;
- + // This is the object monitoring mSdExtInstallDir.
- + final FileObserver mSdExtInstallObserver;
- +
- // This is the object monitoring mDrmAppPrivateInstallDir.
- final FileObserver mDrmAppInstallObserver;
- + // This is the object monitoring mDrmSdExtPrivateInstallDir.
- + final FileObserver mDrmSdExtInstallObserver;
- +
- // Used for priviledge escalation. MUST NOT BE CALLED WITH mPackages
- // LOCK HELD. Can be called with mInstallLock held.
- final Installer mInstaller;
- @@ -223,11 +229,17 @@ class PackageManagerService extends IPackageManager.Stub {
- final File mFrameworkDir;
- final File mSystemAppDir;
- final File mAppInstallDir;
- + final File mSdExtInstallDir;
- final File mDalvikCacheDir;
- + final File mSdExtDalvikCacheDir;
- +
- + // Whether or not we are installing on the EXT partition.
- + boolean mExtInstall;
- // Directory containing the private parts (e.g. code and non-resource assets) of forward-locked
- // apps.
- final File mDrmAppPrivateInstallDir;
- + final File mDrmSdExtPrivateInstallDir;
- // ----------------------------------------------------------------
- @@ -767,8 +779,11 @@ class PackageManagerService extends IPackageManager.Stub {
- mHandler = new PackageHandler(mHandlerThread.getLooper());
- File dataDir = Environment.getDataDirectory();
- + File sdExtDir = Environment.getSdExtDirectory();
- mAppDataDir = new File(dataDir, "data");
- + mSdExtInstallDir = new File(sdExtDir, "app");
- mDrmAppPrivateInstallDir = new File(dataDir, "app-private");
- + mDrmSdExtPrivateInstallDir = new File(sdExtDir, "app-private");
- if (mInstaller == null) {
- // Make sure these dirs exist, when we are running in
- @@ -778,6 +793,8 @@ class PackageManagerService extends IPackageManager.Stub {
- miscDir.mkdirs();
- mAppDataDir.mkdirs();
- mDrmAppPrivateInstallDir.mkdirs();
- + mSdExtInstallDir.mkdirs();
- + mDrmSdExtPrivateInstallDir.mkdirs();
- }
- readPermissions();
- @@ -800,6 +817,7 @@ class PackageManagerService extends IPackageManager.Stub {
- mFrameworkDir = new File(Environment.getRootDirectory(), "framework");
- mDalvikCacheDir = new File(dataDir, "dalvik-cache");
- + mSdExtDalvikCacheDir = new File(sdExtDir, "dalvik-cache");
- if (mInstaller != null) {
- boolean didDexOpt = false;
- @@ -901,6 +919,19 @@ class PackageManagerService extends IPackageManager.Stub {
- }
- }
- }
- + if (isA2SDActive()) {
- + files = mSdExtDalvikCacheDir.list();
- + if (files != null) {
- + for (int i=0; i<files.length; i++) {
- + String fn = files[i];
- + if (fn.startsWith("sd-ext@app@")
- + || fn.startsWith("sd-ext@app-private@")) {
- + Log.i(TAG, "Pruning dalvik file: " + fn);
- + (new File(mSdExtDalvikCacheDir, fn)).delete();
- + }
- + }
- + }
- + }
- }
- }
- @@ -965,11 +996,21 @@ class PackageManagerService extends IPackageManager.Stub {
- scanDirLI(mAppInstallDir, 0, scanMode);
- mAppInstallObserver.startWatching();
- + mSdExtInstallObserver = new AppDirObserver(
- + mSdExtInstallDir.getPath(), OBSERVER_EVENTS, false);
- + mSdExtInstallObserver.startWatching();
- + scanDirLI(mSdExtInstallDir, 0, scanMode);
- +
- mDrmAppInstallObserver = new AppDirObserver(
- mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);
- scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK, scanMode);
- mDrmAppInstallObserver.startWatching();
- + mDrmSdExtInstallObserver = new AppDirObserver(
- + mDrmSdExtPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);
- + scanDirLI(mDrmSdExtPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK, scanMode);
- + mDrmSdExtInstallObserver.startWatching();
- +
- EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,
- SystemClock.uptimeMillis());
- Slog.i(TAG, "Time to scan packages: "
- @@ -4713,6 +4754,11 @@ class PackageManagerService extends IPackageManager.Stub {
- installPackage(packageURI, observer, flags, null);
- }
- + private boolean isA2SDActive() {
- + return SystemProperties.getBoolean("cm.a2sd.active", false) ||
- + SystemProperties.getBoolean("cm.a2sd.force", false) ;
- + }
- +
- /* Called when a downloaded package installation has been confirmed by the user */
- public void installPackage(
- final Uri packageURI, final IPackageInstallObserver observer, final int flags,
- @@ -4874,6 +4920,9 @@ class PackageManagerService extends IPackageManager.Stub {
- if (onSd) {
- // Install flag overrides everything.
- return PackageHelper.RECOMMEND_INSTALL_EXTERNAL;
- + } else if (onSdext) {
- + // Install flag overrides everything.
- + return PackageHelper.RECOMMEND_INSTALL_SDEXT;
- }
- // If current upgrade specifies particular preference
- if (installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
- @@ -4899,6 +4948,8 @@ class PackageManagerService extends IPackageManager.Stub {
- // Return result based on recommended install location.
- if (onSd) {
- return PackageHelper.RECOMMEND_INSTALL_EXTERNAL;
- + } else if (onSdext) {
- + return PackageHelper.RECOMMEND_INSTALL_SDEXT;
- }
- return pkgLite.recommendedInstallLocation;
- }
- @@ -4914,10 +4965,17 @@ class PackageManagerService extends IPackageManager.Stub {
- boolean fwdLocked = (flags & PackageManager.INSTALL_FORWARD_LOCK) != 0;
- boolean onSd = (flags & PackageManager.INSTALL_EXTERNAL) != 0;
- boolean onInt = (flags & PackageManager.INSTALL_INTERNAL) != 0;
- + boolean onSdext = (flags & PackageManager.INSTALL_SDEXT) != 0;
- if (onInt && onSd) {
- - // Check if both bits are set.
- + // Check only one bit is set.
- Slog.w(TAG, "Conflicting flags specified for installing on both internal and external");
- ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
- + } else if (onInt && onSdext) {
- + Slog.w(TAG, "Conflicting flags specified for installing on both internal and sd-ext");
- + ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
- + } else if (onSd && onSdext) {
- + Slog.w(TAG, "Conflicting flags specified for installing on both external and sd-ext");
- + ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
- } else if (fwdLocked && onSd) {
- // Check for forward locked apps
- Slog.w(TAG, "Cannot install fwd locked apps on sdcard");
- @@ -4939,7 +4997,7 @@ class PackageManagerService extends IPackageManager.Stub {
- } else {
- // Override with defaults if needed.
- loc = installLocationPolicy(pkgLite, flags);
- - if (!onSd && !onInt) {
- + if (!onSd && !onInt && !onSdext) {
- // Override install location with flags
- if (loc == PackageHelper.RECOMMEND_INSTALL_EXTERNAL) {
- // Set the flag to install on external media.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement