From cff8f0f4e7c1e0bbf2a5a5451db70d0e047e2560 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Tue, 27 Mar 2018 12:51:51 -0700 Subject: [PATCH] Use package manager stock flags to pull lib info In several places activity manager components were not using the stock package manager flags and as a result were not pulling the libraries on which the app depended. This leads to subtle cases were the dependent libs are not present on the classpath resulting in app crashes. This is a manual merge of I33cb4464599dd8c1b68f64eb3bb7c470bf27ab97 from o-wear-dev Test: Tried to repro original issue Bug: 73760062 Change-Id: Ia5c9236b330a8595c2c23b39aa73f0a07a277154 --- .../com/android/server/am/ActivityManagerService.java | 8 ++++---- .../core/java/com/android/server/am/ActivityRecord.java | 8 +++++++- .../core/java/com/android/server/am/ActivityStack.java | 5 +++-- .../com/android/server/am/ActivityStartController.java | 7 ++++--- services/core/java/com/android/server/am/RecentTasks.java | 3 ++- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5131a93503f5b..3f6d054a87e8b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -10601,8 +10601,8 @@ public class ActivityManagerService extends IActivityManager.Stub intent.addFlags(Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS); } } - final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp, 0, - UserHandle.getUserId(callingUid)); + final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp, + STOCK_PM_FLAGS, UserHandle.getUserId(callingUid)); if (ainfo.applicationInfo.uid != callingUid) { throw new SecurityException( "Can't add task for another application: target uid=" @@ -21190,7 +21190,7 @@ public class ActivityManagerService extends IActivityManager.Stub ApplicationInfo aInfo = null; try { aInfo = AppGlobals.getPackageManager() - .getApplicationInfo(ssp, 0 /*flags*/, userId); + .getApplicationInfo(ssp, STOCK_PM_FLAGS, userId); } catch (RemoteException ignore) {} if (aInfo == null) { Slog.w(TAG, "Dropping ACTION_PACKAGE_REPLACED for non-existent pkg:" @@ -21215,7 +21215,7 @@ public class ActivityManagerService extends IActivityManager.Stub try { ApplicationInfo ai = AppGlobals.getPackageManager(). - getApplicationInfo(ssp, 0, 0); + getApplicationInfo(ssp, STOCK_PM_FLAGS, 0); mBatteryStatsService.notePackageInstalled(ssp, ai != null ? ai.versionCode : 0); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index ccc17a3b1d0e0..1af4114441c36 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -236,7 +236,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo final IApplicationToken.Stub appToken; // window manager token AppWindowContainerController mWindowContainerController; final ActivityInfo info; // all about me - final ApplicationInfo appInfo; // information about activity's app + // TODO: This is duplicated state already contained in info.applicationInfo - remove + ApplicationInfo appInfo; // information about activity's app final int launchedFromPid; // always the pid who started the activity. final int launchedFromUid; // always the uid who started the activity. final String launchedFromPackage; // always the package who started the activity. @@ -605,6 +606,11 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } } + void updateApplicationInfo(ApplicationInfo aInfo) { + appInfo = aInfo; + info.applicationInfo = aInfo; + } + private boolean crossesHorizontalSizeThreshold(int firstDp, int secondDp) { return crossesSizeThreshold(mHorizontalSizeConfigurations, firstDp, secondDp); } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index aa462ec7ca895..e5ca098d0b6c1 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1324,7 +1324,7 @@ class ActivityStack extends ConfigurationContai final ActivityRecord ar = activities.get(activityNdx); if ((userId == ar.userId) && packageName.equals(ar.packageName)) { - ar.info.applicationInfo = aInfo; + ar.updateApplicationInfo(aInfo); } } } @@ -3987,7 +3987,8 @@ class ActivityStack extends ConfigurationContai } else { try { ActivityInfo aInfo = AppGlobals.getPackageManager().getActivityInfo( - destIntent.getComponent(), 0, srec.userId); + destIntent.getComponent(), ActivityManagerService.STOCK_PM_FLAGS, + srec.userId); // TODO(b/64750076): Check if calling pid should really be -1. final int res = mService.getActivityStartController() .obtainStarter(destIntent, "navigateUpTo") diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java index 868f90df5c1bb..fb78838cfc9e5 100644 --- a/services/core/java/com/android/server/am/ActivityStartController.java +++ b/services/core/java/com/android/server/am/ActivityStartController.java @@ -198,9 +198,10 @@ public class ActivityStartController { // See if we should be showing the platform update setup UI. final Intent intent = new Intent(Intent.ACTION_UPGRADE_SETUP); - final List ris = mService.mContext.getPackageManager() - .queryIntentActivities(intent, - PackageManager.MATCH_SYSTEM_ONLY | PackageManager.GET_META_DATA); + final List ris = + mService.mContext.getPackageManager().queryIntentActivities(intent, + PackageManager.MATCH_SYSTEM_ONLY | PackageManager.GET_META_DATA + | ActivityManagerService.STOCK_PM_FLAGS); if (!ris.isEmpty()) { final ResolveInfo ri = ris.get(0); String vers = ri.activityInfo.metaData != null diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java index efd8153832004..fcf00ce79ea91 100644 --- a/services/core/java/com/android/server/am/RecentTasks.java +++ b/services/core/java/com/android/server/am/RecentTasks.java @@ -600,7 +600,8 @@ class RecentTasks { // activities that are fully runnable based on // current system state. ai = pm.getActivityInfo(task.realActivity, - PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId); + PackageManager.MATCH_DEBUG_TRIAGED_MISSING + | ActivityManagerService.STOCK_PM_FLAGS, userId); } catch (RemoteException e) { // Will never happen. continue;