Merge "Clean/destroy app shared storage via installd."
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 9ca0745..1f6cfff 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -1753,12 +1753,6 @@
 HPLandroid/content/pm/LauncherApps$CallbackMessageHandler;->postOnPackageChanged(Ljava/lang/String;Landroid/os/UserHandle;)V
 HPLandroid/content/pm/LauncherApps$CallbackMessageHandler;->postOnPackageRemoved(Ljava/lang/String;Landroid/os/UserHandle;)V
 HPLandroid/content/pm/LauncherApps$ShortcutQuery;->setActivity(Landroid/content/ComponentName;)Landroid/content/pm/LauncherApps$ShortcutQuery;
-HPLandroid/content/pm/PackageCleanItem$1;-><init>()V
-HPLandroid/content/pm/PackageCleanItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageCleanItem;
-HPLandroid/content/pm/PackageCleanItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-HPLandroid/content/pm/PackageCleanItem;-><init>(ILjava/lang/String;Z)V
-HPLandroid/content/pm/PackageCleanItem;->equals(Ljava/lang/Object;)Z
-HPLandroid/content/pm/PackageCleanItem;->writeToParcel(Landroid/os/Parcel;I)V
 HPLandroid/content/pm/PackageInfo$1;->newArray(I)[Landroid/content/pm/PackageInfo;
 HPLandroid/content/pm/PackageInfo$1;->newArray(I)[Ljava/lang/Object;
 HPLandroid/content/pm/PackageInfo;->isOverlayPackage()Z
@@ -18113,7 +18107,6 @@
 HSPLandroid/content/pm/IPackageManager;->logAppProcessStartIfNeeded(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;I)V
 HSPLandroid/content/pm/IPackageManager;->movePackage(Ljava/lang/String;Ljava/lang/String;)I
 HSPLandroid/content/pm/IPackageManager;->movePrimaryStorage(Ljava/lang/String;)I
-HSPLandroid/content/pm/IPackageManager;->nextPackageToClean(Landroid/content/pm/PackageCleanItem;)Landroid/content/pm/PackageCleanItem;
 HSPLandroid/content/pm/IPackageManager;->notifyDexLoad(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;)V
 HSPLandroid/content/pm/IPackageManager;->notifyPackageUse(Ljava/lang/String;I)V
 HSPLandroid/content/pm/IPackageManager;->performDexOptMode(Ljava/lang/String;ZLjava/lang/String;ZZLjava/lang/String;)Z
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index bc5b32c..6a20c93 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -37,7 +37,6 @@
 import android.content.pm.InstrumentationInfo;
 import android.content.pm.KeySet;
 import android.content.pm.PackageInfo;
-import android.content.pm.PackageCleanItem;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.ProviderInfo;
 import android.content.pm.PermissionGroupInfo;
@@ -553,8 +552,6 @@
      */
     void reconcileSecondaryDexFiles(String packageName);
 
-    PackageCleanItem nextPackageToClean(in PackageCleanItem lastPackage);
-
     int getMoveStatus(int moveId);
 
     void registerMoveCallback(in IPackageMoveObserver callback);
diff --git a/core/java/android/content/pm/PackageCleanItem.aidl b/core/java/android/content/pm/PackageCleanItem.aidl
deleted file mode 100644
index 9bb203e..0000000
--- a/core/java/android/content/pm/PackageCleanItem.aidl
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-package android.content.pm;
-
-parcelable PackageCleanItem;
diff --git a/core/java/android/content/pm/PackageCleanItem.java b/core/java/android/content/pm/PackageCleanItem.java
deleted file mode 100644
index e1656d6..0000000
--- a/core/java/android/content/pm/PackageCleanItem.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.pm;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/** @hide */
-public class PackageCleanItem implements Parcelable {
-    public final int userId;
-    public final String packageName;
-    public final boolean andCode;
-
-    public PackageCleanItem(int userId, String packageName, boolean andCode) {
-        this.userId = userId;
-        this.packageName = packageName;
-        this.andCode = andCode;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        try {
-            if (obj != null) {
-                PackageCleanItem other = (PackageCleanItem)obj;
-                return userId == other.userId && packageName.equals(other.packageName)
-                        && andCode == other.andCode;
-            }
-        } catch (ClassCastException e) {
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 31 * result + userId;
-        result = 31 * result + packageName.hashCode();
-        result = 31 * result + (andCode ? 1 : 0);
-        return result;
-    }
-
-    public int describeContents() {
-        return 0;
-    }
-
-    public void writeToParcel(Parcel dest, int parcelableFlags) {
-        dest.writeInt(userId);
-        dest.writeString(packageName);
-        dest.writeInt(andCode ? 1 : 0);
-    }
-
-    public static final Parcelable.Creator<PackageCleanItem> CREATOR
-            = new Parcelable.Creator<PackageCleanItem>() {
-        public PackageCleanItem createFromParcel(Parcel source) {
-            return new PackageCleanItem(source);
-        }
-
-        public PackageCleanItem[] newArray(int size) {
-            return new PackageCleanItem[size];
-        }
-    };
-
-    private PackageCleanItem(Parcel source) {
-        userId = source.readInt();
-        packageName = source.readString();
-        andCode = source.readInt() != 0;
-    }
-}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 4f39ec0..ac2f1ce 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -2678,13 +2678,6 @@
             "android.software.device_id_attestation";
 
     /**
-     * Action to external storage service to clean out removed apps.
-     * @hide
-     */
-    public static final String ACTION_CLEAN_EXTERNAL_STORAGE
-            = "android.content.pm.CLEAN_EXTERNAL_STORAGE";
-
-    /**
      * Extra field name for the URI to a verification file. Passed to a package
      * verifier.
      *
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index e69acae..9724e8f 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -40,6 +40,7 @@
 import android.os.Environment;
 import android.os.FileUtils;
 import android.os.Handler;
+import android.os.IInstalld;
 import android.os.IVold;
 import android.os.IVoldTaskListener;
 import android.os.Looper;
@@ -215,11 +216,10 @@
     /** {@hide} */
     public static final int DEBUG_VIRTUAL_DISK = 1 << 5;
 
-    // NOTE: keep in sync with installd
     /** {@hide} */
-    public static final int FLAG_STORAGE_DE = 1 << 0;
+    public static final int FLAG_STORAGE_DE = IInstalld.FLAG_STORAGE_DE;
     /** {@hide} */
-    public static final int FLAG_STORAGE_CE = 1 << 1;
+    public static final int FLAG_STORAGE_CE = IInstalld.FLAG_STORAGE_CE;
 
     /** {@hide} */
     public static final int FLAG_FOR_WRITE = 1 << 8;
diff --git a/core/java/com/android/internal/app/IMediaContainerService.aidl b/core/java/com/android/internal/app/IMediaContainerService.aidl
index ef30cd1..3540b07 100644
--- a/core/java/com/android/internal/app/IMediaContainerService.aidl
+++ b/core/java/com/android/internal/app/IMediaContainerService.aidl
@@ -25,6 +25,5 @@
 
     PackageInfoLite getMinimalPackageInfo(String packagePath, int flags, String abiOverride);
     ObbInfo getObbInfo(String filename);
-    void clearDirectory(String directory);
     long calculateInstalledSize(String packagePath, String abiOverride);
 }
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
index 9f165bc..97a67c2 100644
--- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
+++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
@@ -16,11 +16,9 @@
 
 package com.android.defcontainer;
 
-import android.app.IntentService;
+import android.app.Service;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageCleanItem;
 import android.content.pm.PackageInfoLite;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageParser;
@@ -29,13 +27,10 @@
 import android.content.res.ObbInfo;
 import android.content.res.ObbScanner;
 import android.os.Binder;
-import android.os.Environment.UserEnvironment;
 import android.os.FileUtils;
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
-import android.os.Process;
 import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.util.Slog;
 
 import com.android.internal.app.IMediaContainerService;
@@ -57,7 +52,7 @@
  * open files that cause the kernel to kill it when the underlying device is
  * removed.
  */
-public class DefaultContainerService extends IntentService {
+public class DefaultContainerService extends Service {
     private static final String TAG = "DefContainer";
 
     // TODO: migrate native code unpacking to always be a derivative work
@@ -159,16 +154,6 @@
             }
         }
 
-        @Override
-        public void clearDirectory(String path) throws RemoteException {
-            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-
-            final File directory = new File(path);
-            if (directory.exists() && directory.isDirectory()) {
-                eraseFiles(directory);
-            }
-        }
-
         /**
          * Calculate estimated footprint of given package post-installation.
          *
@@ -191,49 +176,6 @@
         }
     };
 
-    public DefaultContainerService() {
-        super("DefaultContainerService");
-        setIntentRedelivery(true);
-    }
-
-    @Override
-    protected void onHandleIntent(Intent intent) {
-        if (PackageManager.ACTION_CLEAN_EXTERNAL_STORAGE.equals(intent.getAction())) {
-            final IPackageManager pm = IPackageManager.Stub.asInterface(
-                    ServiceManager.getService("package"));
-            PackageCleanItem item = null;
-            try {
-                while ((item = pm.nextPackageToClean(item)) != null) {
-                    final UserEnvironment userEnv = new UserEnvironment(item.userId);
-                    eraseFiles(userEnv.buildExternalStorageAppDataDirs(item.packageName));
-                    eraseFiles(userEnv.buildExternalStorageAppMediaDirs(item.packageName));
-                    if (item.andCode) {
-                        eraseFiles(userEnv.buildExternalStorageAppObbDirs(item.packageName));
-                    }
-                }
-            } catch (RemoteException e) {
-            }
-        }
-    }
-
-    void eraseFiles(File[] paths) {
-        for (File path : paths) {
-            eraseFiles(path);
-        }
-    }
-
-    void eraseFiles(File path) {
-        if (path.isDirectory()) {
-            String[] files = path.list();
-            if (files != null) {
-                for (String file : files) {
-                    eraseFiles(new File(path, file));
-                }
-            }
-        }
-        path.delete();
-    }
-
     @Override
     public IBinder onBind(Intent intent) {
         return mBinder;
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 72f11f7..a5c083e 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -71,14 +71,18 @@
     /** Indicates that dexopt should generate an app image */
     public static final int DEXOPT_GENERATE_APP_IMAGE = 1 << 12;
 
-    // NOTE: keep in sync with installd
-    public static final int FLAG_CLEAR_CACHE_ONLY = 1 << 8;
-    public static final int FLAG_CLEAR_CODE_CACHE_ONLY = 1 << 9;
-    public static final int FLAG_USE_QUOTA = 1 << 12;
-    public static final int FLAG_FREE_CACHE_V2 = 1 << 13;
-    public static final int FLAG_FREE_CACHE_V2_DEFY_QUOTA = 1 << 14;
-    public static final int FLAG_FREE_CACHE_NOOP = 1 << 15;
-    public static final int FLAG_FORCE = 1 << 16;
+    public static final int FLAG_STORAGE_DE = IInstalld.FLAG_STORAGE_DE;
+    public static final int FLAG_STORAGE_CE = IInstalld.FLAG_STORAGE_CE;
+
+    public static final int FLAG_CLEAR_CACHE_ONLY = IInstalld.FLAG_CLEAR_CACHE_ONLY;
+    public static final int FLAG_CLEAR_CODE_CACHE_ONLY = IInstalld.FLAG_CLEAR_CODE_CACHE_ONLY;
+
+    public static final int FLAG_FREE_CACHE_V2 = IInstalld.FLAG_FREE_CACHE_V2;
+    public static final int FLAG_FREE_CACHE_V2_DEFY_QUOTA = IInstalld.FLAG_FREE_CACHE_V2_DEFY_QUOTA;
+    public static final int FLAG_FREE_CACHE_NOOP = IInstalld.FLAG_FREE_CACHE_NOOP;
+
+    public static final int FLAG_USE_QUOTA = IInstalld.FLAG_USE_QUOTA;
+    public static final int FLAG_FORCE = IInstalld.FLAG_FORCE;
 
     private final boolean mIsolated;
 
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 2925523..52a8510 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -162,7 +162,6 @@
 import android.content.pm.InstrumentationInfo;
 import android.content.pm.IntentFilterVerificationInfo;
 import android.content.pm.KeySet;
-import android.content.pm.PackageCleanItem;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageInfoLite;
 import android.content.pm.PackageInstaller;
@@ -619,12 +618,6 @@
 
     private final ProcessLoggingHandler mProcessLoggingHandler;
 
-    /**
-     * Messages for {@link #mHandler} that need to wait for system ready before
-     * being dispatched.
-     */
-    private ArrayList<Message> mPostSystemReadyMessages;
-
     final int mSdkVersion = Build.VERSION.SDK_INT;
 
     final Context mContext;
@@ -637,10 +630,6 @@
     final boolean mIsPreNUpgrade;
     final boolean mIsPreNMR1Upgrade;
 
-    // Have we told the Activity Manager to whitelist the default container service by uid yet?
-    @GuardedBy("mPackages")
-    boolean mDefaultContainerWhitelisted = false;
-
     @GuardedBy("mPackages")
     private boolean mDexOptDialogShown;
 
@@ -1258,7 +1247,6 @@
     static final int MCS_BOUND = 3;
     static final int INIT_COPY = 5;
     static final int MCS_UNBIND = 6;
-    static final int START_CLEANING_PACKAGE = 7;
     static final int POST_INSTALL = 9;
     static final int MCS_RECONNECT = 10;
     static final int MCS_GIVE_UP = 11;
@@ -1602,26 +1590,6 @@
                     Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                     break;
                 }
-                case START_CLEANING_PACKAGE: {
-                    Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
-                    final String packageName = (String)msg.obj;
-                    final int userId = msg.arg1;
-                    final boolean andCode = msg.arg2 != 0;
-                    synchronized (mPackages) {
-                        if (userId == UserHandle.USER_ALL) {
-                            int[] users = sUserManager.getUserIds();
-                            for (int user : users) {
-                                mSettings.addPackageToCleanLPw(
-                                        new PackageCleanItem(user, packageName, andCode));
-                            }
-                        } else {
-                            mSettings.addPackageToCleanLPw(
-                                    new PackageCleanItem(userId, packageName, andCode));
-                        }
-                    }
-                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-                    startCleaningPackages();
-                } break;
                 case POST_INSTALL: {
                     if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1);
 
@@ -11535,14 +11503,6 @@
             mSettings.insertPackageSettingLPw(pkgSetting, pkg);
             // Add the new setting to mPackages
             mPackages.put(pkg.applicationInfo.packageName, pkg);
-            // Make sure we don't accidentally delete its data.
-            final Iterator<PackageCleanItem> iter = mSettings.mPackagesToBeCleaned.iterator();
-            while (iter.hasNext()) {
-                PackageCleanItem item = iter.next();
-                if (pkgName.equals(item.packageName)) {
-                    iter.remove();
-                }
-            }
 
             // Add the package's KeySets to the global KeySetManagerService
             KeySetManagerService ksms = mSettings.mKeySetManagerService;
@@ -12398,75 +12358,6 @@
         return mMediaMounted || Environment.isExternalStorageEmulated();
     }
 
-    @Override
-    public PackageCleanItem nextPackageToClean(PackageCleanItem lastPackage) {
-        if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
-            return null;
-        }
-        if (!isExternalMediaAvailable()) {
-                // If the external storage is no longer mounted at this point,
-                // the caller may not have been able to delete all of this
-                // packages files and can not delete any more.  Bail.
-            return null;
-        }
-        synchronized (mPackages) {
-            final ArrayList<PackageCleanItem> pkgs = mSettings.mPackagesToBeCleaned;
-            if (lastPackage != null) {
-                pkgs.remove(lastPackage);
-            }
-            if (pkgs.size() > 0) {
-                return pkgs.get(0);
-            }
-        }
-        return null;
-    }
-
-    void schedulePackageCleaning(String packageName, int userId, boolean andCode) {
-        final Message msg = mHandler.obtainMessage(START_CLEANING_PACKAGE,
-                userId, andCode ? 1 : 0, packageName);
-        if (mSystemReady) {
-            msg.sendToTarget();
-        } else {
-            if (mPostSystemReadyMessages == null) {
-                mPostSystemReadyMessages = new ArrayList<>();
-            }
-            mPostSystemReadyMessages.add(msg);
-        }
-    }
-
-    void startCleaningPackages() {
-        // reader
-        if (!isExternalMediaAvailable()) {
-            return;
-        }
-        synchronized (mPackages) {
-            if (mSettings.mPackagesToBeCleaned.isEmpty()) {
-                return;
-            }
-        }
-        Intent intent = new Intent(PackageManager.ACTION_CLEAN_EXTERNAL_STORAGE);
-        intent.setComponent(DEFAULT_CONTAINER_COMPONENT);
-        IActivityManager am = ActivityManager.getService();
-        if (am != null) {
-            int dcsUid = -1;
-            synchronized (mPackages) {
-                if (!mDefaultContainerWhitelisted) {
-                    mDefaultContainerWhitelisted = true;
-                    PackageSetting ps = mSettings.mPackages.get(DEFAULT_CONTAINER_PACKAGE);
-                    dcsUid = UserHandle.getUid(UserHandle.USER_SYSTEM, ps.appId);
-                }
-            }
-            try {
-                if (dcsUid > 0) {
-                    am.backgroundWhitelistUid(dcsUid);
-                }
-                am.startService(null, intent, null, false, mContext.getOpPackageName(),
-                        UserHandle.USER_SYSTEM);
-            } catch (RemoteException e) {
-            }
-        }
-    }
-
     /**
      * Ensure that the install reason matches what we know about the package installer (e.g. whether
      * it is acting on behalf on an enterprise or the user).
@@ -13936,15 +13827,6 @@
         abstract void handleReturnCode();
     }
 
-    private static void clearDirectory(IMediaContainerService mcs, File[] paths) {
-        for (File path : paths) {
-            try {
-                mcs.clearDirectory(path.getAbsolutePath());
-            } catch (RemoteException e) {
-            }
-        }
-    }
-
     static class OriginInfo {
         /**
          * Location where install is coming from, before it has been
@@ -17270,7 +17152,6 @@
             if (outInfo != null) {
                 outInfo.dataRemoved = true;
             }
-            schedulePackageCleaning(packageName, UserHandle.USER_ALL, true);
         }
 
         int removedAppId = -1;
@@ -17927,7 +17808,6 @@
             destroyAppProfilesLIF(pkg, userId);
             clearDefaultBrowserIfNeededForUser(ps.name, userId);
             removeKeystoreDataIfNeeded(nextUserId, ps.appId);
-            schedulePackageCleaning(ps.name, nextUserId, false);
             synchronized (mPackages) {
                 if (clearPackagePreferredActivitiesLPw(ps.name, nextUserId)) {
                     scheduleWritePackageRestrictionsLocked(nextUserId);
@@ -17948,83 +17828,6 @@
         return true;
     }
 
-    private final class ClearStorageConnection implements ServiceConnection {
-        IMediaContainerService mContainerService;
-
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            synchronized (this) {
-                mContainerService = IMediaContainerService.Stub
-                        .asInterface(Binder.allowBlocking(service));
-                notifyAll();
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-        }
-    }
-
-    private void clearExternalStorageDataSync(String packageName, int userId, boolean allData) {
-        if (DEFAULT_CONTAINER_PACKAGE.equals(packageName)) return;
-
-        final boolean mounted;
-        if (Environment.isExternalStorageEmulated()) {
-            mounted = true;
-        } else {
-            final String status = Environment.getExternalStorageState();
-
-            mounted = status.equals(Environment.MEDIA_MOUNTED)
-                    || status.equals(Environment.MEDIA_MOUNTED_READ_ONLY);
-        }
-
-        if (!mounted) {
-            return;
-        }
-
-        final Intent containerIntent = new Intent().setComponent(DEFAULT_CONTAINER_COMPONENT);
-        int[] users;
-        if (userId == UserHandle.USER_ALL) {
-            users = sUserManager.getUserIds();
-        } else {
-            users = new int[] { userId };
-        }
-        final ClearStorageConnection conn = new ClearStorageConnection();
-        if (mContext.bindServiceAsUser(
-                containerIntent, conn, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)) {
-            try {
-                for (int curUser : users) {
-                    long timeout = SystemClock.uptimeMillis() + 5000;
-                    synchronized (conn) {
-                        long now;
-                        while (conn.mContainerService == null &&
-                                (now = SystemClock.uptimeMillis()) < timeout) {
-                            try {
-                                conn.wait(timeout - now);
-                            } catch (InterruptedException e) {
-                            }
-                        }
-                    }
-                    if (conn.mContainerService == null) {
-                        return;
-                    }
-
-                    final UserEnvironment userEnv = new UserEnvironment(curUser);
-                    clearDirectory(conn.mContainerService,
-                            userEnv.buildExternalStorageAppCacheDirs(packageName));
-                    if (allData) {
-                        clearDirectory(conn.mContainerService,
-                                userEnv.buildExternalStorageAppDataDirs(packageName));
-                        clearDirectory(conn.mContainerService,
-                                userEnv.buildExternalStorageAppMediaDirs(packageName));
-                    }
-                }
-            } finally {
-                mContext.unbindService(conn);
-            }
-        }
-    }
-
     @Override
     public void clearApplicationProfileData(String packageName) {
         enforceSystemOrRoot("Only the system can clear all profile data");
@@ -18068,7 +17871,6 @@
                         synchronized (mInstallLock) {
                             succeeded = clearApplicationUserDataLIF(packageName, userId);
                         }
-                        clearExternalStorageDataSync(packageName, userId, true);
                         synchronized (mPackages) {
                             mInstantAppRegistry.deleteInstantApplicationMetadataLPw(
                                     packageName, userId);
@@ -18361,7 +18163,6 @@
                     clearAppDataLIF(pkg, userId, flags | Installer.FLAG_CLEAR_CACHE_ONLY);
                     clearAppDataLIF(pkg, userId, flags | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
                 }
-                clearExternalStorageDataSync(packageName, userId, false);
             }
             if (observer != null) {
                 try {
@@ -20011,14 +19812,6 @@
                     mPermissionCallback);
         }
 
-        // Kick off any messages waiting for system ready
-        if (mPostSystemReadyMessages != null) {
-            for (Message msg : mPostSystemReadyMessages) {
-                msg.sendToTarget();
-            }
-            mPostSystemReadyMessages = null;
-        }
-
         // Watch for external volumes that come and go over time
         final StorageManager storage = mContext.getSystemService(StorageManager.class);
         storage.registerListener(mStorageListener);
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 8dd1a0f..6d242f4 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -42,7 +42,6 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ComponentInfo;
 import android.content.pm.IntentFilterVerificationInfo;
-import android.content.pm.PackageCleanItem;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.PackageParser;
@@ -209,8 +208,6 @@
 
     public static final String ATTR_NAME = "name";
     public static final String ATTR_PACKAGE = "package";
-    private static final String ATTR_USER = "user";
-    private static final String ATTR_CODE = "code";
     private static final String ATTR_GRANTED = "granted";
     private static final String ATTR_FLAGS = "flags";
     private static final String ATTR_VERSION = "version";
@@ -388,10 +385,6 @@
     private final ArrayMap<Long, Integer> mKeySetRefs =
             new ArrayMap<Long, Integer>();
 
-    // Packages that have been uninstalled and still need their external
-    // storage data deleted.
-    final ArrayList<PackageCleanItem> mPackagesToBeCleaned = new ArrayList<PackageCleanItem>();
-
     // Packages that have been renamed since they were first installed.
     // Keys are the new names of the packages, values are the original
     // names.  The packages appear everywhere else under their original
@@ -2546,17 +2539,6 @@
                 serializer.endTag(null, "shared-user");
             }
 
-            if (mPackagesToBeCleaned.size() > 0) {
-                for (PackageCleanItem item : mPackagesToBeCleaned) {
-                    final String userStr = Integer.toString(item.userId);
-                    serializer.startTag(null, "cleaning-package");
-                    serializer.attribute(null, ATTR_NAME, item.packageName);
-                    serializer.attribute(null, ATTR_CODE, item.andCode ? "true" : "false");
-                    serializer.attribute(null, ATTR_USER, userStr);
-                    serializer.endTag(null, "cleaning-package");
-                }
-            }
-
             if (mRenamedPackages.size() > 0) {
                 for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
                     serializer.startTag(null, "renamed-package");
@@ -2972,12 +2954,6 @@
         bp.writeLPr(serializer);
     }
 
-    void addPackageToCleanLPw(PackageCleanItem pkg) {
-        if (!mPackagesToBeCleaned.contains(pkg)) {
-            mPackagesToBeCleaned.add(pkg);
-        }
-    }
-
     boolean readLPw(@NonNull List<UserInfo> users) {
         FileInputStream str = null;
         if (mBackupSettingsFilename.exists()) {
@@ -3070,24 +3046,6 @@
                     readDefaultAppsLPw(parser, 0);
                 } else if (tagName.equals("updated-package")) {
                     readDisabledSysPackageLPw(parser);
-                } else if (tagName.equals("cleaning-package")) {
-                    String name = parser.getAttributeValue(null, ATTR_NAME);
-                    String userStr = parser.getAttributeValue(null, ATTR_USER);
-                    String codeStr = parser.getAttributeValue(null, ATTR_CODE);
-                    if (name != null) {
-                        int userId = UserHandle.USER_SYSTEM;
-                        boolean andCode = true;
-                        try {
-                            if (userStr != null) {
-                                userId = Integer.parseInt(userStr);
-                            }
-                        } catch (NumberFormatException e) {
-                        }
-                        if (codeStr != null) {
-                            andCode = Boolean.parseBoolean(codeStr);
-                        }
-                        addPackageToCleanLPw(new PackageCleanItem(userId, name, andCode));
-                    }
                 } else if (tagName.equals("renamed-package")) {
                     String nname = parser.getAttributeValue(null, "new");
                     String oname = parser.getAttributeValue(null, "old");