From 474f20ba0ba3e7768d9abdcb5f3057ad73c02dbf Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Fri, 4 Nov 2022 17:41:48 +0800 Subject: [PATCH] Use ApplicationInfo.isSignedWithPlatformKey() To check whether an app is signed with platform key, instead of loading the system signature. And we also no longer need to load the PackageInfos with the deprecated flag PackageManager.GET_SIGNATURES. Bug: 235727273 Test: Manually with Settings App Change-Id: I8af59268c48d50dd0c98fa6fc98b1c82727762cc --- .../src/com/android/settingslib/Utils.java | 48 +++++++------------ 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java index a822e185479a7..edaa0fb5de4ff 100644 --- a/packages/SettingsLib/src/com/android/settingslib/Utils.java +++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java @@ -10,8 +10,6 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.Signature; import android.content.pm.UserInfo; import android.content.res.ColorStateList; import android.content.res.Resources; @@ -62,7 +60,6 @@ public class Utils { static final String STORAGE_MANAGER_ENABLED_PROPERTY = "ro.storage_manager.enabled"; - private static Signature[] sSystemSignature; private static String sPermissionControllerPackageName; private static String sServicesSystemSharedLibPackageName; private static String sSharedSystemSharedLibPackageName; @@ -373,14 +370,22 @@ public class Utils { return new ColorMatrixColorFilter(getAlphaInvariantColorMatrixForColor(color)); } + /** + * @deprecated Use {@link #isSystemPackage(Resources, PackageManager, ApplicationInfo)} instead. + */ + @Deprecated + public static boolean isSystemPackage(Resources resources, PackageManager pm, PackageInfo pkg) { + return pkg.applicationInfo != null && isSystemPackage(resources, pm, pkg.applicationInfo); + } + /** * Determine whether a package is a "system package", in which case certain things (like * disabling notifications or disabling the package altogether) should be disallowed. + * + * Note: This function is just for UI treatment, and should not be used for security purposes. */ - public static boolean isSystemPackage(Resources resources, PackageManager pm, PackageInfo pkg) { - if (sSystemSignature == null) { - sSystemSignature = new Signature[]{getSystemSignature(pm)}; - } + public static boolean isSystemPackage( + Resources resources, PackageManager pm, @NonNull ApplicationInfo app) { if (sPermissionControllerPackageName == null) { sPermissionControllerPackageName = pm.getPermissionControllerPackageName(); } @@ -390,29 +395,12 @@ public class Utils { if (sSharedSystemSharedLibPackageName == null) { sSharedSystemSharedLibPackageName = pm.getSharedSystemSharedLibraryPackageName(); } - return (sSystemSignature[0] != null - && sSystemSignature[0].equals(getFirstSignature(pkg))) - || pkg.packageName.equals(sPermissionControllerPackageName) - || pkg.packageName.equals(sServicesSystemSharedLibPackageName) - || pkg.packageName.equals(sSharedSystemSharedLibPackageName) - || pkg.packageName.equals(PrintManager.PRINT_SPOOLER_PACKAGE_NAME) - || isDeviceProvisioningPackage(resources, pkg.packageName); - } - - private static Signature getFirstSignature(PackageInfo pkg) { - if (pkg != null && pkg.signatures != null && pkg.signatures.length > 0) { - return pkg.signatures[0]; - } - return null; - } - - private static Signature getSystemSignature(PackageManager pm) { - try { - final PackageInfo sys = pm.getPackageInfo("android", PackageManager.GET_SIGNATURES); - return getFirstSignature(sys); - } catch (NameNotFoundException e) { - } - return null; + return app.isSignedWithPlatformKey() + || app.packageName.equals(sPermissionControllerPackageName) + || app.packageName.equals(sServicesSystemSharedLibPackageName) + || app.packageName.equals(sSharedSystemSharedLibPackageName) + || app.packageName.equals(PrintManager.PRINT_SPOOLER_PACKAGE_NAME) + || isDeviceProvisioningPackage(resources, app.packageName); } /**