diff options
author | Chester Hsieh <dunno@google.com> | 2020-02-07 04:33:54 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-02-07 04:33:54 +0000 |
commit | c997463eb73d653b3dfa76278ed3bd1edddeec3a (patch) | |
tree | 304f4d4e7d5140d7ed2998aa9e20b02b934eab0f | |
parent | 1f0cb0acad8faedc239e27293ff0f39a2aaa332a (diff) | |
parent | 750b5ed85cfd2c8598634ca96a75aba115130e13 (diff) |
Merge "Allow test builds to optionally skip verification"
5 files changed, 57 insertions, 26 deletions
diff --git a/core/java/android/content/pm/PackageInfoLite.java b/core/java/android/content/pm/PackageInfoLite.java index 6743a3f86944..9735f8157a57 100644 --- a/core/java/android/content/pm/PackageInfoLite.java +++ b/core/java/android/content/pm/PackageInfoLite.java @@ -74,6 +74,11 @@ public class PackageInfoLite implements Parcelable { public boolean multiArch; /** + * The android:debuggable flag from the package manifest. + */ + public boolean debuggable; + + /** * Specifies the recommended install location. Can be one of * {@link PackageHelper#RECOMMEND_INSTALL_INTERNAL} to install on internal storage, * {@link PackageHelper#RECOMMEND_INSTALL_EXTERNAL} to install on external media, @@ -108,6 +113,7 @@ public class PackageInfoLite implements Parcelable { dest.writeInt(recommendedInstallLocation); dest.writeInt(installLocation); dest.writeInt(multiArch ? 1 : 0); + dest.writeInt(debuggable ? 1 : 0); if (verifiers == null || verifiers.length == 0) { dest.writeInt(0); @@ -139,6 +145,7 @@ public class PackageInfoLite implements Parcelable { recommendedInstallLocation = source.readInt(); installLocation = source.readInt(); multiArch = (source.readInt() != 0); + debuggable = (source.readInt() != 0); final int verifiersLength = source.readInt(); if (verifiersLength == 0) { diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 9116c4032ad5..33ef2d43d720 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -129,6 +129,13 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements /** Upper bound on number of historical sessions for a UID */ private static final long MAX_HISTORICAL_SESSIONS = 1048576; + /** + * Allow verification-skipping if it's a development app installed through ADB with + * disable verification flag specified. + */ + private static final int ADB_DEV_MODE = PackageManager.INSTALL_FROM_ADB + | PackageManager.INSTALL_ALLOW_TEST; + private final Context mContext; private final PackageManagerService mPm; private final ApexManager mApexManager; @@ -531,8 +538,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements params.installFlags &= ~PackageManager.INSTALL_REQUEST_DOWNGRADE; } - if (callingUid != Process.SYSTEM_UID) { - // Only system_server can use INSTALL_DISABLE_VERIFICATION. + if (callingUid != Process.SYSTEM_UID + && (params.installFlags & ADB_DEV_MODE) != ADB_DEV_MODE) { + // Only system_server or tools under specific conditions (test app installed + // through ADB, and verification disabled flag specified) can disable verification. params.installFlags &= ~PackageManager.INSTALL_DISABLE_VERIFICATION; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index c85859072d89..42b24839a36b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -13350,42 +13350,53 @@ public class PackageManagerService extends IPackageManager.Stub * * @return true if verification should be performed */ - private boolean isVerificationEnabled(int userId, int installFlags, int installerUid) { + private boolean isVerificationEnabled( + PackageInfoLite pkgInfoLite, int userId, int installFlags, int installerUid) { if (!DEFAULT_VERIFY_ENABLE) { return false; } - if ((installFlags & PackageManager.INSTALL_DISABLE_VERIFICATION) != 0) { - return false; - } - // Check if installing from ADB if ((installFlags & PackageManager.INSTALL_FROM_ADB) != 0) { if (isUserRestricted(userId, UserManager.ENSURE_VERIFY_APPS)) { return true; } - // Check if the developer does not want package verification for ADB installs + // Check if the developer wants to skip verification for ADB installs + if ((installFlags & PackageManager.INSTALL_DISABLE_VERIFICATION) != 0) { + synchronized (mLock) { + if (mSettings.mPackages.get(pkgInfoLite.packageName) == null) { + // Always verify fresh install + return true; + } + } + // Only skip when apk is debuggable + return !pkgInfoLite.debuggable; + } return Global.getInt(mContext.getContentResolver(), Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0; - } else { - // only when not installed from ADB, skip verification for instant apps when - // the installer and verifier are the same. - if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { - if (mInstantAppInstallerActivity != null - && mInstantAppInstallerActivity.packageName.equals( - mRequiredVerifierPackage)) { - try { - mInjector.getAppOpsManager() - .checkPackage(installerUid, mRequiredVerifierPackage); - if (DEBUG_VERIFY) { - Slog.i(TAG, "disable verification for instant app"); - } - return false; - } catch (SecurityException ignore) { } - } + } + + if ((installFlags & PackageManager.INSTALL_DISABLE_VERIFICATION) != 0) { + return false; + } + + // only when not installed from ADB, skip verification for instant apps when + // the installer and verifier are the same. + if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { + if (mInstantAppInstallerActivity != null + && mInstantAppInstallerActivity.packageName.equals( + mRequiredVerifierPackage)) { + try { + mInjector.getAppOpsManager() + .checkPackage(installerUid, mRequiredVerifierPackage); + if (DEBUG_VERIFY) { + Slog.i(TAG, "disable verification for instant app"); + } + return false; + } catch (SecurityException ignore) { } } - return true; } + return true; } /** @@ -14549,7 +14560,7 @@ public class PackageManagerService extends IPackageManager.Stub verificationInfo == null ? -1 : verificationInfo.installerUid; if (!origin.existing && requiredUid != -1 && isVerificationEnabled( - verifierUser.getIdentifier(), installFlags, installerUid)) { + pkgLite, verifierUser.getIdentifier(), installFlags, installerUid)) { final Intent verification = new Intent( Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); verification.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 71a5545c4131..9395c972f04a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -794,6 +794,7 @@ public class PackageManagerServiceUtils { ret.verifiers = pkg.verifiers; ret.recommendedInstallLocation = recommendedInstallLocation; ret.multiArch = pkg.multiArch; + ret.debuggable = pkg.debuggable; return ret; } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index bb69680fb9f9..cb9404397f3d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -2757,6 +2757,9 @@ class PackageManagerShellCommand extends ShellCommand { case "--no-wait": params.mWaitForStagedSessionReady = false; break; + case "--skip-verification": + sessionParams.installFlags |= PackageManager.INSTALL_DISABLE_VERIFICATION; + break; default: throw new IllegalArgumentException("Unknown option " + opt); } |