summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChester Hsieh <dunno@google.com>2020-02-07 04:33:54 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-02-07 04:33:54 +0000
commitc997463eb73d653b3dfa76278ed3bd1edddeec3a (patch)
tree304f4d4e7d5140d7ed2998aa9e20b02b934eab0f
parent1f0cb0acad8faedc239e27293ff0f39a2aaa332a (diff)
parent750b5ed85cfd2c8598634ca96a75aba115130e13 (diff)
Merge "Allow test builds to optionally skip verification"
-rw-r--r--core/java/android/content/pm/PackageInfoLite.java7
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java13
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java59
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerServiceUtils.java1
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java3
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);
}