Loading services/core/java/com/android/server/pm/BackgroundDexOptService.java +33 −9 Original line number Diff line number Diff line Loading @@ -17,8 +17,11 @@ package com.android.server.pm; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason; import static com.android.server.pm.dex.ArtStatsLogUtils.BackgroundDexoptJobStatsLogger; import static dalvik.system.DexFile.isProfileGuidedCompilerFilter; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -748,10 +751,21 @@ public final class BackgroundDexOptService { return PackageDexOptimizer.DEX_OPT_CANCELLED; } int reason = PackageManagerService.REASON_INACTIVE_PACKAGE_DOWNGRADE; String filter = getCompilerFilterForReason(reason); int dexoptFlags = DexoptOptions.DEXOPT_BOOT_COMPLETE | DexoptOptions.DEXOPT_DOWNGRADE; if (isProfileGuidedCompilerFilter(filter)) { // We don't expect updates in current profiles to be significant here, but // DEXOPT_CHECK_FOR_PROFILES_UPDATES is set to replicate behaviour that will be // unconditionally enabled for profile guided filters when ART Service is called instead // of the legacy PackageDexOptimizer implementation. dexoptFlags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES; } if (!isPostBootUpdate) { dexoptFlags |= DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB; } long package_size_before = getPackageSize(snapshot, pkg); int result = PackageDexOptimizer.DEX_OPT_SKIPPED; if (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg)) { Loading @@ -762,10 +776,10 @@ public final class BackgroundDexOptService { // remove their compiler artifacts from dalvik cache. pm.deleteOatArtifactsOfPackage(snapshot, pkg); } else { result = performDexOptPrimary(pkg, reason, dexoptFlags); result = performDexOptPrimary(pkg, reason, filter, dexoptFlags); } } else { result = performDexOptSecondary(pkg, reason, dexoptFlags); result = performDexOptSecondary(pkg, reason, filter, dexoptFlags); } if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) { Loading Loading @@ -801,32 +815,42 @@ public final class BackgroundDexOptService { private int optimizePackage(String pkg, boolean isForPrimaryDex, boolean isPostBootUpdate) { int reason = isPostBootUpdate ? PackageManagerService.REASON_POST_BOOT : PackageManagerService.REASON_BACKGROUND_DEXOPT; String filter = getCompilerFilterForReason(reason); int dexoptFlags = DexoptOptions.DEXOPT_BOOT_COMPLETE; if (!isPostBootUpdate) { dexoptFlags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES | DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB; } if (isProfileGuidedCompilerFilter(filter)) { // Ensure DEXOPT_CHECK_FOR_PROFILES_UPDATES is enabled if the filter is profile guided, // to replicate behaviour that will be unconditionally enabled when ART Service is // called instead of the legacy PackageDexOptimizer implementation. dexoptFlags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES; } // System server share the same code path as primary dex files. // PackageManagerService will select the right optimization path for it. if (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg)) { return performDexOptPrimary(pkg, reason, dexoptFlags); return performDexOptPrimary(pkg, reason, filter, dexoptFlags); } else { return performDexOptSecondary(pkg, reason, dexoptFlags); return performDexOptSecondary(pkg, reason, filter, dexoptFlags); } } @DexOptResult private int performDexOptPrimary(String pkg, int reason, int dexoptFlags) { DexoptOptions dexoptOptions = new DexoptOptions(pkg, reason, dexoptFlags); private int performDexOptPrimary(String pkg, int reason, String filter, int dexoptFlags) { DexoptOptions dexoptOptions = new DexoptOptions(pkg, reason, filter, /*splitName=*/null, dexoptFlags); return trackPerformDexOpt(pkg, /*isForPrimaryDex=*/true, () -> mDexOptHelper.performDexOptWithStatus(dexoptOptions)); } @DexOptResult private int performDexOptSecondary(String pkg, int reason, int dexoptFlags) { DexoptOptions dexoptOptions = new DexoptOptions( pkg, reason, dexoptFlags | DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX); private int performDexOptSecondary(String pkg, int reason, String filter, int dexoptFlags) { DexoptOptions dexoptOptions = new DexoptOptions(pkg, reason, filter, /*splitName=*/null, dexoptFlags | DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX); return trackPerformDexOpt(pkg, /*isForPrimaryDex=*/false, () -> mDexOptHelper.performDexOpt(dexoptOptions) Loading services/core/java/com/android/server/pm/DexOptHelper.java +34 −17 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import static com.android.server.pm.PackageManagerServiceCompilerMapping.getDefa import static com.android.server.pm.PackageManagerServiceUtils.REMOVE_IF_APEX_PKG; import static com.android.server.pm.PackageManagerServiceUtils.REMOVE_IF_NULL_PKG; import static dalvik.system.DexFile.isProfileGuidedCompilerFilter; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -70,8 +72,6 @@ import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import dalvik.system.DexFile; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; Loading Loading @@ -236,20 +236,24 @@ public final class DexOptHelper { mPm.mArtManagerService.compileLayouts(pkg); } // checkProfiles is false to avoid merging profiles during boot which // might interfere with background compilation (b/28612421). // Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will // behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a // trade-off worth doing to save boot time work. int dexoptFlags = bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0; String filter = getCompilerFilterForReason(pkgCompilationReason); if (isProfileGuidedCompilerFilter(filter)) { // DEXOPT_CHECK_FOR_PROFILES_UPDATES used to be false to avoid merging profiles // during boot which might interfere with background compilation (b/28612421). // However those problems were related to the verify-profile compiler filter which // doesn't exist any more, so enable it again. dexoptFlags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES; } if (compilationReason == REASON_FIRST_BOOT) { // TODO: This doesn't cover the upgrade case, we should check for this too. dexoptFlags |= DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE; } int primaryDexOptStatus = performDexOptTraced(new DexoptOptions( pkg.getPackageName(), pkgCompilationReason, dexoptFlags)); int primaryDexOptStatus = performDexOptTraced( new DexoptOptions(pkg.getPackageName(), pkgCompilationReason, filter, /*splitName*/ null, dexoptFlags)); switch (primaryDexOptStatus) { case PackageDexOptimizer.DEX_OPT_PERFORMED: Loading Loading @@ -297,7 +301,7 @@ public final class DexOptHelper { SystemProperties.get("dalvik.vm.systemuicompilerfilter", defaultCompilerFilter); String compilerFilter; if (DexFile.isProfileGuidedCompilerFilter(targetCompilerFilter)) { if (isProfileGuidedCompilerFilter(targetCompilerFilter)) { compilerFilter = defaultCompilerFilter; File profileFile = new File(getPrebuildProfilePath(pkg)); Loading @@ -322,8 +326,16 @@ public final class DexOptHelper { compilerFilter = targetCompilerFilter; } // We don't expect updates in current profiles to be significant here, but // DEXOPT_CHECK_FOR_PROFILES_UPDATES is set to replicate behaviour that will be // unconditionally enabled for profile guided filters when ART Service is called instead of // the legacy PackageDexOptimizer implementation. int dexoptFlags = isProfileGuidedCompilerFilter(compilerFilter) ? DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES : 0; performDexOptTraced(new DexoptOptions(pkg.getPackageName(), REASON_BOOT_AFTER_OTA, compilerFilter, null /* splitName */, 0 /* dexoptFlags */)); compilerFilter, null /* splitName */, dexoptFlags)); } @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) Loading Loading @@ -622,16 +634,21 @@ public final class DexOptHelper { } public boolean performDexOptMode(@NonNull Computer snapshot, String packageName, boolean checkProfiles, String targetCompilerFilter, boolean force, boolean bootComplete, String splitName) { String targetCompilerFilter, boolean force, boolean bootComplete, String splitName) { if (!PackageManagerServiceUtils.isSystemOrRootOrShell() && !isCallerInstallerForPackage(snapshot, packageName)) { throw new SecurityException("performDexOptMode"); } int flags = (checkProfiles ? DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES : 0) | (force ? DexoptOptions.DEXOPT_FORCE : 0) int flags = (force ? DexoptOptions.DEXOPT_FORCE : 0) | (bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0); if (isProfileGuidedCompilerFilter(targetCompilerFilter)) { // Set this flag whenever the filter is profile guided, to align with ART Service // behavior. flags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES; } return performDexOpt(new DexoptOptions(packageName, REASON_CMDLINE, targetCompilerFilter, splitName, flags)); } Loading services/core/java/com/android/server/pm/IPackageManagerBase.java +7 −2 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ import android.os.RemoteException; import android.os.Trace; import android.os.UserHandle; import android.permission.PermissionManager; import android.util.Log; import com.android.internal.R; import com.android.internal.content.InstallLocationUtils; Loading Loading @@ -964,8 +965,12 @@ public abstract class IPackageManagerBase extends IPackageManager.Stub { boolean checkProfiles, String targetCompilerFilter, boolean force, boolean bootComplete, String splitName) { final Computer snapshot = snapshot(); return mDexOptHelper.performDexOptMode(snapshot, packageName, checkProfiles, targetCompilerFilter, force, bootComplete, splitName); if (!checkProfiles) { // There is no longer a flag to skip profile checking. Log.w(PackageManagerService.TAG, "Ignored checkProfiles=false flag"); } return mDexOptHelper.performDexOptMode( snapshot, packageName, targetCompilerFilter, force, bootComplete, splitName); } /** Loading services/core/java/com/android/server/pm/PackageManagerShellCommand.java +7 −20 Original line number Diff line number Diff line Loading @@ -88,7 +88,6 @@ import android.os.ServiceManager; import android.os.ServiceSpecificException; import android.os.ShellCommand; import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; Loading Loading @@ -1787,13 +1786,11 @@ class PackageManagerShellCommand extends ShellCommand { private int runCompile() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); boolean checkProfiles = SystemProperties.getBoolean("dalvik.vm.usejitprofiles", false); boolean forceCompilation = false; boolean allPackages = false; boolean clearProfileData = false; String compilerFilter = null; String compilationReason = null; String checkProfilesRaw = null; boolean secondaryDex = false; String split = null; Loading @@ -1816,7 +1813,9 @@ class PackageManagerShellCommand extends ShellCommand { compilationReason = getNextArgRequired(); break; case "--check-prof": checkProfilesRaw = getNextArgRequired(); getNextArgRequired(); pw.println("Warning: Ignoring obsolete flag --check-prof " + "- it is unconditionally enabled now"); break; case "--reset": forceCompilation = true; Loading @@ -1835,17 +1834,6 @@ class PackageManagerShellCommand extends ShellCommand { } } if (checkProfilesRaw != null) { if ("true".equals(checkProfilesRaw)) { checkProfiles = true; } else if ("false".equals(checkProfilesRaw)) { checkProfiles = false; } else { pw.println("Invalid value for \"--check-prof\". Expected \"true\" or \"false\"."); return 1; } } final boolean compilerFilterGiven = compilerFilter != null; final boolean compilationReasonGiven = compilationReason != null; // Make sure exactly one of -m, or -r is given. Loading Loading @@ -1922,11 +1910,10 @@ class PackageManagerShellCommand extends ShellCommand { } final boolean result = secondaryDex ? mInterface.performDexOptSecondary(packageName, targetCompilerFilter, forceCompilation) : mInterface.performDexOptMode(packageName, checkProfiles, targetCompilerFilter, forceCompilation, true /* bootComplete */, split); ? mInterface.performDexOptSecondary( packageName, targetCompilerFilter, forceCompilation) : mInterface.performDexOptMode(packageName, true /* checkProfiles */, targetCompilerFilter, forceCompilation, true /* bootComplete */, split); if (!result) { failedPackages.add(packageName); } Loading services/core/java/com/android/server/pm/dex/DexoptOptions.java +7 −8 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.server.pm.dex; import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason; import static dalvik.system.DexFile.isProfileGuidedCompilerFilter; import android.annotation.Nullable; import com.android.server.art.ReasonMapping; Loading @@ -26,8 +28,6 @@ import com.android.server.art.model.OptimizeParams; import com.android.server.pm.DexOptHelper; import com.android.server.pm.PackageManagerService; import dalvik.system.DexFile; /** * Options used for dexopt invocations. */ Loading Loading @@ -218,12 +218,11 @@ public final class DexoptOptions { /*@OptimizeFlags*/ int flags = extraFlags; if ((mFlags & DEXOPT_CHECK_FOR_PROFILES_UPDATES) == 0 && DexFile.isProfileGuidedCompilerFilter(mCompilerFilter)) { // ART Service doesn't support bypassing this, so not setting this flag is not // supported. DexOptHelper.reportArtManagerFallback(mPackageName, "DEXOPT_CHECK_FOR_PROFILES_UPDATES not set with profile compiler filter"); return null; && isProfileGuidedCompilerFilter(mCompilerFilter)) { // ART Service doesn't support bypassing the profile update check when profiles are // used, so not setting this flag is not supported. throw new IllegalArgumentException( "DEXOPT_CHECK_FOR_PROFILES_UPDATES must be set with profile guided filter"); } if ((mFlags & DEXOPT_FORCE) != 0) { flags |= ArtFlags.FLAG_FORCE; Loading Loading
services/core/java/com/android/server/pm/BackgroundDexOptService.java +33 −9 Original line number Diff line number Diff line Loading @@ -17,8 +17,11 @@ package com.android.server.pm; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason; import static com.android.server.pm.dex.ArtStatsLogUtils.BackgroundDexoptJobStatsLogger; import static dalvik.system.DexFile.isProfileGuidedCompilerFilter; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -748,10 +751,21 @@ public final class BackgroundDexOptService { return PackageDexOptimizer.DEX_OPT_CANCELLED; } int reason = PackageManagerService.REASON_INACTIVE_PACKAGE_DOWNGRADE; String filter = getCompilerFilterForReason(reason); int dexoptFlags = DexoptOptions.DEXOPT_BOOT_COMPLETE | DexoptOptions.DEXOPT_DOWNGRADE; if (isProfileGuidedCompilerFilter(filter)) { // We don't expect updates in current profiles to be significant here, but // DEXOPT_CHECK_FOR_PROFILES_UPDATES is set to replicate behaviour that will be // unconditionally enabled for profile guided filters when ART Service is called instead // of the legacy PackageDexOptimizer implementation. dexoptFlags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES; } if (!isPostBootUpdate) { dexoptFlags |= DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB; } long package_size_before = getPackageSize(snapshot, pkg); int result = PackageDexOptimizer.DEX_OPT_SKIPPED; if (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg)) { Loading @@ -762,10 +776,10 @@ public final class BackgroundDexOptService { // remove their compiler artifacts from dalvik cache. pm.deleteOatArtifactsOfPackage(snapshot, pkg); } else { result = performDexOptPrimary(pkg, reason, dexoptFlags); result = performDexOptPrimary(pkg, reason, filter, dexoptFlags); } } else { result = performDexOptSecondary(pkg, reason, dexoptFlags); result = performDexOptSecondary(pkg, reason, filter, dexoptFlags); } if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) { Loading Loading @@ -801,32 +815,42 @@ public final class BackgroundDexOptService { private int optimizePackage(String pkg, boolean isForPrimaryDex, boolean isPostBootUpdate) { int reason = isPostBootUpdate ? PackageManagerService.REASON_POST_BOOT : PackageManagerService.REASON_BACKGROUND_DEXOPT; String filter = getCompilerFilterForReason(reason); int dexoptFlags = DexoptOptions.DEXOPT_BOOT_COMPLETE; if (!isPostBootUpdate) { dexoptFlags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES | DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB; } if (isProfileGuidedCompilerFilter(filter)) { // Ensure DEXOPT_CHECK_FOR_PROFILES_UPDATES is enabled if the filter is profile guided, // to replicate behaviour that will be unconditionally enabled when ART Service is // called instead of the legacy PackageDexOptimizer implementation. dexoptFlags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES; } // System server share the same code path as primary dex files. // PackageManagerService will select the right optimization path for it. if (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg)) { return performDexOptPrimary(pkg, reason, dexoptFlags); return performDexOptPrimary(pkg, reason, filter, dexoptFlags); } else { return performDexOptSecondary(pkg, reason, dexoptFlags); return performDexOptSecondary(pkg, reason, filter, dexoptFlags); } } @DexOptResult private int performDexOptPrimary(String pkg, int reason, int dexoptFlags) { DexoptOptions dexoptOptions = new DexoptOptions(pkg, reason, dexoptFlags); private int performDexOptPrimary(String pkg, int reason, String filter, int dexoptFlags) { DexoptOptions dexoptOptions = new DexoptOptions(pkg, reason, filter, /*splitName=*/null, dexoptFlags); return trackPerformDexOpt(pkg, /*isForPrimaryDex=*/true, () -> mDexOptHelper.performDexOptWithStatus(dexoptOptions)); } @DexOptResult private int performDexOptSecondary(String pkg, int reason, int dexoptFlags) { DexoptOptions dexoptOptions = new DexoptOptions( pkg, reason, dexoptFlags | DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX); private int performDexOptSecondary(String pkg, int reason, String filter, int dexoptFlags) { DexoptOptions dexoptOptions = new DexoptOptions(pkg, reason, filter, /*splitName=*/null, dexoptFlags | DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX); return trackPerformDexOpt(pkg, /*isForPrimaryDex=*/false, () -> mDexOptHelper.performDexOpt(dexoptOptions) Loading
services/core/java/com/android/server/pm/DexOptHelper.java +34 −17 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import static com.android.server.pm.PackageManagerServiceCompilerMapping.getDefa import static com.android.server.pm.PackageManagerServiceUtils.REMOVE_IF_APEX_PKG; import static com.android.server.pm.PackageManagerServiceUtils.REMOVE_IF_NULL_PKG; import static dalvik.system.DexFile.isProfileGuidedCompilerFilter; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -70,8 +72,6 @@ import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import dalvik.system.DexFile; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; Loading Loading @@ -236,20 +236,24 @@ public final class DexOptHelper { mPm.mArtManagerService.compileLayouts(pkg); } // checkProfiles is false to avoid merging profiles during boot which // might interfere with background compilation (b/28612421). // Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will // behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a // trade-off worth doing to save boot time work. int dexoptFlags = bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0; String filter = getCompilerFilterForReason(pkgCompilationReason); if (isProfileGuidedCompilerFilter(filter)) { // DEXOPT_CHECK_FOR_PROFILES_UPDATES used to be false to avoid merging profiles // during boot which might interfere with background compilation (b/28612421). // However those problems were related to the verify-profile compiler filter which // doesn't exist any more, so enable it again. dexoptFlags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES; } if (compilationReason == REASON_FIRST_BOOT) { // TODO: This doesn't cover the upgrade case, we should check for this too. dexoptFlags |= DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE; } int primaryDexOptStatus = performDexOptTraced(new DexoptOptions( pkg.getPackageName(), pkgCompilationReason, dexoptFlags)); int primaryDexOptStatus = performDexOptTraced( new DexoptOptions(pkg.getPackageName(), pkgCompilationReason, filter, /*splitName*/ null, dexoptFlags)); switch (primaryDexOptStatus) { case PackageDexOptimizer.DEX_OPT_PERFORMED: Loading Loading @@ -297,7 +301,7 @@ public final class DexOptHelper { SystemProperties.get("dalvik.vm.systemuicompilerfilter", defaultCompilerFilter); String compilerFilter; if (DexFile.isProfileGuidedCompilerFilter(targetCompilerFilter)) { if (isProfileGuidedCompilerFilter(targetCompilerFilter)) { compilerFilter = defaultCompilerFilter; File profileFile = new File(getPrebuildProfilePath(pkg)); Loading @@ -322,8 +326,16 @@ public final class DexOptHelper { compilerFilter = targetCompilerFilter; } // We don't expect updates in current profiles to be significant here, but // DEXOPT_CHECK_FOR_PROFILES_UPDATES is set to replicate behaviour that will be // unconditionally enabled for profile guided filters when ART Service is called instead of // the legacy PackageDexOptimizer implementation. int dexoptFlags = isProfileGuidedCompilerFilter(compilerFilter) ? DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES : 0; performDexOptTraced(new DexoptOptions(pkg.getPackageName(), REASON_BOOT_AFTER_OTA, compilerFilter, null /* splitName */, 0 /* dexoptFlags */)); compilerFilter, null /* splitName */, dexoptFlags)); } @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) Loading Loading @@ -622,16 +634,21 @@ public final class DexOptHelper { } public boolean performDexOptMode(@NonNull Computer snapshot, String packageName, boolean checkProfiles, String targetCompilerFilter, boolean force, boolean bootComplete, String splitName) { String targetCompilerFilter, boolean force, boolean bootComplete, String splitName) { if (!PackageManagerServiceUtils.isSystemOrRootOrShell() && !isCallerInstallerForPackage(snapshot, packageName)) { throw new SecurityException("performDexOptMode"); } int flags = (checkProfiles ? DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES : 0) | (force ? DexoptOptions.DEXOPT_FORCE : 0) int flags = (force ? DexoptOptions.DEXOPT_FORCE : 0) | (bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0); if (isProfileGuidedCompilerFilter(targetCompilerFilter)) { // Set this flag whenever the filter is profile guided, to align with ART Service // behavior. flags |= DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES; } return performDexOpt(new DexoptOptions(packageName, REASON_CMDLINE, targetCompilerFilter, splitName, flags)); } Loading
services/core/java/com/android/server/pm/IPackageManagerBase.java +7 −2 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ import android.os.RemoteException; import android.os.Trace; import android.os.UserHandle; import android.permission.PermissionManager; import android.util.Log; import com.android.internal.R; import com.android.internal.content.InstallLocationUtils; Loading Loading @@ -964,8 +965,12 @@ public abstract class IPackageManagerBase extends IPackageManager.Stub { boolean checkProfiles, String targetCompilerFilter, boolean force, boolean bootComplete, String splitName) { final Computer snapshot = snapshot(); return mDexOptHelper.performDexOptMode(snapshot, packageName, checkProfiles, targetCompilerFilter, force, bootComplete, splitName); if (!checkProfiles) { // There is no longer a flag to skip profile checking. Log.w(PackageManagerService.TAG, "Ignored checkProfiles=false flag"); } return mDexOptHelper.performDexOptMode( snapshot, packageName, targetCompilerFilter, force, bootComplete, splitName); } /** Loading
services/core/java/com/android/server/pm/PackageManagerShellCommand.java +7 −20 Original line number Diff line number Diff line Loading @@ -88,7 +88,6 @@ import android.os.ServiceManager; import android.os.ServiceSpecificException; import android.os.ShellCommand; import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; Loading Loading @@ -1787,13 +1786,11 @@ class PackageManagerShellCommand extends ShellCommand { private int runCompile() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); boolean checkProfiles = SystemProperties.getBoolean("dalvik.vm.usejitprofiles", false); boolean forceCompilation = false; boolean allPackages = false; boolean clearProfileData = false; String compilerFilter = null; String compilationReason = null; String checkProfilesRaw = null; boolean secondaryDex = false; String split = null; Loading @@ -1816,7 +1813,9 @@ class PackageManagerShellCommand extends ShellCommand { compilationReason = getNextArgRequired(); break; case "--check-prof": checkProfilesRaw = getNextArgRequired(); getNextArgRequired(); pw.println("Warning: Ignoring obsolete flag --check-prof " + "- it is unconditionally enabled now"); break; case "--reset": forceCompilation = true; Loading @@ -1835,17 +1834,6 @@ class PackageManagerShellCommand extends ShellCommand { } } if (checkProfilesRaw != null) { if ("true".equals(checkProfilesRaw)) { checkProfiles = true; } else if ("false".equals(checkProfilesRaw)) { checkProfiles = false; } else { pw.println("Invalid value for \"--check-prof\". Expected \"true\" or \"false\"."); return 1; } } final boolean compilerFilterGiven = compilerFilter != null; final boolean compilationReasonGiven = compilationReason != null; // Make sure exactly one of -m, or -r is given. Loading Loading @@ -1922,11 +1910,10 @@ class PackageManagerShellCommand extends ShellCommand { } final boolean result = secondaryDex ? mInterface.performDexOptSecondary(packageName, targetCompilerFilter, forceCompilation) : mInterface.performDexOptMode(packageName, checkProfiles, targetCompilerFilter, forceCompilation, true /* bootComplete */, split); ? mInterface.performDexOptSecondary( packageName, targetCompilerFilter, forceCompilation) : mInterface.performDexOptMode(packageName, true /* checkProfiles */, targetCompilerFilter, forceCompilation, true /* bootComplete */, split); if (!result) { failedPackages.add(packageName); } Loading
services/core/java/com/android/server/pm/dex/DexoptOptions.java +7 −8 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.server.pm.dex; import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason; import static dalvik.system.DexFile.isProfileGuidedCompilerFilter; import android.annotation.Nullable; import com.android.server.art.ReasonMapping; Loading @@ -26,8 +28,6 @@ import com.android.server.art.model.OptimizeParams; import com.android.server.pm.DexOptHelper; import com.android.server.pm.PackageManagerService; import dalvik.system.DexFile; /** * Options used for dexopt invocations. */ Loading Loading @@ -218,12 +218,11 @@ public final class DexoptOptions { /*@OptimizeFlags*/ int flags = extraFlags; if ((mFlags & DEXOPT_CHECK_FOR_PROFILES_UPDATES) == 0 && DexFile.isProfileGuidedCompilerFilter(mCompilerFilter)) { // ART Service doesn't support bypassing this, so not setting this flag is not // supported. DexOptHelper.reportArtManagerFallback(mPackageName, "DEXOPT_CHECK_FOR_PROFILES_UPDATES not set with profile compiler filter"); return null; && isProfileGuidedCompilerFilter(mCompilerFilter)) { // ART Service doesn't support bypassing the profile update check when profiles are // used, so not setting this flag is not supported. throw new IllegalArgumentException( "DEXOPT_CHECK_FOR_PROFILES_UPDATES must be set with profile guided filter"); } if ((mFlags & DEXOPT_FORCE) != 0) { flags |= ArtFlags.FLAG_FORCE; Loading