[pm] skip required verifier if it's disabled

No point in waiting for the timeout if we know it's disabled.

Added warning message:
08-03 18:11:01.172  1713  1992 W PackageManager: Required verifier: com.android.vending is disabled

BUG: 238174982
Test: manual with `adb shell pm disable com.android.vending`
Change-Id: I8ecbdebeb16b444d18f5204cc99f6056c09646af
This commit is contained in:
Songchun Fan
2022-08-03 18:11:48 -07:00
parent 723ce1431b
commit 283347aa0f
3 changed files with 44 additions and 6 deletions

View File

@@ -500,6 +500,13 @@ public interface Computer extends PackageDataSnapshot {
boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo,
@UserIdInt int userId);
/**
* @return true if the runtime app user enabled state and the install-time app manifest enabled
* state are both effectively enabled for the given app. Or if the app cannot be found,
* returns false.
*/
boolean isApplicationEffectivelyEnabled(@NonNull String packageName, @UserIdInt int userId);
@Nullable
KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias);

View File

@@ -5412,6 +5412,26 @@ public class ComputerEngine implements Computer {
}
}
@Override
public boolean isApplicationEffectivelyEnabled(@NonNull String packageName,
@UserIdInt int userId) {
try {
int appEnabledSetting = mSettings.getApplicationEnabledSetting(packageName, userId);
if (appEnabledSetting == COMPONENT_ENABLED_STATE_DEFAULT) {
final AndroidPackage pkg = getPackage(packageName);
if (pkg == null) {
// Should not happen because getApplicationEnabledSetting would have thrown
return false;
}
return pkg.isEnabled();
} else {
return appEnabledSetting == COMPONENT_ENABLED_STATE_ENABLED;
}
} catch (PackageManager.NameNotFoundException ignored) {
return false;
}
}
@Nullable
@Override
public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {

View File

@@ -25,6 +25,7 @@ import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
import static android.content.pm.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V4;
import static android.os.PowerWhitelistManager.REASON_PACKAGE_VERIFIER;
import static android.os.PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
import static android.os.Process.SYSTEM_UID;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import static com.android.server.pm.PackageManagerService.CHECK_PENDING_INTEGRITY_VERIFICATION;
@@ -77,6 +78,7 @@ import com.android.server.sdksandbox.SdkSandboxManagerLocal;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
final class VerifyingSession {
@@ -353,7 +355,7 @@ final class VerifyingSession {
}
final int verifierUserId = verifierUser.getIdentifier();
String[] requiredVerifierPackages = mPm.mRequiredVerifierPackages;
List<String> requiredVerifierPackages = Arrays.asList(mPm.mRequiredVerifierPackages);
boolean requiredVerifierPackagesOverridden = false;
// Allow verifier override for ADB installations which could already be unverified using
@@ -377,8 +379,7 @@ final class VerifyingSession {
// are not adding a new way to disable verifications.
if (!isAdbVerificationEnabled(pkgLite, verifierUserId,
requestedDisableVerification)) {
requiredVerifierPackages = adbVerifierOverridePackages.toArray(
new String[adbVerifierOverridePackages.size()]);
requiredVerifierPackages = adbVerifierOverridePackages;
requiredVerifierPackagesOverridden = true;
}
}
@@ -397,6 +398,16 @@ final class VerifyingSession {
*/
final Computer snapshot = mPm.snapshotComputer();
final int numRequiredVerifierPackages = requiredVerifierPackages.size();
for (int i = numRequiredVerifierPackages - 1; i >= 0; i--) {
if (!snapshot.isApplicationEffectivelyEnabled(requiredVerifierPackages.get(i),
SYSTEM_UID)) {
Slog.w(TAG,
"Required verifier: " + requiredVerifierPackages.get(i) + " is disabled");
requiredVerifierPackages.remove(i);
}
}
for (String requiredVerifierPackage : requiredVerifierPackages) {
final int requiredUid = snapshot.getPackageUid(requiredVerifierPackage,
MATCH_DEBUG_TRIAGED_MISSING, verifierUserId);
@@ -514,7 +525,7 @@ final class VerifyingSession {
}
}
if (requiredVerifierPackages.length == 0) {
if (requiredVerifierPackages.size() == 0) {
Slog.e(TAG, "No required verifiers");
return;
}
@@ -532,7 +543,7 @@ final class VerifyingSession {
final Intent requiredIntent;
final String receiverPermission;
if (!requiredVerifierPackagesOverridden || requiredVerifierPackages.length == 1) {
if (!requiredVerifierPackagesOverridden || requiredVerifierPackages.size() == 1) {
// Prod code OR test code+single verifier.
requiredIntent = new Intent(verification);
if (!requiredVerifierPackagesOverridden) {
@@ -657,7 +668,7 @@ final class VerifyingSession {
* @return true if verification should be performed
*/
private boolean isVerificationEnabled(PackageInfoLite pkgInfoLite, int userId,
String[] requiredVerifierPackages) {
List<String> requiredVerifierPackages) {
if (!DEFAULT_VERIFY_ENABLE) {
return false;
}