summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ivan Chiang <chiangi@google.com> 2023-06-21 09:29:45 +0000
committer Ivan Chiang <chiangi@google.com> 2023-06-28 05:10:02 +0000
commit3a94306ff2d19799eec7650450c22a96d9c579c8 (patch)
tree0a5ec46f7c926ac362ecb19086faee837ad60c7c
parent3f5ab98f358019936512690ede66726d998ee6d7 (diff)
[pm] Add --no-profile option into install command
Bug: 257532944 Test: adb install --no-profile foo.apk. adb shell pm help Change-Id: I8b7ad8f6ff6dac340b6658e68c3a37d8060edbf7
-rw-r--r--core/java/android/content/pm/PackageManager.java8
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java6
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java9
-rw-r--r--services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java9
4 files changed, 28 insertions, 4 deletions
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index e5468a58e4be..4ce77e9f33f3 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1431,6 +1431,7 @@ public abstract class PackageManager {
INSTALL_ALLOW_DOWNGRADE,
INSTALL_STAGED,
INSTALL_REQUEST_UPDATE_OWNERSHIP,
+ INSTALL_DONT_EXTRACT_BASELINE_PROFILES,
})
@Retention(RetentionPolicy.SOURCE)
public @interface InstallFlags {}
@@ -1645,6 +1646,13 @@ public abstract class PackageManager {
*/
public static final int INSTALL_FROM_MANAGED_USER_OR_PROFILE = 1 << 26;
+ /**
+ * Flag parameter for {@link PackageInstaller.SessionParams} to indicate that do not extract
+ * the baseline profiles when parsing the apk
+ * @hide
+ */
+ public static final int INSTALL_DONT_EXTRACT_BASELINE_PROFILES = 1 << 27;
+
/** @hide */
@IntDef(flag = true, value = {
DONT_KILL_APP,
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index e01e1d3f3edd..45fc6ec985ab 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -1077,6 +1077,8 @@ final class InstallPackageHelper {
final boolean isApex = ((installFlags & PackageManager.INSTALL_APEX) != 0);
final boolean isRollback =
request.getInstallReason() == PackageManager.INSTALL_REASON_ROLLBACK;
+ final boolean extractProfile =
+ ((installFlags & PackageManager.INSTALL_DONT_EXTRACT_BASELINE_PROFILES) == 0);
@PackageManagerService.ScanFlags int scanFlags = SCAN_NEW_INSTALL | SCAN_UPDATE_SIGNATURE;
if (request.isInstallMove()) {
// moving a complete application; perform an initial scan on the new install location
@@ -1112,7 +1114,9 @@ final class InstallPackageHelper {
@ParsingPackageUtils.ParseFlags final int parseFlags =
mPm.getDefParseFlags() | ParsingPackageUtils.PARSE_CHATTY
| ParsingPackageUtils.PARSE_ENFORCE_CODE
- | (onExternal ? ParsingPackageUtils.PARSE_EXTERNAL_STORAGE : 0);
+ | (onExternal ? ParsingPackageUtils.PARSE_EXTERNAL_STORAGE : 0)
+ | (extractProfile
+ ? ParsingPackageUtils.PARSE_EXTRACT_BASELINE_PROFILES_FROM_APK : 0);
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "parsePackage");
final ParsedPackage parsedPackage;
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index e4692f19ada9..5cb480c0278f 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -3436,6 +3436,10 @@ class PackageManagerShellCommand extends ShellCommand {
sessionParams.installFlags |=
PackageManager.INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK;
break;
+ case "--no-profile":
+ sessionParams.installFlags |=
+ PackageManager.INSTALL_DONT_EXTRACT_BASELINE_PROFILES;
+ break;
default:
throw new IllegalArgumentException("Unknown option " + opt);
}
@@ -4324,7 +4328,7 @@ class PackageManagerShellCommand extends ShellCommand {
pw.println(" [--install-reason 0/1/2/3/4] [--originating-uri URI]");
pw.println(" [--referrer URI] [--abi ABI_NAME] [--force-sdk]");
pw.println(" [--preload] [--instant] [--full] [--dont-kill]");
- pw.println(" [--enable-rollback]");
+ pw.println(" [--enable-rollback] [--no-profile]");
pw.println(" [--force-uuid internal|UUID] [--pkg PACKAGE] [-S BYTES]");
pw.println(" [--apex] [--force-non-staged] [--staged-ready-timeout TIMEOUT]");
pw.println(" [PATH [SPLIT...]|-]");
@@ -4357,6 +4361,7 @@ class PackageManagerShellCommand extends ShellCommand {
pw.println(" --apex: install an .apex file, not an .apk");
pw.println(" --force-non-staged: force the installation to run under a non-staged");
pw.println(" session, which may complete without requiring a reboot");
+ pw.println(" --no-profile: don't extract the profiles from the apk");
pw.println(" --staged-ready-timeout: By default, staged sessions wait "
+ DEFAULT_STAGED_READY_TIMEOUT_MS);
pw.println(" milliseconds for pre-reboot verification to complete when");
@@ -4378,7 +4383,7 @@ class PackageManagerShellCommand extends ShellCommand {
pw.println(" [--referrer URI] [--abi ABI_NAME] [--force-sdk]");
pw.println(" [--preload] [--instant] [--full] [--dont-kill]");
pw.println(" [--force-uuid internal|UUID] [--pkg PACKAGE] [--apex] [-S BYTES]");
- pw.println(" [--multi-package] [--staged] [--update-ownership]");
+ pw.println(" [--multi-package] [--staged] [--no-profile] [--update-ownership]");
pw.println(" Like \"install\", but starts an install session. Use \"install-write\"");
pw.println(" to push data into the session, and \"install-commit\" to finish.");
pw.println("");
diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java
index e2cb87e72c7a..7fbd4a9495b0 100644
--- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java
+++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java
@@ -240,6 +240,11 @@ public class ParsingPackageUtils {
public static final int PARSE_IGNORE_OVERLAY_REQUIRED_SYSTEM_PROPERTY = 1 << 7;
public static final int PARSE_APK_IN_APEX = 1 << 9;
+ /**
+ * This flag is to determine whether to extract the baseline profiles from the apk or not.
+ */
+ public static final int PARSE_EXTRACT_BASELINE_PROFILES_FROM_APK = 1 << 10;
+
public static final int PARSE_CHATTY = 1 << 31;
/** The total maximum number of activities, services, providers and activity-aliases */
@@ -251,14 +256,16 @@ public class ParsingPackageUtils {
private static final int MAX_PERMISSION_NAME_LENGTH = 512;
@IntDef(flag = true, prefix = { "PARSE_" }, value = {
+ PARSE_APK_IN_APEX,
PARSE_CHATTY,
PARSE_COLLECT_CERTIFICATES,
PARSE_ENFORCE_CODE,
PARSE_EXTERNAL_STORAGE,
+ PARSE_EXTRACT_BASELINE_PROFILES_FROM_APK,
+ PARSE_IGNORE_OVERLAY_REQUIRED_SYSTEM_PROPERTY,
PARSE_IGNORE_PROCESSES,
PARSE_IS_SYSTEM_DIR,
PARSE_MUST_BE_APK,
- PARSE_IGNORE_OVERLAY_REQUIRED_SYSTEM_PROPERTY,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ParseFlags {}