Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 15.85 KB | None | 0 0
  1. diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c
  2. index 8d571dc..4d9623a 100644
  3. --- a/cmds/installd/commands.c
  4. +++ b/cmds/installd/commands.c
  5. @@ -181,15 +181,18 @@ static int is_valid_apk_path(const char *path)
  6.  {
  7.      int len = strlen(APK_DIR_PREFIX);
  8.  int nosubdircheck = 0;
  9. -    if (strncmp(path, APK_DIR_PREFIX, len)) {
  10. -        len = strlen(PROTECTED_DIR_PREFIX);
  11. -        if (strncmp(path, PROTECTED_DIR_PREFIX, len)) {
  12. -            len = strlen(SDCARD_DIR_PREFIX);
  13. -            if (strncmp(path, SDCARD_DIR_PREFIX, len)) {
  14. -                LOGE("invalid apk path '%s' (bad prefix)\n", path);
  15. -                return 0;
  16. -            } else {
  17. -                nosubdircheck = 1;
  18. +    if (strncmp(path, APK_EXT_DIR_PREFIX, len)) {
  19. +        len = strlen(APK_DIR_PREFIX);
  20. +        if (strncmp(path, APK_DIR_PREFIX, len)) {
  21. +            len = strlen(PROTECTED_DIR_PREFIX);
  22. +            if (strncmp(path, PROTECTED_DIR_PREFIX, len)) {
  23. +                len = strlen(SDCARD_DIR_PREFIX);
  24. +                if (strncmp(path, SDCARD_DIR_PREFIX, len)) {
  25. +                    LOGE("invalid apk path '%s' (bad prefix)\n", path);
  26. +                    return 0;
  27. +                } else {
  28. +                    nosubdircheck = 1;
  29. +                }
  30.              }
  31.          }
  32.      }
  33. @@ -426,6 +429,10 @@ int create_cache_path(char path[PKG_PATH_MAX], const char *src)
  34.          }
  35.      }
  36.  
  37. +    if (!strncmp(src, "/sd-ext", 7)) {
  38. +        cache_path = DALVIK_SDEXT_CACHE_PREFIX;
  39. +    }
  40. +
  41.      dstlen = srclen + strlen(cache_path) +
  42.          strlen(DALVIK_CACHE_POSTFIX) + 1;
  43.      
  44. diff --git a/cmds/installd/installd.h b/cmds/installd/installd.h
  45. index fc63b9f..5f94f0b 100644
  46. --- a/cmds/installd/installd.h
  47. +++ b/cmds/installd/installd.h
  48. @@ -57,14 +57,17 @@
  49.  #define CACHE_DIR_POSTFIX      "/cache"
  50.  
  51.  #define APK_DIR_PREFIX         "/data/app/"
  52. +#define APK_EXT_DIR_PREFIX     "/sd-ext/app/"
  53.  
  54.  /* other handy constants */
  55.  
  56.  #define PROTECTED_DIR_PREFIX  "/data/app-private/"
  57. +#define PROTECTED_EXT_DIR_PREFIX "/sd-ext/app-private/"
  58.  #define SDCARD_DIR_PREFIX  getenv("ASEC_MOUNTPOINT")
  59.  
  60.  #define DALVIK_CACHE_PREFIX   "/data/dalvik-cache/"
  61.  #define DALVIK_SYSTEM_CACHE_PREFIX "/cache/dalvik-cache/"
  62. +#define DALVIK_SDEXT_CACHE_PREFIX "/sd-ext/dalvik-cache/"
  63.  #define DALVIK_CACHE_POSTFIX  "/classes.dex"
  64.  
  65.  #define UPDATE_COMMANDS_DIR_PREFIX  "/system/etc/updatecmds/"
  66. diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
  67. index 9b8b0ac..689b218 100644
  68. --- a/cmds/pm/src/com/android/commands/pm/Pm.java
  69. +++ b/cmds/pm/src/com/android/commands/pm/Pm.java
  70. @@ -625,6 +625,8 @@ public final class Pm {
  71.                  locStr = "internal";
  72.              } else if (loc == PackageHelper.APP_INSTALL_EXTERNAL) {
  73.                  locStr = "external";
  74. +            } else if (loc == PackageHelper.APP_INSTALL_SDEXT) {
  75. +                locStr = "sd-ext";
  76.              }
  77.              System.out.println(loc + "[" + locStr + "]");
  78.          } catch (RemoteException e) {
  79. @@ -656,8 +658,11 @@ public final class Pm {
  80.                  // Override if -s option is specified.
  81.                  installFlags |= PackageManager.INSTALL_EXTERNAL;
  82.              } else if (opt.equals("-f")) {
  83. -                // Override if -s option is specified.
  84. +                // Override if -f option is specified.
  85.                  installFlags |= PackageManager.INSTALL_INTERNAL;
  86. +            } else if (opt.equals("-e")) {
  87. +                // Override if -e option is specified.
  88. +                installFlags |= PackageManager.INSTALL_SDEXT;
  89.              } else {
  90.                  System.err.println("Error: Unknown option: " + opt);
  91.                  showUsage();
  92. @@ -921,6 +926,7 @@ public final class Pm {
  93.          System.err.println("  -i: specify the installer package name.");
  94.          System.err.println("  -s: install package on sdcard.");
  95.          System.err.println("  -f: install package on internal flash.");
  96. +        System.err.println("  -e: install package on sd-ext.");
  97.          System.err.println("");
  98.          System.err.println("The uninstall command removes a package from the system. Options:");
  99.          System.err.println("  -k: keep the data and cache directories around.");
  100. @@ -930,13 +936,15 @@ public final class Pm {
  101.          System.err.println("a given package or component (written as \"package/class\").");
  102.          System.err.println("");
  103.          System.err.println("The getInstallLocation command gets the current install location");
  104. -        System.err.println("  0 [auto]: Let system decide the best location");
  105. +        System.err.println("  0 [auto]    : Let system decide the best location");
  106.          System.err.println("  1 [internal]: Install on internal device storage");
  107.          System.err.println("  2 [external]: Install on external media");
  108. +        System.err.println("  3 [sdext]   : Install on sd-ext");
  109.          System.err.println("");
  110.          System.err.println("The setInstallLocation command changes the default install location");
  111. -        System.err.println("  0 [auto]: Let system decide the best location");
  112. +        System.err.println("  0 [auto]    : Let system decide the best location");
  113.          System.err.println("  1 [internal]: Install on internal device storage");
  114.          System.err.println("  2 [external]: Install on external media");
  115. +        System.err.println("  3 [sdext]   : Install on sd-ext");
  116.      }
  117.  }
  118. diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
  119. index 68b44e7..70a181e 100644
  120. --- a/core/java/android/content/pm/PackageManager.java
  121. +++ b/core/java/android/content/pm/PackageManager.java
  122. @@ -268,6 +268,13 @@ public abstract class PackageManager {
  123.     public static final int INSTALL_INTERNAL = 0x00000010;
  124.  
  125.      /**
  126. +    * Flag parameter for {@link #installPackage} to indicate that this
  127. +    * package has to be installed on the sdext.
  128. +    * @hide
  129. +    */
  130. +   public static final int INSTALL_SDEXT = 0x00000020;
  131. +
  132. +    /**
  133.       * Flag parameter for
  134.       * {@link #setComponentEnabledSetting(android.content.ComponentName, int, int)} to indicate
  135.       * that you don't want to kill the app containing the component.  Be careful when you set this
  136. diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
  137. index 812391c..813fb65 100644
  138. --- a/core/java/android/os/Environment.java
  139. +++ b/core/java/android/os/Environment.java
  140. @@ -40,6 +40,9 @@ public class Environment {
  141.      private static final File DATA_DIRECTORY
  142.              = getDirectory("ANDROID_DATA", "/data");
  143.  
  144. +    private static final File SD_EXT_DIRECTORY
  145. +            = getDirectory("SD_EXT_DIRECTORY", "/sd-ext");
  146. +
  147.      private static final File EXTERNAL_STORAGE_DIRECTORY
  148.              = getDirectory("EXTERNAL_STORAGE", "/sdcard");
  149.  
  150. @@ -62,6 +65,15 @@ public class Environment {
  151.      }
  152.  
  153.      /**
  154. +     * Gets the SD EXT directory.
  155. +     * @hide
  156. +     */
  157. +
  158. +    public static File getSdExtDirectory() {
  159. +        return SD_EXT_DIRECTORY;
  160. +    }
  161. +
  162. +    /**
  163.       * Gets the Android external storage directory.  This directory may not
  164.       * currently be accessible if it has been mounted by the user on their
  165.       * computer, has been removed from the device, or some other problem has
  166. diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService
  167. index 774c337..88cf275 100644
  168. --- a/services/java/com/android/server/PackageManagerService.java
  169. +++ b/services/java/com/android/server/PackageManagerService.java
  170. @@ -213,9 +213,15 @@ class PackageManagerService extends IPackageManager.Stub {
  171.      // This is the object monitoring mAppInstallDir.
  172.      final FileObserver mAppInstallObserver;
  173.  
  174. +    // This is the object monitoring mSdExtInstallDir.
  175. +    final FileObserver mSdExtInstallObserver;
  176. +
  177.      // This is the object monitoring mDrmAppPrivateInstallDir.
  178.      final FileObserver mDrmAppInstallObserver;
  179.  
  180. +    // This is the object monitoring mDrmSdExtPrivateInstallDir.
  181. +    final FileObserver mDrmSdExtInstallObserver;
  182. +
  183.      // Used for priviledge escalation.  MUST NOT BE CALLED WITH mPackages
  184.      // LOCK HELD.  Can be called with mInstallLock held.
  185.      final Installer mInstaller;
  186. @@ -223,11 +229,17 @@ class PackageManagerService extends IPackageManager.Stub {
  187.      final File mFrameworkDir;
  188.      final File mSystemAppDir;
  189.      final File mAppInstallDir;
  190. +    final File mSdExtInstallDir;
  191.      final File mDalvikCacheDir;
  192. +    final File mSdExtDalvikCacheDir;
  193. +
  194. +    // Whether or not we are installing on the EXT partition.
  195. +    boolean mExtInstall;
  196.  
  197.      // Directory containing the private parts (e.g. code and non-resource assets) of forward-locked
  198.      // apps.
  199.      final File mDrmAppPrivateInstallDir;
  200. +    final File mDrmSdExtPrivateInstallDir;
  201.  
  202.      // ----------------------------------------------------------------
  203.  
  204. @@ -767,8 +779,11 @@ class PackageManagerService extends IPackageManager.Stub {
  205.              mHandler = new PackageHandler(mHandlerThread.getLooper());
  206.  
  207.              File dataDir = Environment.getDataDirectory();
  208. +            File sdExtDir = Environment.getSdExtDirectory();
  209.              mAppDataDir = new File(dataDir, "data");
  210. +            mSdExtInstallDir = new File(sdExtDir, "app");
  211.              mDrmAppPrivateInstallDir = new File(dataDir, "app-private");
  212. +            mDrmSdExtPrivateInstallDir = new File(sdExtDir, "app-private");
  213.  
  214.              if (mInstaller == null) {
  215.                  // Make sure these dirs exist, when we are running in
  216. @@ -778,6 +793,8 @@ class PackageManagerService extends IPackageManager.Stub {
  217.                  miscDir.mkdirs();
  218.                  mAppDataDir.mkdirs();
  219.                  mDrmAppPrivateInstallDir.mkdirs();
  220. +                mSdExtInstallDir.mkdirs();
  221. +                mDrmSdExtPrivateInstallDir.mkdirs();
  222.              }
  223.  
  224.              readPermissions();
  225. @@ -800,6 +817,7 @@ class PackageManagerService extends IPackageManager.Stub {
  226.  
  227.              mFrameworkDir = new File(Environment.getRootDirectory(), "framework");
  228.              mDalvikCacheDir = new File(dataDir, "dalvik-cache");
  229. +            mSdExtDalvikCacheDir = new File(sdExtDir, "dalvik-cache");
  230.  
  231.              if (mInstaller != null) {
  232.                  boolean didDexOpt = false;
  233. @@ -901,6 +919,19 @@ class PackageManagerService extends IPackageManager.Stub {
  234.                              }
  235.                          }
  236.                      }
  237. +                    if (isA2SDActive()) {
  238. +                        files = mSdExtDalvikCacheDir.list();
  239. +                        if (files != null) {
  240. +                            for (int i=0; i<files.length; i++) {
  241. +                                String fn = files[i];
  242. +                                if (fn.startsWith("sd-ext@app@")
  243. +                                        || fn.startsWith("sd-ext@app-private@")) {
  244. +                                    Log.i(TAG, "Pruning dalvik file: " + fn);
  245. +                                    (new File(mSdExtDalvikCacheDir, fn)).delete();
  246. +                                }
  247. +                            }
  248. +                        }
  249. +                    }
  250.                  }
  251.              }
  252.  
  253. @@ -965,11 +996,21 @@ class PackageManagerService extends IPackageManager.Stub {
  254.              scanDirLI(mAppInstallDir, 0, scanMode);
  255.              mAppInstallObserver.startWatching();
  256.  
  257. +            mSdExtInstallObserver = new AppDirObserver(
  258. +                mSdExtInstallDir.getPath(), OBSERVER_EVENTS, false);
  259. +            mSdExtInstallObserver.startWatching();
  260. +            scanDirLI(mSdExtInstallDir, 0, scanMode);
  261. +
  262.              mDrmAppInstallObserver = new AppDirObserver(
  263.                  mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);
  264.              scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK, scanMode);
  265.              mDrmAppInstallObserver.startWatching();
  266.  
  267. +            mDrmSdExtInstallObserver = new AppDirObserver(
  268. +                mDrmSdExtPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);
  269. +            scanDirLI(mDrmSdExtPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK, scanMode);
  270. +            mDrmSdExtInstallObserver.startWatching();
  271. +
  272.              EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,
  273.                      SystemClock.uptimeMillis());
  274.              Slog.i(TAG, "Time to scan packages: "
  275. @@ -4713,6 +4754,11 @@ class PackageManagerService extends IPackageManager.Stub {
  276.          installPackage(packageURI, observer, flags, null);
  277.      }
  278.  
  279. +    private boolean isA2SDActive() {
  280. +        return SystemProperties.getBoolean("cm.a2sd.active", false) ||
  281. +               SystemProperties.getBoolean("cm.a2sd.force", false)  ;
  282. +    }
  283. +
  284.      /* Called when a downloaded package installation has been confirmed by the user */
  285.      public void installPackage(
  286.              final Uri packageURI, final IPackageInstallObserver observer, final int flags,
  287. @@ -4874,6 +4920,9 @@ class PackageManagerService extends IPackageManager.Stub {
  288.                              if (onSd) {
  289.                                  // Install flag overrides everything.
  290.                                  return PackageHelper.RECOMMEND_INSTALL_EXTERNAL;
  291. +                            } else if (onSdext) {
  292. +                                // Install flag overrides everything.
  293. +                                return PackageHelper.RECOMMEND_INSTALL_SDEXT;
  294.                              }
  295.                              // If current upgrade specifies particular preference
  296.                              if (installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
  297. @@ -4899,6 +4948,8 @@ class PackageManagerService extends IPackageManager.Stub {
  298.              // Return result based on recommended install location.
  299.              if (onSd) {
  300.                  return PackageHelper.RECOMMEND_INSTALL_EXTERNAL;
  301. +            } else if (onSdext) {
  302. +                return PackageHelper.RECOMMEND_INSTALL_SDEXT;
  303.              }
  304.              return pkgLite.recommendedInstallLocation;
  305.          }
  306. @@ -4914,10 +4965,17 @@ class PackageManagerService extends IPackageManager.Stub {
  307.              boolean fwdLocked = (flags & PackageManager.INSTALL_FORWARD_LOCK) != 0;
  308.              boolean onSd = (flags & PackageManager.INSTALL_EXTERNAL) != 0;
  309.              boolean onInt = (flags & PackageManager.INSTALL_INTERNAL) != 0;
  310. +            boolean onSdext = (flags & PackageManager.INSTALL_SDEXT) != 0;
  311.              if (onInt && onSd) {
  312. -                // Check if both bits are set.
  313. +                // Check only one bit is set.
  314.                  Slog.w(TAG, "Conflicting flags specified for installing on both internal and external");
  315.                  ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
  316. +            } else if (onInt && onSdext) {
  317. +                Slog.w(TAG, "Conflicting flags specified for installing on both internal and sd-ext");
  318. +                ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
  319. +            } else if (onSd && onSdext) {
  320. +                Slog.w(TAG, "Conflicting flags specified for installing on both external and sd-ext");
  321. +                ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
  322.              } else if (fwdLocked && onSd) {
  323.                  // Check for forward locked apps
  324.                  Slog.w(TAG, "Cannot install fwd locked apps on sdcard");
  325. @@ -4939,7 +4997,7 @@ class PackageManagerService extends IPackageManager.Stub {
  326.                  } else {
  327.                      // Override with defaults if needed.
  328.                      loc = installLocationPolicy(pkgLite, flags);
  329. -                    if (!onSd && !onInt) {
  330. +                    if (!onSd && !onInt && !onSdext) {
  331.                          // Override install location with flags
  332.                          if (loc == PackageHelper.RECOMMEND_INSTALL_EXTERNAL) {
  333.                              // Set the flag to install on external media.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement