Compile secondary dex at boot after OTA
Bug: 38413085 Test: build successful Change-Id: If080281fb3147fea625bcafce91167e8c1439736
This commit is contained in:
@@ -345,6 +345,10 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
|
|||||||
mPackageManagerService.getDexManager().isUsedByOtherApps(pkg.packageName),
|
mPackageManagerService.getDexManager().isUsedByOtherApps(pkg.packageName),
|
||||||
true /* bootComplete */);
|
true /* bootComplete */);
|
||||||
|
|
||||||
|
mPackageManagerService.getDexManager().dexoptSecondaryDex(pkg.packageName,
|
||||||
|
getCompilerFilterForReason(compilationReason),
|
||||||
|
false /* force */,
|
||||||
|
false /* compileOnlySharedDex */);
|
||||||
return commands;
|
return commands;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9340,24 +9340,39 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
// Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will
|
// 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
|
// behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a
|
||||||
// trade-off worth doing to save boot time work.
|
// trade-off worth doing to save boot time work.
|
||||||
int dexOptStatus = performDexOptTraced(pkg.packageName,
|
int primaryDexOptStaus = performDexOptTraced(pkg.packageName,
|
||||||
false /* checkProfiles */,
|
false /* checkProfiles */,
|
||||||
compilerFilter,
|
compilerFilter,
|
||||||
false /* force */,
|
false /* force */,
|
||||||
bootComplete);
|
bootComplete);
|
||||||
switch (dexOptStatus) {
|
|
||||||
case PackageDexOptimizer.DEX_OPT_PERFORMED:
|
boolean secondaryDexOptStatus = true;
|
||||||
numberOfPackagesOptimized++;
|
if (pkg.isSystemApp()) {
|
||||||
break;
|
// Only dexopt shared secondary dex files belonging to system apps to not slow down
|
||||||
case PackageDexOptimizer.DEX_OPT_SKIPPED:
|
// too much boot after an OTA.
|
||||||
numberOfPackagesSkipped++;
|
secondaryDexOptStatus = mDexManager.dexoptSecondaryDex(pkg.packageName,
|
||||||
break;
|
compilerFilter,
|
||||||
case PackageDexOptimizer.DEX_OPT_FAILED:
|
false /* force */,
|
||||||
numberOfPackagesFailed++;
|
true /* compileOnlySharedDex */);
|
||||||
break;
|
}
|
||||||
default:
|
|
||||||
Log.e(TAG, "Unexpected dexopt return code " + dexOptStatus);
|
if (secondaryDexOptStatus) {
|
||||||
break;
|
switch (primaryDexOptStaus) {
|
||||||
|
case PackageDexOptimizer.DEX_OPT_PERFORMED:
|
||||||
|
numberOfPackagesOptimized++;
|
||||||
|
break;
|
||||||
|
case PackageDexOptimizer.DEX_OPT_SKIPPED:
|
||||||
|
numberOfPackagesSkipped++;
|
||||||
|
break;
|
||||||
|
case PackageDexOptimizer.DEX_OPT_FAILED:
|
||||||
|
numberOfPackagesFailed++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Log.e(TAG, "Unexpected dexopt return code " + primaryDexOptStaus);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
numberOfPackagesFailed++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9559,8 +9574,8 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
} else if (isInstantApp(packageName, UserHandle.getCallingUserId())) {
|
} else if (isInstantApp(packageName, UserHandle.getCallingUserId())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mDexManager.reconcileSecondaryDexFiles(packageName);
|
return mDexManager.dexoptSecondaryDex(packageName, compilerFilter, force,
|
||||||
return mDexManager.dexoptSecondaryDex(packageName, compilerFilter, force);
|
/* compileOnlySharedDex*/ false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean performDexOptSecondary(String packageName, int compileReason,
|
public boolean performDexOptSecondary(String packageName, int compileReason,
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ public class DexManager {
|
|||||||
public boolean dexoptSecondaryDex(String packageName, int compilerReason, boolean force) {
|
public boolean dexoptSecondaryDex(String packageName, int compilerReason, boolean force) {
|
||||||
return dexoptSecondaryDex(packageName,
|
return dexoptSecondaryDex(packageName,
|
||||||
PackageManagerServiceCompilerMapping.getCompilerFilterForReason(compilerReason),
|
PackageManagerServiceCompilerMapping.getCompilerFilterForReason(compilerReason),
|
||||||
force);
|
force, /* compileOnlySharedDex */ false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,7 +315,8 @@ public class DexManager {
|
|||||||
* @return true if all secondary dex files were processed successfully (compiled or skipped
|
* @return true if all secondary dex files were processed successfully (compiled or skipped
|
||||||
* because they don't need to be compiled)..
|
* because they don't need to be compiled)..
|
||||||
*/
|
*/
|
||||||
public boolean dexoptSecondaryDex(String packageName, String compilerFilter, boolean force) {
|
public boolean dexoptSecondaryDex(String packageName, String compilerFilter, boolean force,
|
||||||
|
boolean compileOnlySharedDex) {
|
||||||
// Select the dex optimizer based on the force parameter.
|
// Select the dex optimizer based on the force parameter.
|
||||||
// Forced compilation is done through ForcedUpdatePackageDexOptimizer which will adjust
|
// Forced compilation is done through ForcedUpdatePackageDexOptimizer which will adjust
|
||||||
// the necessary dexopt flags to make sure that compilation is not skipped. This avoid
|
// the necessary dexopt flags to make sure that compilation is not skipped. This avoid
|
||||||
@@ -337,6 +338,9 @@ public class DexManager {
|
|||||||
for (Map.Entry<String, DexUseInfo> entry : useInfo.getDexUseInfoMap().entrySet()) {
|
for (Map.Entry<String, DexUseInfo> entry : useInfo.getDexUseInfoMap().entrySet()) {
|
||||||
String dexPath = entry.getKey();
|
String dexPath = entry.getKey();
|
||||||
DexUseInfo dexUseInfo = entry.getValue();
|
DexUseInfo dexUseInfo = entry.getValue();
|
||||||
|
if (compileOnlySharedDex && !dexUseInfo.isUsedByOtherApps()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
PackageInfo pkg = null;
|
PackageInfo pkg = null;
|
||||||
try {
|
try {
|
||||||
pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0,
|
pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0,
|
||||||
|
|||||||
Reference in New Issue
Block a user