Merge "Pass the compilation reason to dexopt"

This commit is contained in:
Calin Juravle
2018-02-16 02:25:48 +00:00
committed by Gerrit Code Review
9 changed files with 57 additions and 33 deletions

View File

@@ -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: "

View File

@@ -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);
}

View File

@@ -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());
}

View File

@@ -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;

View File

@@ -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.

View File

@@ -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];
}
}

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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());