From 92dbd38d184cf2a867160cb4b134729e07edae97 Mon Sep 17 00:00:00 2001 From: Julius D'souza Date: Fri, 27 Sep 2019 15:10:32 -0700 Subject: [PATCH] Add SYNCHRONOUS to EnabledFlags for PackageManager SYNCHRONOUS is a flag for setComponentEnabledSetting() which will serialise the given user's package restrictions state (including enabled + disabled packages) after the specified component state has been updated. Test: manual Bug: 130044763 Change-Id: I615e5af6361718b5f3c355ca4424d1f8c4fb078f Signed-off-by: Julius D'souza --- api/current.txt | 1 + .../android/content/pm/PackageManager.java | 13 ++++++++++-- .../server/pm/PackageManagerService.java | 21 +++++++++++++------ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/api/current.txt b/api/current.txt index 26b18e330d7bf..17913b279f87c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11908,6 +11908,7 @@ package android.content.pm { field public static final int SIGNATURE_NO_MATCH = -3; // 0xfffffffd field public static final int SIGNATURE_SECOND_NOT_SIGNED = -2; // 0xfffffffe field public static final int SIGNATURE_UNKNOWN_PACKAGE = -4; // 0xfffffffc + field public static final int SYNCHRONOUS = 2; // 0x2 field public static final int VERIFICATION_ALLOW = 1; // 0x1 field public static final int VERIFICATION_REJECT = -1; // 0xffffffff field public static final int VERSION_CODE_HIGHEST = -1; // 0xffffffff diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index fafb56d20ba08..fd14d235a0445 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -917,8 +917,9 @@ public abstract class PackageManager { public static final int INSTALL_DRY_RUN = 0x00800000; /** @hide */ - @IntDef(flag = true, prefix = { "DONT_KILL_APP" }, value = { - DONT_KILL_APP + @IntDef(flag = true, value = { + DONT_KILL_APP, + SYNCHRONOUS }) @Retention(RetentionPolicy.SOURCE) public @interface EnabledFlags {} @@ -931,6 +932,14 @@ public abstract class PackageManager { */ public static final int DONT_KILL_APP = 0x00000001; + /** + * Flag parameter for + * {@link #setComponentEnabledSetting(android.content.ComponentName, int, int)} to indicate + * that the given user's package restrictions state will be serialised to disk after the + * component state has been updated. + */ + public static final int SYNCHRONOUS = 0x00000002; + /** @hide */ @IntDef(prefix = { "INSTALL_REASON_" }, value = { INSTALL_REASON_UNKNOWN, diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5bf484b4ba1f6..76c49081c49cc 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -19980,7 +19980,11 @@ public class PackageManagerService extends IPackageManager.Stub } } synchronized (mLock) { - scheduleWritePackageRestrictionsLocked(userId); + if ((flags & PackageManager.SYNCHRONOUS) != 0) { + flushPackageRestrictionsAsUserInternalLocked(userId); + } else { + scheduleWritePackageRestrictionsLocked(userId); + } updateSequenceNumberLP(pkgSetting, new int[] { userId }); final long callingId = Binder.clearCallingIdentity(); try { @@ -20041,11 +20045,16 @@ public class PackageManagerService extends IPackageManager.Stub mPermissionManager.enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission*/, false /* checkShell */, "flushPackageRestrictions"); synchronized (mLock) { - mSettings.writePackageRestrictionsLPr(userId); - mDirtyUsers.remove(userId); - if (mDirtyUsers.isEmpty()) { - mHandler.removeMessages(WRITE_PACKAGE_RESTRICTIONS); - } + flushPackageRestrictionsAsUserInternalLocked(userId); + } + } + + @GuardedBy("mLock") + private void flushPackageRestrictionsAsUserInternalLocked(int userId) { + mSettings.writePackageRestrictionsLPr(userId); + mDirtyUsers.remove(userId); + if (mDirtyUsers.isEmpty()) { + mHandler.removeMessages(WRITE_PACKAGE_RESTRICTIONS); } }