Merge changes from topic "install-hints"

* changes:
  Modify dexopt invocation based on install scenario
  Adds an "install scenario" field to the appropriate datastructures
This commit is contained in:
Christian Wailes
2020-12-09 00:00:26 +00:00
committed by Gerrit Code Review
8 changed files with 279 additions and 29 deletions

View File

@@ -37,6 +37,7 @@ import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager.DeleteFlags;
import android.content.pm.PackageManager.InstallReason;
import android.content.pm.PackageManager.InstallScenario;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
@@ -1466,6 +1467,14 @@ public class PackageInstaller {
public int installLocation = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
/** {@hide} */
public @InstallReason int installReason = PackageManager.INSTALL_REASON_UNKNOWN;
/**
* {@hide}
*
* This flag indicates which installation scenario best describes this session. The system
* may use this value when making decisions about how to handle the installation, such as
* prioritizing system health or user experience.
*/
public @InstallScenario int installScenario = PackageManager.INSTALL_SCENARIO_DEFAULT;
/** {@hide} */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public long sizeBytes = -1;
@@ -1529,6 +1538,7 @@ public class PackageInstaller {
installFlags = source.readInt();
installLocation = source.readInt();
installReason = source.readInt();
installScenario = source.readInt();
sizeBytes = source.readLong();
appPackageName = source.readString();
appIcon = source.readParcelable(null);
@@ -1560,6 +1570,7 @@ public class PackageInstaller {
ret.installFlags = installFlags;
ret.installLocation = installLocation;
ret.installReason = installReason;
ret.installScenario = installScenario;
ret.sizeBytes = sizeBytes;
ret.appPackageName = appPackageName;
ret.appIcon = appIcon; // not a copy.
@@ -1985,6 +1996,8 @@ public class PackageInstaller {
pw.printPair("mode", mode);
pw.printHexPair("installFlags", installFlags);
pw.printPair("installLocation", installLocation);
pw.printPair("installReason", installReason);
pw.printPair("installScenario", installScenario);
pw.printPair("sizeBytes", sizeBytes);
pw.printPair("appPackageName", appPackageName);
pw.printPair("appIcon", (appIcon != null));
@@ -2018,6 +2031,7 @@ public class PackageInstaller {
dest.writeInt(installFlags);
dest.writeInt(installLocation);
dest.writeInt(installReason);
dest.writeInt(installScenario);
dest.writeLong(sizeBytes);
dest.writeString(appPackageName);
dest.writeParcelable(appIcon, flags);
@@ -2127,6 +2141,8 @@ public class PackageInstaller {
/** {@hide} */
public @InstallReason int installReason;
/** {@hide} */
public @InstallReason int installScenario;
/** {@hide} */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public long sizeBytes;
/** {@hide} */
@@ -2204,6 +2220,7 @@ public class PackageInstaller {
mode = source.readInt();
installReason = source.readInt();
installScenario = source.readInt();
sizeBytes = source.readLong();
appPackageName = source.readString();
appIcon = source.readParcelable(null);
@@ -2734,6 +2751,7 @@ public class PackageInstaller {
dest.writeInt(mode);
dest.writeInt(installReason);
dest.writeInt(installScenario);
dest.writeLong(sizeBytes);
dest.writeString(appPackageName);
dest.writeParcelable(appIcon, flags);

View File

@@ -1037,6 +1037,60 @@ public abstract class PackageManager {
*/
public static final int INSTALL_REASON_ROLLBACK = 5;
/** @hide */
@IntDef(prefix = { "INSTALL_SCENARIO_" }, value = {
INSTALL_SCENARIO_DEFAULT,
INSTALL_SCENARIO_FAST,
INSTALL_SCENARIO_BULK,
INSTALL_SCENARIO_BULK_SECONDARY,
})
@Retention(RetentionPolicy.SOURCE)
public @interface InstallScenario {}
/**
* A value to indicate the lack of CUJ information, disabling all installation scenario logic.
*
* @hide
*/
public static final int INSTALL_SCENARIO_DEFAULT = 0;
/**
* Installation scenario providing the fastest “install button to launch" experience possible.
*
* @hide
*/
public static final int INSTALL_SCENARIO_FAST = 1;
/**
* Installation scenario indicating a bulk operation with the desired result of a fully
* optimized application. If the system is busy or resources are scarce the system will
* perform less work to avoid impacting system health.
*
* Examples of bulk installation scenarios might include device restore, background updates of
* multiple applications, or user-triggered updates for all applications.
*
* The decision to use BULK or BULK_SECONDARY should be based on the desired user experience.
* BULK_SECONDARY operations may take less time to complete but, when they do, will produce
* less optimized applications. The device state (e.g. memory usage or battery status) should
* not be considered when making this decision as those factors are taken into account by the
* Package Manager when acting on the installation scenario.
*
* @hide
*/
public static final int INSTALL_SCENARIO_BULK = 2;
/**
* Installation scenario indicating a bulk operation that prioritizes minimal system health
* impact over application optimization. The application may undergo additional optimization
* if the system is idle and system resources are abundant. The more elements of a bulk
* operation that are marked BULK_SECONDARY, the faster the entire bulk operation will be.
*
* See the comments for INSTALL_SCENARIO_BULK for more information.
*
* @hide
*/
public static final int INSTALL_SCENARIO_BULK_SECONDARY = 3;
/** @hide */
@IntDef(prefix = { "UNINSTALL_REASON_" }, value = {
UNINSTALL_REASON_UNKNOWN,

View File

@@ -665,6 +665,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
info.mode = params.mode;
info.installReason = params.installReason;
info.installScenario = params.installScenario;
info.sizeBytes = params.sizeBytes;
info.appPackageName = params.appPackageName;
if (includeIcon) {

View File

@@ -677,10 +677,15 @@ public class PackageManagerService extends IPackageManager.Stub
public static final int REASON_FIRST_BOOT = 0;
public static final int REASON_BOOT = 1;
public static final int REASON_INSTALL = 2;
public static final int REASON_BACKGROUND_DEXOPT = 3;
public static final int REASON_AB_OTA = 4;
public static final int REASON_INACTIVE_PACKAGE_DOWNGRADE = 5;
public static final int REASON_SHARED = 6;
public static final int REASON_INSTALL_FAST = 3;
public static final int REASON_INSTALL_BULK = 4;
public static final int REASON_INSTALL_BULK_SECONDARY = 5;
public static final int REASON_INSTALL_BULK_DOWNGRADED = 6;
public static final int REASON_INSTALL_BULK_SECONDARY_DOWNGRADED = 7;
public static final int REASON_BACKGROUND_DEXOPT = 8;
public static final int REASON_AB_OTA = 9;
public static final int REASON_INACTIVE_PACKAGE_DOWNGRADE = 10;
public static final int REASON_SHARED = 11;
public static final int REASON_LAST = REASON_SHARED;
@@ -14853,6 +14858,7 @@ public class PackageManagerService extends IPackageManager.Stub
final VerificationInfo verificationInfo;
final PackageParser.SigningDetails signingDetails;
final int installReason;
final int mInstallScenario;
@Nullable
MultiPackageInstallParams mParentInstallParams;
final long requiredInstalledVersionCode;
@@ -14881,6 +14887,7 @@ public class PackageManagerService extends IPackageManager.Stub
this.autoRevokePermissionsMode = autoRevokePermissionsMode;
this.signingDetails = signingDetails;
this.installReason = installReason;
this.mInstallScenario = PackageManager.INSTALL_SCENARIO_DEFAULT;
this.requiredInstalledVersionCode = requiredInstalledVersionCode;
this.forceQueryableOverride = false;
this.mDataLoaderType = dataLoaderType;
@@ -14908,6 +14915,7 @@ public class PackageManagerService extends IPackageManager.Stub
activeInstallSession.getInstallSource().installerPackageName,
activeInstallSession.getInstallerUid(),
sessionParams.installReason);
mInstallScenario = sessionParams.installScenario;
observer = activeInstallSession.getObserver();
installFlags = sessionParams.installFlags;
installSource = activeInstallSession.getInstallSource();
@@ -15545,6 +15553,7 @@ public class PackageManagerService extends IPackageManager.Stub
final int traceCookie;
final PackageParser.SigningDetails signingDetails;
final int installReason;
final int mInstallScenario;
final boolean forceQueryableOverride;
@Nullable final MultiPackageInstallParams mMultiPackageInstallParams;
final int mDataLoaderType;
@@ -15561,7 +15570,7 @@ public class PackageManagerService extends IPackageManager.Stub
List<String> whitelistedRestrictedPermissions,
int autoRevokePermissionsMode,
String traceMethod, int traceCookie, SigningDetails signingDetails,
int installReason, boolean forceQueryableOverride,
int installReason, int installScenario, boolean forceQueryableOverride,
MultiPackageInstallParams multiPackageInstallParams, int dataLoaderType) {
this.origin = origin;
this.move = move;
@@ -15579,6 +15588,7 @@ public class PackageManagerService extends IPackageManager.Stub
this.traceCookie = traceCookie;
this.signingDetails = signingDetails;
this.installReason = installReason;
this.mInstallScenario = installScenario;
this.forceQueryableOverride = forceQueryableOverride;
this.mMultiPackageInstallParams = multiPackageInstallParams;
this.mDataLoaderType = dataLoaderType;
@@ -15592,7 +15602,7 @@ public class PackageManagerService extends IPackageManager.Stub
params.grantedRuntimePermissions, params.whitelistedRestrictedPermissions,
params.autoRevokePermissionsMode,
params.traceMethod, params.traceCookie, params.signingDetails,
params.installReason, params.forceQueryableOverride,
params.installReason, params.mInstallScenario, params.forceQueryableOverride,
params.mParentInstallParams, params.mDataLoaderType);
}
@@ -15684,8 +15694,8 @@ public class PackageManagerService extends IPackageManager.Stub
super(OriginInfo.fromNothing(), null, null, 0, InstallSource.EMPTY,
null, null, instructionSets, null, null, null, MODE_DEFAULT, null, 0,
PackageParser.SigningDetails.UNKNOWN,
PackageManager.INSTALL_REASON_UNKNOWN, false, null /* parent */,
DataLoaderType.NONE);
PackageManager.INSTALL_REASON_UNKNOWN, PackageManager.INSTALL_SCENARIO_DEFAULT,
false, null /* parent */, DataLoaderType.NONE);
this.codeFile = (codePath != null) ? new File(codePath) : null;
this.resourceFile = (resourcePath != null) ? new File(resourcePath) : null;
}
@@ -16993,6 +17003,26 @@ public class PackageManagerService extends IPackageManager.Stub
resolveUserIds(reconciledPkg.installArgs.user.getIdentifier()),
/* updateReferenceProfileContent= */ true);
// Compute the compilation reason from the installation scenario.
final int compilationReason = mDexManager.getCompilationReasonForInstallScenario(
reconciledPkg.installArgs.mInstallScenario);
// Construct the DexoptOptions early to see if we should skip running dexopt.
//
// Do not run PackageDexOptimizer through the local performDexOpt
// method because `pkg` may not be in `mPackages` yet.
//
// Also, don't fail application installs if the dexopt step fails.
final boolean isBackupOrRestore =
reconciledPkg.installArgs.installReason == INSTALL_REASON_DEVICE_RESTORE
|| reconciledPkg.installArgs.installReason == INSTALL_REASON_DEVICE_SETUP;
final int dexoptFlags = DexoptOptions.DEXOPT_BOOT_COMPLETE
| DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE
| (isBackupOrRestore ? DexoptOptions.DEXOPT_FOR_RESTORE : 0);
DexoptOptions dexoptOptions =
new DexoptOptions(packageName, compilationReason, dexoptFlags);
// Check whether we need to dexopt the app.
//
// NOTE: it is IMPORTANT to call dexopt:
@@ -17013,11 +17043,18 @@ public class PackageManagerService extends IPackageManager.Stub
// continuous progress to the useur instead of mysteriously blocking somewhere in the
// middle of running an instant app. The default behaviour can be overridden
// via gservices.
//
// Furthermore, dexopt may be skipped, depending on the install scenario and current
// state of the device.
//
// TODO(b/174695087): instantApp and onIncremental should be removed and their install
// path moved to SCENARIO_FAST.
final boolean performDexopt =
(!instantApp || Global.getInt(mContext.getContentResolver(),
Global.INSTANT_APP_DEXOPT_ENABLED, 0) != 0)
&& !pkg.isDebuggable()
&& (!onIncremental);
&& (!onIncremental)
&& dexoptOptions.isCompilationEnabled();
if (performDexopt) {
// Compile the layout resources.
@@ -17028,19 +17065,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
// Do not run PackageDexOptimizer through the local performDexOpt
// method because `pkg` may not be in `mPackages` yet.
//
// Also, don't fail application installs if the dexopt step fails.
int flags = DexoptOptions.DEXOPT_BOOT_COMPLETE
| DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE;
if (reconciledPkg.installArgs.installReason == INSTALL_REASON_DEVICE_RESTORE
|| reconciledPkg.installArgs.installReason == INSTALL_REASON_DEVICE_SETUP) {
flags |= DexoptOptions.DEXOPT_FOR_RESTORE;
}
DexoptOptions dexoptOptions = new DexoptOptions(packageName,
REASON_INSTALL,
flags);
ScanResult result = reconciledPkg.scanResult;
// This mirrors logic from commitReconciledScanResultLocked, where the library files

View File

@@ -18,6 +18,8 @@ package com.android.server.pm;
import android.os.SystemProperties;
import com.android.server.pm.dex.DexoptOptions;
import dalvik.system.DexFile;
/**
@@ -26,10 +28,22 @@ import dalvik.system.DexFile;
public class PackageManagerServiceCompilerMapping {
// Names for compilation reasons.
public static final String REASON_STRINGS[] = {
"first-boot", "boot", "install", "bg-dexopt", "ab-ota", "inactive", "shared"
"first-boot",
"boot",
"install",
"install-fast",
"install-bulk",
"install-bulk-secondary",
"install-bulk-downgraded",
"install-bulk-secondary-downgraded",
"bg-dexopt",
"ab-ota",
"inactive",
// "shared" must be the last entry
"shared"
};
static final int REASON_SHARED_INDEX = 6;
static final int REASON_SHARED_INDEX = REASON_STRINGS.length - 1;
// Static block to ensure the strings array is of the right length.
static {
@@ -53,8 +67,9 @@ public class PackageManagerServiceCompilerMapping {
// exception in case the reason or value are invalid.
private static String getAndCheckValidity(int reason) {
String sysPropValue = SystemProperties.get(getSystemPropertyName(reason));
if (sysPropValue == null || sysPropValue.isEmpty() ||
!DexFile.isValidCompilerFilter(sysPropValue)) {
if (sysPropValue == null || sysPropValue.isEmpty()
|| !(sysPropValue.equals(DexoptOptions.COMPILER_FILTER_NOOP)
|| DexFile.isValidCompilerFilter(sysPropValue))) {
throw new IllegalStateException("Value \"" + sysPropValue +"\" not valid "
+ "(reason " + REASON_STRINGS[reason] + ")");
} else if (!isFilterAllowedForReason(reason, sysPropValue)) {

View File

@@ -579,6 +579,8 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
// Constants used for logging compilation reason to TRON.
// DO NOT CHANGE existing values.
//
// In the below constants, the abbreviation DM stands for "DEX metadata".
//
// NOTE: '-1' value is reserved for the case where we cannot produce a valid
// PackageOptimizationInfo because the ArtManagerInternal is not ready to be used by the
// ActivityMetricsLoggers.
@@ -591,7 +593,18 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
private static final int TRON_COMPILATION_REASON_AB_OTA = 6;
private static final int TRON_COMPILATION_REASON_INACTIVE = 7;
private static final int TRON_COMPILATION_REASON_SHARED = 8;
private static final int TRON_COMPILATION_REASON_INSTALL_WITH_DEX_METADATA = 9;
private static final int TRON_COMPILATION_REASON_INSTALL_WITH_DM = 9;
private static final int TRON_COMPILATION_REASON_INSTALL_FAST = 10;
private static final int TRON_COMPILATION_REASON_INSTALL_BULK = 11;
private static final int TRON_COMPILATION_REASON_INSTALL_BULK_SECONDARY = 12;
private static final int TRON_COMPILATION_REASON_INSTALL_BULK_DOWNGRADED = 13;
private static final int TRON_COMPILATION_REASON_INSTALL_BULK_SECONDARY_DOWNGRADED = 14;
private static final int TRON_COMPILATION_REASON_INSTALL_FAST_WITH_DM = 15;
private static final int TRON_COMPILATION_REASON_INSTALL_BULK_WITH_DM = 16;
private static final int TRON_COMPILATION_REASON_INSTALL_BULK_SECONDARY_WITH_DM = 17;
private static final int TRON_COMPILATION_REASON_INSTALL_BULK_DOWNGRADED_WITH_DM = 18;
private static final int
TRON_COMPILATION_REASON_INSTALL_BULK_SECONDARY_DOWNGRADED_WITH_DM = 19;
// The annotation to add as a suffix to the compilation reason when dexopt was
// performed with dex metadata.
@@ -611,10 +624,30 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
case "ab-ota" : return TRON_COMPILATION_REASON_AB_OTA;
case "inactive" : return TRON_COMPILATION_REASON_INACTIVE;
case "shared" : return TRON_COMPILATION_REASON_SHARED;
// This is a special marker for dex metadata installation that does not
case "install-fast" :
return TRON_COMPILATION_REASON_INSTALL_FAST;
case "install-bulk" :
return TRON_COMPILATION_REASON_INSTALL_BULK;
case "install-bulk-secondary" :
return TRON_COMPILATION_REASON_INSTALL_BULK_SECONDARY;
case "install-bulk-downgraded" :
return TRON_COMPILATION_REASON_INSTALL_BULK_DOWNGRADED;
case "install-bulk-secondary-downgraded" :
return TRON_COMPILATION_REASON_INSTALL_BULK_SECONDARY_DOWNGRADED;
// These are special markers for dex metadata installation that do not
// have an equivalent as a system property.
case "install" + DEXOPT_REASON_WITH_DEX_METADATA_ANNOTATION :
return TRON_COMPILATION_REASON_INSTALL_WITH_DEX_METADATA;
return TRON_COMPILATION_REASON_INSTALL_WITH_DM;
case "install-fast" + DEXOPT_REASON_WITH_DEX_METADATA_ANNOTATION :
return TRON_COMPILATION_REASON_INSTALL_FAST_WITH_DM;
case "install-bulk" + DEXOPT_REASON_WITH_DEX_METADATA_ANNOTATION :
return TRON_COMPILATION_REASON_INSTALL_BULK_WITH_DM;
case "install-bulk-secondary" + DEXOPT_REASON_WITH_DEX_METADATA_ANNOTATION :
return TRON_COMPILATION_REASON_INSTALL_BULK_SECONDARY_WITH_DM;
case "install-bulk-downgraded" + DEXOPT_REASON_WITH_DEX_METADATA_ANNOTATION :
return TRON_COMPILATION_REASON_INSTALL_BULK_DOWNGRADED_WITH_DM;
case "install-bulk-secondary-downgraded" + DEXOPT_REASON_WITH_DEX_METADATA_ANNOTATION :
return TRON_COMPILATION_REASON_INSTALL_BULK_SECONDARY_DOWNGRADED_WITH_DM;
default: return TRON_COMPILATION_REASON_UNKNOWN;
}
}

View File

@@ -27,8 +27,11 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackagePartitions;
import android.os.BatteryManager;
import android.os.FileUtils;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -107,6 +110,13 @@ public class DexManager {
@GuardedBy("mInstallLock")
private final Installer mInstaller;
private BatteryManager mBatteryManager = null;
private PowerManager mPowerManager = null;
// An integer percentage value used to determine when the device is considered to be on low
// power for compilation purposes.
private final int mCriticalBatteryLevel;
// Possible outcomes of a dex search.
private static int DEX_SEARCH_NOT_FOUND = 0; // dex file not found
private static int DEX_SEARCH_FOUND_PRIMARY = 1; // dex file is the primary/base apk
@@ -123,6 +133,23 @@ public class DexManager {
mInstaller = installer;
mInstallLock = installLock;
mDynamicCodeLogger = new DynamicCodeLogger(pms, installer);
// This is currently checked to handle tests that pass in a null context.
// TODO(b/174783329): Modify the tests to pass in a mocked Context, PowerManager,
// and BatteryManager.
if (mContext != null) {
mPowerManager = mContext.getSystemService(PowerManager.class);
if (mPowerManager == null) {
Slog.wtf(TAG, "Power Manager is unavailable at time of Dex Manager start");
}
mCriticalBatteryLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel);
} else {
// This value will never be used as the Battery Manager null check will fail first.
mCriticalBatteryLevel = 0;
}
}
public DynamicCodeLogger getDynamicCodeLogger() {
@@ -905,6 +932,74 @@ public class DexManager {
}
}
/**
* Translates install scenarios into compilation reasons. This process can be influenced
* by the state of the device.
*/
public int getCompilationReasonForInstallScenario(int installScenario) {
// Compute the compilation reason from the installation scenario.
boolean resourcesAreCritical = areBatteryThermalOrMemoryCritical();
switch (installScenario) {
case PackageManager.INSTALL_SCENARIO_DEFAULT: {
return PackageManagerService.REASON_INSTALL;
}
case PackageManager.INSTALL_SCENARIO_FAST: {
return PackageManagerService.REASON_INSTALL_FAST;
}
case PackageManager.INSTALL_SCENARIO_BULK: {
if (resourcesAreCritical) {
return PackageManagerService.REASON_INSTALL_BULK_DOWNGRADED;
} else {
return PackageManagerService.REASON_INSTALL_BULK;
}
}
case PackageManager.INSTALL_SCENARIO_BULK_SECONDARY: {
if (resourcesAreCritical) {
return PackageManagerService.REASON_INSTALL_BULK_SECONDARY_DOWNGRADED;
} else {
return PackageManagerService.REASON_INSTALL_BULK_SECONDARY;
}
}
default: {
throw new IllegalArgumentException("Invalid installation scenario");
}
}
}
/**
* Fetches the battery manager object and caches it if it hasn't been fetched already.
*/
private BatteryManager getBatteryManager() {
if (mBatteryManager == null) {
mBatteryManager = mContext.getSystemService(BatteryManager.class);
}
return mBatteryManager;
}
/**
* Returns true if the battery level, device temperature, or memory usage are considered to be
* in a critical state.
*/
private boolean areBatteryThermalOrMemoryCritical() {
BatteryManager batteryManager = getBatteryManager();
boolean isBtmCritical = (batteryManager != null
&& batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS)
== BatteryManager.BATTERY_STATUS_DISCHARGING
&& batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
<= mCriticalBatteryLevel)
|| (mPowerManager != null
&& mPowerManager.getCurrentThermalStatus()
>= PowerManager.THERMAL_STATUS_SEVERE);
if (DEBUG) {
Log.d(TAG, "Battery, thermal, or memory are critical: " + isBtmCritical);
}
return isBtmCritical;
}
public static class RegisterDexModuleResult {
public RegisterDexModuleResult() {
this(false, null);

View File

@@ -65,6 +65,12 @@ public final class DexoptOptions {
// or device setup and should be scheduled appropriately.
public static final int DEXOPT_FOR_RESTORE = 1 << 11; // TODO(b/135202722): remove
/**
* A value indicating that dexopt shouldn't be run. This string is only used when loading
* filters from the `pm.dexopt.install*` properties and is not propagated to dex2oat.
*/
public static final String COMPILER_FILTER_NOOP = "skip";
// The name of package to optimize.
private final String mPackageName;
@@ -176,6 +182,10 @@ public final class DexoptOptions {
return mCompilationReason;
}
public boolean isCompilationEnabled() {
return !mCompilerFilter.equals(COMPILER_FILTER_NOOP);
}
/**
* Creates a new set of DexoptOptions which are the same with the exception of the compiler
* filter (set to the given value).