Split isEssentialPackage() from isSystemPackage()

Please use ApplicationInfo#isSignedWithPlatformKey() to check whether an
app is signed with platform key, instead of loading the signatures.

This is faster, and we also no longer need to load the PackageInfos with
the deprecated flag PackageManager.GET_SIGNATURES.

Bug: 235727273
Test: Unit test
Test: Manually with Settings App
Change-Id: I4d3c103559736b725517acef9bbca6a2c9d62ed6
This commit is contained in:
Chaohui Wang
2022-11-18 13:44:06 +08:00
parent a510d931ac
commit f28754ebff

View File

@@ -376,27 +376,19 @@ public class Utils {
/**
* Determine whether a package is a "system package", in which case certain things (like
* disabling notifications or disabling the package altogether) should be disallowed.
* <p>
* Note: This function is just for UI treatment, and should not be used for security purposes.
*
* @deprecated Use {@link ApplicationInfo#isSignedWithPlatformKey()} and
* {@link #isEssentialPackage} instead.
*/
@Deprecated
public static boolean isSystemPackage(Resources resources, PackageManager pm, PackageInfo pkg) {
if (sSystemSignature == null) {
sSystemSignature = new Signature[]{getSystemSignature(pm)};
}
if (sPermissionControllerPackageName == null) {
sPermissionControllerPackageName = pm.getPermissionControllerPackageName();
}
if (sServicesSystemSharedLibPackageName == null) {
sServicesSystemSharedLibPackageName = pm.getServicesSystemSharedLibraryPackageName();
}
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);
return (sSystemSignature[0] != null && sSystemSignature[0].equals(getFirstSignature(pkg)))
|| isEssentialPackage(resources, pm, pkg.packageName);
}
private static Signature getFirstSignature(PackageInfo pkg) {
@@ -415,6 +407,29 @@ public class Utils {
return null;
}
/**
* Determine whether a package is a "essential package".
* <p>
* In which case certain things (like disabling the package) should be disallowed.
*/
public static boolean isEssentialPackage(
Resources resources, PackageManager pm, String packageName) {
if (sPermissionControllerPackageName == null) {
sPermissionControllerPackageName = pm.getPermissionControllerPackageName();
}
if (sServicesSystemSharedLibPackageName == null) {
sServicesSystemSharedLibPackageName = pm.getServicesSystemSharedLibraryPackageName();
}
if (sSharedSystemSharedLibPackageName == null) {
sSharedSystemSharedLibPackageName = pm.getSharedSystemSharedLibraryPackageName();
}
return packageName.equals(sPermissionControllerPackageName)
|| packageName.equals(sServicesSystemSharedLibPackageName)
|| packageName.equals(sSharedSystemSharedLibPackageName)
|| packageName.equals(PrintManager.PRINT_SPOOLER_PACKAGE_NAME)
|| isDeviceProvisioningPackage(resources, packageName);
}
/**
* Returns {@code true} if the supplied package is the device provisioning app. Otherwise,
* returns {@code false}.