Loading core/java/android/app/ActivityManagerInternal.java +3 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import android.content.pm.UserInfo; import android.os.Bundle; import android.os.IBinder; import android.os.TransactionTooLargeException; import android.view.RemoteAnimationAdapter; import java.util.ArrayList; import java.util.List; Loading Loading @@ -356,4 +355,7 @@ public abstract class ActivityManagerInternal { * Unregisters the specified {@code processObserver}. */ public abstract void unregisterProcessObserver(IProcessObserver processObserver); /** Returns true if the given UID is registered as an active instrumentation. */ public abstract boolean isActiveInstrumentation(int uid); } core/java/android/content/pm/PackageManagerInternal.java +12 −0 Original line number Diff line number Diff line Loading @@ -999,4 +999,16 @@ public abstract class PackageManagerInternal { * Migrates legacy obb data to its new location. */ public abstract void migrateLegacyObbData(); /** * Ensures that we block deletion of unused packages on user removal. This is purely for the * purpose of ensuring that b/141413692 is not reproducible on Q. */ public abstract void notifyingOnNextUserRemovalForTest(); /** * Notifies PackageManager of the removal of a user. This is purely for the purpose of ensuring * that b/141413692 is not reproducible on Q. */ public abstract void userRemovedForTest(); } core/java/android/os/IUserManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -104,4 +104,5 @@ interface IUserManager { String getUserName(); long getUserStartRealtime(); long getUserUnlockRealtime(); void notifyOnNextUserRemoveForTest(); } services/core/java/com/android/server/am/ActivityManagerService.java +21 −1 Original line number Diff line number Diff line Loading @@ -271,8 +271,8 @@ import android.os.WorkSource; import android.os.storage.IStorageManager; import android.os.storage.StorageManager; import android.provider.DeviceConfig; import android.provider.Settings; import android.provider.DeviceConfig.Properties; import android.provider.Settings; import android.server.ServerProtoEnums; import android.sysprop.VoldProperties; import android.text.TextUtils; Loading Loading @@ -8256,6 +8256,21 @@ public class ActivityManagerService extends IActivityManager.Stub } } private boolean isActiveInstrumentation(int uid) { synchronized (ActivityManagerService.this) { for (int i = mActiveInstrumentation.size() - 1; i >= 0; i--) { final ActiveInstrumentation instrumentation = mActiveInstrumentation.get(i); for (int j = instrumentation.mRunningProcesses.size() - 1; j >= 0; j--) { final ProcessRecord process = instrumentation.mRunningProcesses.get(j); if (process.uid == uid) { return true; } } } } return false; } @Override public int getUidProcessState(int uid, String callingPackage) { if (!hasUsageStatsPermission(callingPackage)) { Loading Loading @@ -18507,6 +18522,11 @@ public class ActivityManagerService extends IActivityManager.Stub public void unregisterProcessObserver(IProcessObserver processObserver) { ActivityManagerService.this.unregisterProcessObserver(processObserver); } @Override public boolean isActiveInstrumentation(int uid) { return ActivityManagerService.this.isActiveInstrumentation(uid); } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) { services/core/java/com/android/server/pm/PackageManagerService.java +20 −2 Original line number Diff line number Diff line Loading @@ -208,6 +208,7 @@ import android.os.AsyncTask; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.ConditionVariable; import android.os.Debug; import android.os.Environment; import android.os.FileUtils; Loading Loading @@ -978,6 +979,8 @@ public class PackageManagerService extends IPackageManager.Stub private Future<?> mPrepareAppDataFuture; private final ConditionVariable mBlockDeleteOnUserRemoveForTest = new ConditionVariable(true); private static class IFVerificationParams { PackageParser.Package pkg; boolean replacing; Loading Loading @@ -23652,8 +23655,13 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " Removing package " + packageName); } //end run mHandler.post(() -> deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST, userHandle, 0)); mHandler.post(() -> { if (!mBlockDeleteOnUserRemoveForTest.block(30000 /* 30 seconds*/)) { mBlockDeleteOnUserRemoveForTest.open(); } deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST, userHandle, 0); }); } } } Loading Loading @@ -25008,6 +25016,16 @@ public class PackageManagerService extends IPackageManager.Stub Slog.wtf(TAG, e); } } @Override public void notifyingOnNextUserRemovalForTest() { mBlockDeleteOnUserRemoveForTest.close(); } @Override public void userRemovedForTest() { mBlockDeleteOnUserRemoveForTest.open(); } } @GuardedBy("mPackages") Loading
core/java/android/app/ActivityManagerInternal.java +3 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import android.content.pm.UserInfo; import android.os.Bundle; import android.os.IBinder; import android.os.TransactionTooLargeException; import android.view.RemoteAnimationAdapter; import java.util.ArrayList; import java.util.List; Loading Loading @@ -356,4 +355,7 @@ public abstract class ActivityManagerInternal { * Unregisters the specified {@code processObserver}. */ public abstract void unregisterProcessObserver(IProcessObserver processObserver); /** Returns true if the given UID is registered as an active instrumentation. */ public abstract boolean isActiveInstrumentation(int uid); }
core/java/android/content/pm/PackageManagerInternal.java +12 −0 Original line number Diff line number Diff line Loading @@ -999,4 +999,16 @@ public abstract class PackageManagerInternal { * Migrates legacy obb data to its new location. */ public abstract void migrateLegacyObbData(); /** * Ensures that we block deletion of unused packages on user removal. This is purely for the * purpose of ensuring that b/141413692 is not reproducible on Q. */ public abstract void notifyingOnNextUserRemovalForTest(); /** * Notifies PackageManager of the removal of a user. This is purely for the purpose of ensuring * that b/141413692 is not reproducible on Q. */ public abstract void userRemovedForTest(); }
core/java/android/os/IUserManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -104,4 +104,5 @@ interface IUserManager { String getUserName(); long getUserStartRealtime(); long getUserUnlockRealtime(); void notifyOnNextUserRemoveForTest(); }
services/core/java/com/android/server/am/ActivityManagerService.java +21 −1 Original line number Diff line number Diff line Loading @@ -271,8 +271,8 @@ import android.os.WorkSource; import android.os.storage.IStorageManager; import android.os.storage.StorageManager; import android.provider.DeviceConfig; import android.provider.Settings; import android.provider.DeviceConfig.Properties; import android.provider.Settings; import android.server.ServerProtoEnums; import android.sysprop.VoldProperties; import android.text.TextUtils; Loading Loading @@ -8256,6 +8256,21 @@ public class ActivityManagerService extends IActivityManager.Stub } } private boolean isActiveInstrumentation(int uid) { synchronized (ActivityManagerService.this) { for (int i = mActiveInstrumentation.size() - 1; i >= 0; i--) { final ActiveInstrumentation instrumentation = mActiveInstrumentation.get(i); for (int j = instrumentation.mRunningProcesses.size() - 1; j >= 0; j--) { final ProcessRecord process = instrumentation.mRunningProcesses.get(j); if (process.uid == uid) { return true; } } } } return false; } @Override public int getUidProcessState(int uid, String callingPackage) { if (!hasUsageStatsPermission(callingPackage)) { Loading Loading @@ -18507,6 +18522,11 @@ public class ActivityManagerService extends IActivityManager.Stub public void unregisterProcessObserver(IProcessObserver processObserver) { ActivityManagerService.this.unregisterProcessObserver(processObserver); } @Override public boolean isActiveInstrumentation(int uid) { return ActivityManagerService.this.isActiveInstrumentation(uid); } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) {
services/core/java/com/android/server/pm/PackageManagerService.java +20 −2 Original line number Diff line number Diff line Loading @@ -208,6 +208,7 @@ import android.os.AsyncTask; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.ConditionVariable; import android.os.Debug; import android.os.Environment; import android.os.FileUtils; Loading Loading @@ -978,6 +979,8 @@ public class PackageManagerService extends IPackageManager.Stub private Future<?> mPrepareAppDataFuture; private final ConditionVariable mBlockDeleteOnUserRemoveForTest = new ConditionVariable(true); private static class IFVerificationParams { PackageParser.Package pkg; boolean replacing; Loading Loading @@ -23652,8 +23655,13 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " Removing package " + packageName); } //end run mHandler.post(() -> deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST, userHandle, 0)); mHandler.post(() -> { if (!mBlockDeleteOnUserRemoveForTest.block(30000 /* 30 seconds*/)) { mBlockDeleteOnUserRemoveForTest.open(); } deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST, userHandle, 0); }); } } } Loading Loading @@ -25008,6 +25016,16 @@ public class PackageManagerService extends IPackageManager.Stub Slog.wtf(TAG, e); } } @Override public void notifyingOnNextUserRemovalForTest() { mBlockDeleteOnUserRemoveForTest.close(); } @Override public void userRemovedForTest() { mBlockDeleteOnUserRemoveForTest.open(); } } @GuardedBy("mPackages")