diff options
3 files changed, 35 insertions, 3 deletions
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 36433ce84618..e2a5747a4bcb 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1480,6 +1480,7 @@ public abstract class PackageManager { INSTALL_ALLOW_DOWNGRADE, INSTALL_STAGED, INSTALL_REQUEST_UPDATE_OWNERSHIP, + INSTALL_IGNORE_DEXOPT_PROFILE, }) @Retention(RetentionPolicy.SOURCE) public @interface InstallFlags {} @@ -1712,6 +1713,18 @@ public abstract class PackageManager { public static final int INSTALL_ARCHIVED = 1 << 27; /** + * If set, all dexopt profiles are ignored by dexopt during the installation, including the + * profile in the DM file and the profile embedded in the APK file. If an invalid profile is + * provided during installation, no warning will be reported by {@code adb install}. + * + * This option does not affect later dexopt operations (e.g., background dexopt and manual `pm + * compile` invocations). + * + * @hide + */ + public static final int INSTALL_IGNORE_DEXOPT_PROFILE = 1 << 28; + + /** * Flag parameter for {@link #installPackage} to force a non-staged update of an APEX. This is * a development-only feature and should not be used on end user devices. * diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 2951ef630eb3..a52870e17b16 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -112,6 +112,7 @@ import android.content.IntentSender; import android.content.pm.ApplicationInfo; import android.content.pm.ArchivedPackageParcel; import android.content.pm.DataLoaderType; +import android.content.pm.Flags; import android.content.pm.PackageInfo; import android.content.pm.PackageInfoLite; import android.content.pm.PackageInstaller; @@ -159,6 +160,7 @@ import com.android.internal.util.CollectionUtils; import com.android.server.EventLogTags; import com.android.server.LocalManagerRegistry; import com.android.server.SystemConfig; +import com.android.server.art.model.ArtFlags; import com.android.server.art.model.DexoptParams; import com.android.server.art.model.DexoptResult; import com.android.server.pm.Installer.LegacyDexoptDisabledException; @@ -2524,8 +2526,15 @@ final class InstallPackageHelper { LocalManagerRegistry.getManager(PackageManagerLocal.class); try (PackageManagerLocal.FilteredSnapshot snapshot = packageManagerLocal.withFilteredSnapshot()) { - DexoptParams params = - dexoptOptions.convertToDexoptParams(0 /* extraFlags */); + boolean ignoreDexoptProfile = + (installRequest.getInstallFlags() + & PackageManager.INSTALL_IGNORE_DEXOPT_PROFILE) + != 0; + /*@DexoptFlags*/ int extraFlags = + ignoreDexoptProfile && Flags.useArtServiceV2() + ? ArtFlags.FLAG_IGNORE_PROFILE + : 0; + DexoptParams params = dexoptOptions.convertToDexoptParams(extraFlags); DexoptResult dexOptResult = DexOptHelper.getArtManagerLocal().dexoptPackage( snapshot, packageName, params); installRequest.onDexoptFinished(dexOptResult); diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 7264e2eff4aa..d4abad8499f2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -3703,6 +3703,9 @@ class PackageManagerShellCommand extends ShellCommand { sessionParams.installFlags |= PackageManager.INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK; break; + case "--ignore-dexopt-profile": + sessionParams.installFlags |= PackageManager.INSTALL_IGNORE_DEXOPT_PROFILE; + break; default: throw new IllegalArgumentException("Unknown option " + opt); } @@ -4799,7 +4802,7 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" [--enable-rollback]"); pw.println(" [--force-uuid internal|UUID] [--pkg PACKAGE] [-S BYTES]"); pw.println(" [--apex] [--non-staged] [--force-non-staged]"); - pw.println(" [--staged-ready-timeout TIMEOUT]"); + pw.println(" [--staged-ready-timeout TIMEOUT] [--ignore-dexopt-profile]"); pw.println(" [PATH [SPLIT...]|-]"); pw.println(" Install an application. Must provide the apk data to install, either as"); pw.println(" file path(s) or '-' to read from stdin. Options are:"); @@ -4839,6 +4842,13 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" milliseconds for pre-reboot verification to complete when"); pw.println(" performing staged install. This flag is used to alter the waiting"); pw.println(" time. You can skip the waiting time by specifying a TIMEOUT of '0'"); + pw.println(" --ignore-dexopt-profile: If set, all profiles are ignored by dexopt"); + pw.println(" during the installation, including the profile in the DM file and"); + pw.println(" the profile embedded in the APK file. If an invalid profile is"); + pw.println(" provided during installation, no warning will be reported by `adb"); + pw.println(" install`."); + pw.println(" This option does not affect later dexopt operations (e.g.,"); + pw.println(" background dexopt and manual `pm compile` invocations)."); pw.println(""); pw.println(" install-existing [--user USER_ID|all|current]"); pw.println(" [--instant] [--full] [--wait] [--restrict-permissions] PACKAGE"); |