Loading core/java/android/content/pm/PackageInfoLite.java +7 −0 Original line number Original line Diff line number Diff line Loading @@ -73,6 +73,11 @@ public class PackageInfoLite implements Parcelable { */ */ public boolean multiArch; public boolean multiArch; /** * The android:debuggable flag from the package manifest. */ public boolean debuggable; /** /** * Specifies the recommended install location. Can be one of * Specifies the recommended install location. Can be one of * {@link PackageHelper#RECOMMEND_INSTALL_INTERNAL} to install on internal storage, * {@link PackageHelper#RECOMMEND_INSTALL_INTERNAL} to install on internal storage, Loading Loading @@ -108,6 +113,7 @@ public class PackageInfoLite implements Parcelable { dest.writeInt(recommendedInstallLocation); dest.writeInt(recommendedInstallLocation); dest.writeInt(installLocation); dest.writeInt(installLocation); dest.writeInt(multiArch ? 1 : 0); dest.writeInt(multiArch ? 1 : 0); dest.writeInt(debuggable ? 1 : 0); if (verifiers == null || verifiers.length == 0) { if (verifiers == null || verifiers.length == 0) { dest.writeInt(0); dest.writeInt(0); Loading Loading @@ -139,6 +145,7 @@ public class PackageInfoLite implements Parcelable { recommendedInstallLocation = source.readInt(); recommendedInstallLocation = source.readInt(); installLocation = source.readInt(); installLocation = source.readInt(); multiArch = (source.readInt() != 0); multiArch = (source.readInt() != 0); debuggable = (source.readInt() != 0); final int verifiersLength = source.readInt(); final int verifiersLength = source.readInt(); if (verifiersLength == 0) { if (verifiersLength == 0) { Loading services/core/java/com/android/server/pm/PackageInstallerService.java +11 −2 Original line number Original line Diff line number Diff line Loading @@ -129,6 +129,13 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements /** Upper bound on number of historical sessions for a UID */ /** Upper bound on number of historical sessions for a UID */ private static final long MAX_HISTORICAL_SESSIONS = 1048576; 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 Context mContext; private final PackageManagerService mPm; private final PackageManagerService mPm; private final ApexManager mApexManager; private final ApexManager mApexManager; Loading Loading @@ -531,8 +538,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements params.installFlags &= ~PackageManager.INSTALL_REQUEST_DOWNGRADE; params.installFlags &= ~PackageManager.INSTALL_REQUEST_DOWNGRADE; } } if (callingUid != Process.SYSTEM_UID) { if (callingUid != Process.SYSTEM_UID // Only system_server can use INSTALL_DISABLE_VERIFICATION. && (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; params.installFlags &= ~PackageManager.INSTALL_DISABLE_VERIFICATION; } } Loading services/core/java/com/android/server/pm/PackageManagerService.java +35 −24 Original line number Original line Diff line number Diff line Loading @@ -13350,24 +13350,36 @@ public class PackageManagerService extends IPackageManager.Stub * * * @return true if verification should be performed * @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) { if (!DEFAULT_VERIFY_ENABLE) { return false; return false; } } if ((installFlags & PackageManager.INSTALL_DISABLE_VERIFICATION) != 0) { return false; } // Check if installing from ADB // Check if installing from ADB if ((installFlags & PackageManager.INSTALL_FROM_ADB) != 0) { if ((installFlags & PackageManager.INSTALL_FROM_ADB) != 0) { if (isUserRestricted(userId, UserManager.ENSURE_VERIFY_APPS)) { if (isUserRestricted(userId, UserManager.ENSURE_VERIFY_APPS)) { return true; 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(), return Global.getInt(mContext.getContentResolver(), Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0; Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0; } else { } if ((installFlags & PackageManager.INSTALL_DISABLE_VERIFICATION) != 0) { return false; } // only when not installed from ADB, skip verification for instant apps when // only when not installed from ADB, skip verification for instant apps when // the installer and verifier are the same. // the installer and verifier are the same. if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { Loading @@ -13386,7 +13398,6 @@ public class PackageManagerService extends IPackageManager.Stub } } return true; return true; } } } /** /** * Check whether or not integrity verification has been enabled. * Check whether or not integrity verification has been enabled. Loading Loading @@ -14549,7 +14560,7 @@ public class PackageManagerService extends IPackageManager.Stub verificationInfo == null ? -1 : verificationInfo.installerUid; verificationInfo == null ? -1 : verificationInfo.installerUid; if (!origin.existing && requiredUid != -1 if (!origin.existing && requiredUid != -1 && isVerificationEnabled( && isVerificationEnabled( verifierUser.getIdentifier(), installFlags, installerUid)) { pkgLite, verifierUser.getIdentifier(), installFlags, installerUid)) { final Intent verification = new Intent( final Intent verification = new Intent( Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); verification.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); verification.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -794,6 +794,7 @@ public class PackageManagerServiceUtils { ret.verifiers = pkg.verifiers; ret.verifiers = pkg.verifiers; ret.recommendedInstallLocation = recommendedInstallLocation; ret.recommendedInstallLocation = recommendedInstallLocation; ret.multiArch = pkg.multiArch; ret.multiArch = pkg.multiArch; ret.debuggable = pkg.debuggable; return ret; return ret; } } Loading services/core/java/com/android/server/pm/PackageManagerShellCommand.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -2757,6 +2757,9 @@ class PackageManagerShellCommand extends ShellCommand { case "--no-wait": case "--no-wait": params.mWaitForStagedSessionReady = false; params.mWaitForStagedSessionReady = false; break; break; case "--skip-verification": sessionParams.installFlags |= PackageManager.INSTALL_DISABLE_VERIFICATION; break; default: default: throw new IllegalArgumentException("Unknown option " + opt); throw new IllegalArgumentException("Unknown option " + opt); } } Loading Loading
core/java/android/content/pm/PackageInfoLite.java +7 −0 Original line number Original line Diff line number Diff line Loading @@ -73,6 +73,11 @@ public class PackageInfoLite implements Parcelable { */ */ public boolean multiArch; public boolean multiArch; /** * The android:debuggable flag from the package manifest. */ public boolean debuggable; /** /** * Specifies the recommended install location. Can be one of * Specifies the recommended install location. Can be one of * {@link PackageHelper#RECOMMEND_INSTALL_INTERNAL} to install on internal storage, * {@link PackageHelper#RECOMMEND_INSTALL_INTERNAL} to install on internal storage, Loading Loading @@ -108,6 +113,7 @@ public class PackageInfoLite implements Parcelable { dest.writeInt(recommendedInstallLocation); dest.writeInt(recommendedInstallLocation); dest.writeInt(installLocation); dest.writeInt(installLocation); dest.writeInt(multiArch ? 1 : 0); dest.writeInt(multiArch ? 1 : 0); dest.writeInt(debuggable ? 1 : 0); if (verifiers == null || verifiers.length == 0) { if (verifiers == null || verifiers.length == 0) { dest.writeInt(0); dest.writeInt(0); Loading Loading @@ -139,6 +145,7 @@ public class PackageInfoLite implements Parcelable { recommendedInstallLocation = source.readInt(); recommendedInstallLocation = source.readInt(); installLocation = source.readInt(); installLocation = source.readInt(); multiArch = (source.readInt() != 0); multiArch = (source.readInt() != 0); debuggable = (source.readInt() != 0); final int verifiersLength = source.readInt(); final int verifiersLength = source.readInt(); if (verifiersLength == 0) { if (verifiersLength == 0) { Loading
services/core/java/com/android/server/pm/PackageInstallerService.java +11 −2 Original line number Original line Diff line number Diff line Loading @@ -129,6 +129,13 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements /** Upper bound on number of historical sessions for a UID */ /** Upper bound on number of historical sessions for a UID */ private static final long MAX_HISTORICAL_SESSIONS = 1048576; 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 Context mContext; private final PackageManagerService mPm; private final PackageManagerService mPm; private final ApexManager mApexManager; private final ApexManager mApexManager; Loading Loading @@ -531,8 +538,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements params.installFlags &= ~PackageManager.INSTALL_REQUEST_DOWNGRADE; params.installFlags &= ~PackageManager.INSTALL_REQUEST_DOWNGRADE; } } if (callingUid != Process.SYSTEM_UID) { if (callingUid != Process.SYSTEM_UID // Only system_server can use INSTALL_DISABLE_VERIFICATION. && (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; params.installFlags &= ~PackageManager.INSTALL_DISABLE_VERIFICATION; } } Loading
services/core/java/com/android/server/pm/PackageManagerService.java +35 −24 Original line number Original line Diff line number Diff line Loading @@ -13350,24 +13350,36 @@ public class PackageManagerService extends IPackageManager.Stub * * * @return true if verification should be performed * @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) { if (!DEFAULT_VERIFY_ENABLE) { return false; return false; } } if ((installFlags & PackageManager.INSTALL_DISABLE_VERIFICATION) != 0) { return false; } // Check if installing from ADB // Check if installing from ADB if ((installFlags & PackageManager.INSTALL_FROM_ADB) != 0) { if ((installFlags & PackageManager.INSTALL_FROM_ADB) != 0) { if (isUserRestricted(userId, UserManager.ENSURE_VERIFY_APPS)) { if (isUserRestricted(userId, UserManager.ENSURE_VERIFY_APPS)) { return true; 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(), return Global.getInt(mContext.getContentResolver(), Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0; Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0; } else { } if ((installFlags & PackageManager.INSTALL_DISABLE_VERIFICATION) != 0) { return false; } // only when not installed from ADB, skip verification for instant apps when // only when not installed from ADB, skip verification for instant apps when // the installer and verifier are the same. // the installer and verifier are the same. if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { Loading @@ -13386,7 +13398,6 @@ public class PackageManagerService extends IPackageManager.Stub } } return true; return true; } } } /** /** * Check whether or not integrity verification has been enabled. * Check whether or not integrity verification has been enabled. Loading Loading @@ -14549,7 +14560,7 @@ public class PackageManagerService extends IPackageManager.Stub verificationInfo == null ? -1 : verificationInfo.installerUid; verificationInfo == null ? -1 : verificationInfo.installerUid; if (!origin.existing && requiredUid != -1 if (!origin.existing && requiredUid != -1 && isVerificationEnabled( && isVerificationEnabled( verifierUser.getIdentifier(), installFlags, installerUid)) { pkgLite, verifierUser.getIdentifier(), installFlags, installerUid)) { final Intent verification = new Intent( final Intent verification = new Intent( Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); verification.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); verification.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -794,6 +794,7 @@ public class PackageManagerServiceUtils { ret.verifiers = pkg.verifiers; ret.verifiers = pkg.verifiers; ret.recommendedInstallLocation = recommendedInstallLocation; ret.recommendedInstallLocation = recommendedInstallLocation; ret.multiArch = pkg.multiArch; ret.multiArch = pkg.multiArch; ret.debuggable = pkg.debuggable; return ret; return ret; } } Loading
services/core/java/com/android/server/pm/PackageManagerShellCommand.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -2757,6 +2757,9 @@ class PackageManagerShellCommand extends ShellCommand { case "--no-wait": case "--no-wait": params.mWaitForStagedSessionReady = false; params.mWaitForStagedSessionReady = false; break; break; case "--skip-verification": sessionParams.installFlags |= PackageManager.INSTALL_DISABLE_VERIFICATION; break; default: default: throw new IllegalArgumentException("Unknown option " + opt); throw new IllegalArgumentException("Unknown option " + opt); } } Loading