From df113c36a70474584bc9ef5bc1b3008a25fa86e0 Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Thu, 31 Aug 2017 16:10:29 -0700 Subject: [PATCH] Add internal implementation for notifyPackageUse We have checks that prevent applications from modifying the usage times of instant apps [and vice versa]. However, it's critical for internal components such as the ActivityManager to be able to upate this for all packages. Add an internal implementation of this method that skips the checks. Change-Id: Ib890296065024104cdaf7c8d64a5a7583d9062c1 Fixes: 65228752 Test: Manual. Run an application installed as an "instant app" and notice the usage time goes up --- .../content/pm/PackageManagerInternal.java | 5 +++++ .../server/am/ActivityManagerService.java | 6 ++---- .../server/pm/PackageManagerService.java | 21 ++++++++++++++----- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index e8bade9b2c94d..4c981cdb25114 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -378,4 +378,9 @@ public abstract class PackageManagerInternal { * associated with an instant app. It may be kept after the instant app has been uninstalled. */ public abstract boolean hasInstantApplicationMetadata(String packageName, int userId); + + /** + * Updates a package last used time. + */ + public abstract void notifyPackageUse(String packageName, int reason); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 9727092ed1be4..ea08b1d57fbf9 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3579,10 +3579,8 @@ public class ActivityManagerService extends IActivityManager.Stub } void notifyPackageUse(String packageName, int reason) { - IPackageManager pm = AppGlobals.getPackageManager(); - try { - pm.notifyPackageUse(packageName, reason); - } catch (RemoteException e) { + synchronized(this) { + getPackageManagerInternalLocked().notifyPackageUse(packageName, reason); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index bafcad4b775fa..20fb3501031a2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9844,14 +9844,18 @@ public class PackageManagerService extends IPackageManager.Stub return; } } - final PackageParser.Package p = mPackages.get(packageName); - if (p == null) { - return; - } - p.mLastPackageUsageTimeInMills[reason] = System.currentTimeMillis(); + notifyPackageUseLocked(packageName, reason); } } + private void notifyPackageUseLocked(String packageName, int reason) { + final PackageParser.Package p = mPackages.get(packageName); + if (p == null) { + return; + } + p.mLastPackageUsageTimeInMills[reason] = System.currentTimeMillis(); + } + @Override public void notifyDexLoad(String loadingPackageName, List classLoaderNames, List classPaths, String loaderIsa) { @@ -25502,6 +25506,13 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); return mInstantAppRegistry.hasInstantApplicationMetadataLPr(packageName, userId); } } + + @Override + public void notifyPackageUse(String packageName, int reason) { + synchronized (mPackages) { + PackageManagerService.this.notifyPackageUseLocked(packageName, reason); + } + } } @Override