From e9c83eae3c6c2db5866053adc060725959fa0a2c Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Tue, 18 Jul 2023 16:33:32 -0700 Subject: [PATCH] [pm] do not stop system apps with disabled a launcher activity If an app has a disabled/unexported launcher activity, it is effectively the same as not having a launcher activity. We should not stop such system apps by default. BUG: 286459841 Test: manual with a system app that has disabled launcher activity and verify that it is in the `stopped=false` state after first boot Test: also tested updating such a system app and verified that it remains in the un-stopped state after the update is uninstalled Merged-In: Ie865aba7325e3442c6610ef962fce3a3a65f0b70 Change-Id: Ie865aba7325e3442c6610ef962fce3a3a65f0b70 (cherry picked from commit a1c1f2e29f0fbb6f7ea61db445906c4bfc5e4f33) --- .../java/com/android/server/pm/InstallPackageHelper.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 2b55a612a7ad9..fbd54555dbbf1 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -4300,7 +4300,8 @@ final class InstallPackageHelper { // - It's an APEX or overlay package since stopped state does not affect them. // - It is enumerated with a tag having the stopped attribute // set to false - // - It doesn't have a launcher entry which means the user doesn't have a way to unstop it + // - It doesn't have an enabled and exported launcher activity, which means the user + // wouldn't have a way to un-stop it final boolean isApexPkg = (scanFlags & SCAN_AS_APEX) != 0; if (mPm.mShouldStopSystemPackagesByDefault && scanSystemPartition @@ -4326,7 +4327,11 @@ final class InstallPackageHelper { categories.add(Intent.CATEGORY_LAUNCHER); final List activities = parsedPackage.getActivities(); for (int indexActivity = 0; indexActivity < activities.size(); indexActivity++) { - final List intents = activities.get(indexActivity).getIntents(); + final ParsedActivity activity = activities.get(indexActivity); + if (!activity.isEnabled() || !activity.isExported()) { + continue; + } + final List intents = activity.getIntents(); for (int indexIntent = 0; indexIntent < intents.size(); indexIntent++) { final IntentFilter intentFilter = intents.get(indexIntent).getIntentFilter(); if (intentFilter != null && intentFilter.matchCategories(categories) == null) {