Merge "Pass the compilation reason to dexopt"
This commit is contained in:
@@ -576,7 +576,8 @@ public class ZygoteInit {
|
||||
installd.dexopt(classPathElement, Process.SYSTEM_UID, packageName,
|
||||
instructionSet, dexoptNeeded, outputPath, dexFlags, compilerFilter,
|
||||
uuid, classLoaderContext, seInfo, false /* downgrade */,
|
||||
targetSdkVersion, /*profileName*/ null, /*dexMetadataPath*/ null);
|
||||
targetSdkVersion, /*profileName*/ null, /*dexMetadataPath*/ null,
|
||||
"server-dexopt");
|
||||
} catch (RemoteException | ServiceSpecificException e) {
|
||||
// Ignore (but log), we need this on the classpath for fallback mode.
|
||||
Log.w(TAG, "Failed compiling classpath element for system server: "
|
||||
|
||||
@@ -286,14 +286,14 @@ public class Installer extends SystemService {
|
||||
int dexoptNeeded, @Nullable String outputPath, int dexFlags,
|
||||
String compilerFilter, @Nullable String volumeUuid, @Nullable String sharedLibraries,
|
||||
@Nullable String seInfo, boolean downgrade, int targetSdkVersion,
|
||||
@Nullable String profileName, @Nullable String dexMetadataPath)
|
||||
throws InstallerException {
|
||||
@Nullable String profileName, @Nullable String dexMetadataPath,
|
||||
@Nullable String compilationReason) throws InstallerException {
|
||||
assertValidInstructionSet(instructionSet);
|
||||
if (!checkBeforeRemote()) return;
|
||||
try {
|
||||
mInstalld.dexopt(apkPath, uid, pkgName, instructionSet, dexoptNeeded, outputPath,
|
||||
dexFlags, compilerFilter, volumeUuid, sharedLibraries, seInfo, downgrade,
|
||||
targetSdkVersion, profileName, dexMetadataPath);
|
||||
targetSdkVersion, profileName, dexMetadataPath, compilationReason);
|
||||
} catch (Exception e) {
|
||||
throw InstallerException.from(e);
|
||||
}
|
||||
|
||||
@@ -262,11 +262,12 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
|
||||
int dexFlags, String compilerFilter, @Nullable String volumeUuid,
|
||||
@Nullable String sharedLibraries, @Nullable String seInfo, boolean downgrade,
|
||||
int targetSdkVersion, @Nullable String profileName,
|
||||
@Nullable String dexMetadataPath) throws InstallerException {
|
||||
@Nullable String dexMetadataPath, @Nullable String dexoptCompilationReason)
|
||||
throws InstallerException {
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
|
||||
// The version. Right now it's 6.
|
||||
builder.append("6 ");
|
||||
// The version. Right now it's 7.
|
||||
builder.append("7 ");
|
||||
|
||||
builder.append("dexopt");
|
||||
|
||||
@@ -285,6 +286,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
|
||||
encodeParameter(builder, targetSdkVersion);
|
||||
encodeParameter(builder, profileName);
|
||||
encodeParameter(builder, dexMetadataPath);
|
||||
encodeParameter(builder, dexoptCompilationReason);
|
||||
|
||||
commands.add(builder.toString());
|
||||
}
|
||||
|
||||
@@ -34,7 +34,6 @@ import android.util.Slog;
|
||||
import com.android.internal.annotations.GuardedBy;
|
||||
import com.android.internal.util.IndentingPrintWriter;
|
||||
import com.android.server.pm.Installer.InstallerException;
|
||||
import com.android.server.pm.dex.DexManager;
|
||||
import com.android.server.pm.dex.DexoptOptions;
|
||||
import com.android.server.pm.dex.DexoptUtils;
|
||||
import com.android.server.pm.dex.PackageDexUsage;
|
||||
@@ -63,7 +62,8 @@ import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
|
||||
|
||||
import static com.android.server.pm.PackageManagerService.WATCHDOG_TIMEOUT;
|
||||
|
||||
import static dalvik.system.DexFile.getNonProfileGuidedCompilerFilter;
|
||||
import static com.android.server.pm.PackageManagerServiceCompilerMapping.getReasonName;
|
||||
|
||||
import static dalvik.system.DexFile.getSafeModeCompilerFilter;
|
||||
import static dalvik.system.DexFile.isProfileGuidedCompilerFilter;
|
||||
|
||||
@@ -236,7 +236,8 @@ public class PackageDexOptimizer {
|
||||
for (String dexCodeIsa : dexCodeInstructionSets) {
|
||||
int newResult = dexOptPath(pkg, path, dexCodeIsa, compilerFilter,
|
||||
profileUpdated, classLoaderContexts[i], dexoptFlags, sharedGid,
|
||||
packageStats, options.isDowngrade(), profileName, dexMetadataPath);
|
||||
packageStats, options.isDowngrade(), profileName, dexMetadataPath,
|
||||
options.getCompilationReason());
|
||||
// The end result is:
|
||||
// - FAILED if any path failed,
|
||||
// - PERFORMED if at least one path needed compilation,
|
||||
@@ -261,7 +262,7 @@ public class PackageDexOptimizer {
|
||||
private int dexOptPath(PackageParser.Package pkg, String path, String isa,
|
||||
String compilerFilter, boolean profileUpdated, String classLoaderContext,
|
||||
int dexoptFlags, int uid, CompilerStats.PackageStats packageStats, boolean downgrade,
|
||||
String profileName, String dexMetadataPath) {
|
||||
String profileName, String dexMetadataPath, int compilationReason) {
|
||||
int dexoptNeeded = getDexoptNeeded(path, isa, compilerFilter, classLoaderContext,
|
||||
profileUpdated, downgrade);
|
||||
if (Math.abs(dexoptNeeded) == DexFile.NO_DEXOPT_NEEDED) {
|
||||
@@ -288,7 +289,7 @@ public class PackageDexOptimizer {
|
||||
mInstaller.dexopt(path, uid, pkg.packageName, isa, dexoptNeeded, oatDir, dexoptFlags,
|
||||
compilerFilter, pkg.volumeUuid, classLoaderContext, pkg.applicationInfo.seInfo,
|
||||
false /* downgrade*/, pkg.applicationInfo.targetSdkVersion,
|
||||
profileName, dexMetadataPath);
|
||||
profileName, dexMetadataPath, getReasonName(compilationReason));
|
||||
|
||||
if (packageStats != null) {
|
||||
long endTime = System.currentTimeMillis();
|
||||
@@ -399,7 +400,7 @@ public class PackageDexOptimizer {
|
||||
// Note this trades correctness for performance since the resulting slow down is
|
||||
// unacceptable in some cases until b/64530081 is fixed.
|
||||
String classLoaderContext = SKIP_SHARED_LIBRARY_CHECK;
|
||||
|
||||
int reason = options.getCompilationReason();
|
||||
try {
|
||||
for (String isa : dexUseInfo.getLoaderIsas()) {
|
||||
// Reuse the same dexopt path as for the primary apks. We don't need all the
|
||||
@@ -410,7 +411,7 @@ public class PackageDexOptimizer {
|
||||
/*oatDir*/ null, dexoptFlags,
|
||||
compilerFilter, info.volumeUuid, classLoaderContext, info.seInfoUser,
|
||||
options.isDowngrade(), info.targetSdkVersion, /*profileName*/ null,
|
||||
/*dexMetadataPath*/ null);
|
||||
/*dexMetadataPath*/ null, getReasonName(reason));
|
||||
}
|
||||
|
||||
return DEX_OPT_PERFORMED;
|
||||
|
||||
@@ -575,6 +575,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
|
||||
// Compilation reasons.
|
||||
public static final int REASON_UNKNOWN = -1;
|
||||
public static final int REASON_FIRST_BOOT = 0;
|
||||
public static final int REASON_BOOT = 1;
|
||||
public static final int REASON_INSTALL = 2;
|
||||
@@ -9710,7 +9711,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
|
||||
final long startTime = System.nanoTime();
|
||||
final int[] stats = performDexOptUpgrade(pkgs, mIsPreNUpgrade /* showDialog */,
|
||||
getCompilerFilterForReason(causeFirstBoot ? REASON_FIRST_BOOT : REASON_BOOT),
|
||||
causeFirstBoot ? REASON_FIRST_BOOT : REASON_BOOT,
|
||||
false /* bootComplete */);
|
||||
|
||||
final int elapsedTimeSeconds =
|
||||
@@ -9737,7 +9738,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
* and {@code numberOfPackagesFailed}.
|
||||
*/
|
||||
private int[] performDexOptUpgrade(List<PackageParser.Package> pkgs, boolean showDialog,
|
||||
final String compilerFilter, boolean bootComplete) {
|
||||
final int compilationReason, boolean bootComplete) {
|
||||
|
||||
int numberOfPackagesVisited = 0;
|
||||
int numberOfPackagesOptimized = 0;
|
||||
@@ -9837,13 +9838,11 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
String pkgCompilerFilter = compilerFilter;
|
||||
int pkgCompilationReason = compilationReason;
|
||||
if (useProfileForDexopt) {
|
||||
// Use background dexopt mode to try and use the profile. Note that this does not
|
||||
// guarantee usage of the profile.
|
||||
pkgCompilerFilter =
|
||||
PackageManagerServiceCompilerMapping.getCompilerFilterForReason(
|
||||
PackageManagerService.REASON_BACKGROUND_DEXOPT);
|
||||
pkgCompilationReason = PackageManagerService.REASON_BACKGROUND_DEXOPT;
|
||||
}
|
||||
|
||||
// checkProfiles is false to avoid merging profiles during boot which
|
||||
@@ -9854,7 +9853,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
int dexoptFlags = bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0;
|
||||
int primaryDexOptStaus = performDexOptTraced(new DexoptOptions(
|
||||
pkg.packageName,
|
||||
pkgCompilerFilter,
|
||||
pkgCompilationReason,
|
||||
dexoptFlags));
|
||||
|
||||
switch (primaryDexOptStaus) {
|
||||
@@ -9954,8 +9953,8 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
int flags = (checkProfiles ? DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES : 0) |
|
||||
(force ? DexoptOptions.DEXOPT_FORCE : 0) |
|
||||
(bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0);
|
||||
return performDexOpt(new DexoptOptions(packageName, targetCompilerFilter,
|
||||
splitName, flags));
|
||||
return performDexOpt(new DexoptOptions(packageName, REASON_UNKNOWN,
|
||||
targetCompilerFilter, splitName, flags));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -10064,7 +10063,8 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
final String[] instructionSets = getAppDexInstructionSets(p.applicationInfo);
|
||||
if (!deps.isEmpty()) {
|
||||
DexoptOptions libraryOptions = new DexoptOptions(options.getPackageName(),
|
||||
options.getCompilerFilter(), options.getSplitName(),
|
||||
options.getCompilationReason(), options.getCompilerFilter(),
|
||||
options.getSplitName(),
|
||||
options.getFlags() | DexoptOptions.DEXOPT_AS_SHARED_LIBRARY);
|
||||
for (PackageParser.Package depPackage : deps) {
|
||||
// TODO: Analyze and investigate if we (should) profile libraries.
|
||||
|
||||
@@ -123,4 +123,14 @@ public class PackageManagerServiceCompilerMapping {
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
public static String getReasonName(int reason) {
|
||||
if (reason == PackageManagerService.REASON_UNKNOWN) {
|
||||
return "unknown";
|
||||
}
|
||||
if (reason < 0 || reason >= REASON_STRINGS.length) {
|
||||
throw new IllegalArgumentException("reason " + reason + " invalid");
|
||||
}
|
||||
return REASON_STRINGS[reason];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -549,13 +549,12 @@ public class DexManager {
|
||||
mPackageDexUsage.maybeWriteAsync();
|
||||
}
|
||||
|
||||
// Try to optimize the package according to the install reason.
|
||||
String compilerFilter = PackageManagerServiceCompilerMapping.getCompilerFilterForReason(
|
||||
PackageManagerService.REASON_INSTALL);
|
||||
DexUseInfo dexUseInfo = mPackageDexUsage.getPackageUseInfo(searchResult.mOwningPackageName)
|
||||
.getDexUseInfoMap().get(dexPath);
|
||||
|
||||
DexoptOptions options = new DexoptOptions(info.packageName, compilerFilter, /*flags*/0);
|
||||
// Try to optimize the package according to the install reason.
|
||||
DexoptOptions options = new DexoptOptions(info.packageName,
|
||||
PackageManagerService.REASON_INSTALL, /*flags*/0);
|
||||
|
||||
int result = mPackageDexOptimizer.dexOptSecondaryDexPath(info, dexPath, dexUseInfo,
|
||||
options);
|
||||
|
||||
@@ -77,15 +77,21 @@ public final class DexoptOptions {
|
||||
// It only applies for primary apk and it's always null if mOnlySecondaryDex is true.
|
||||
private final String mSplitName;
|
||||
|
||||
// The reason for invoking dexopt (see PackageManagerService.REASON_* constants).
|
||||
// A -1 value denotes an unknown reason.
|
||||
private final int mCompilationReason;
|
||||
|
||||
public DexoptOptions(String packageName, String compilerFilter, int flags) {
|
||||
this(packageName, compilerFilter, /*splitName*/ null, flags);
|
||||
this(packageName, /*compilationReason*/ -1, compilerFilter, /*splitName*/ null, flags);
|
||||
}
|
||||
|
||||
public DexoptOptions(String packageName, int compilerReason, int flags) {
|
||||
this(packageName, getCompilerFilterForReason(compilerReason), flags);
|
||||
public DexoptOptions(String packageName, int compilationReason, int flags) {
|
||||
this(packageName, compilationReason, getCompilerFilterForReason(compilationReason),
|
||||
/*splitName*/ null, flags);
|
||||
}
|
||||
|
||||
public DexoptOptions(String packageName, String compilerFilter, String splitName, int flags) {
|
||||
public DexoptOptions(String packageName, int compilationReason, String compilerFilter,
|
||||
String splitName, int flags) {
|
||||
int validityMask =
|
||||
DEXOPT_CHECK_FOR_PROFILES_UPDATES |
|
||||
DEXOPT_FORCE |
|
||||
@@ -104,6 +110,7 @@ public final class DexoptOptions {
|
||||
mCompilerFilter = compilerFilter;
|
||||
mFlags = flags;
|
||||
mSplitName = splitName;
|
||||
mCompilationReason = compilationReason;
|
||||
}
|
||||
|
||||
public String getPackageName() {
|
||||
@@ -157,4 +164,8 @@ public final class DexoptOptions {
|
||||
public int getFlags() {
|
||||
return mFlags;
|
||||
}
|
||||
|
||||
public int getCompilationReason() {
|
||||
return mCompilationReason;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ public class DexoptOptionsTests {
|
||||
public void testCreateDexoptOptionsSplit() {
|
||||
int flags = DexoptOptions.DEXOPT_FORCE | DexoptOptions.DEXOPT_BOOT_COMPLETE;
|
||||
|
||||
DexoptOptions opt = new DexoptOptions(mPackageName, mCompilerFilter, mSplitName, flags);
|
||||
DexoptOptions opt = new DexoptOptions(mPackageName, -1, mCompilerFilter, mSplitName, flags);
|
||||
assertEquals(mPackageName, opt.getPackageName());
|
||||
assertEquals(mCompilerFilter, opt.getCompilerFilter());
|
||||
assertEquals(mSplitName, opt.getSplitName());
|
||||
|
||||
Reference in New Issue
Block a user