From a349dde6064dc310c0d3f1ac7f4445e414515a78 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Wed, 8 May 2019 15:00:07 -0700 Subject: Do not fully compiled debuggable apps Force vmSafeMode behaviour on debuggable apps: - the runtime ignores their compiled code - they generally have lots of methods that could make the compiler used run out of memory Bug: 130828957 Test: manual Merged-In: I946ce15a18729ec6620aca257c52e5b9e4434265 Change-Id: I946ce15a18729ec6620aca257c52e5b9e4434265 --- .../com/android/server/pm/PackageDexOptimizer.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 662352679c3b..6ae05ff50455 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -508,13 +508,25 @@ public class PackageDexOptimizer { */ private String getRealCompilerFilter(ApplicationInfo info, String targetCompilerFilter, boolean isUsedByOtherApps) { - int flags = info.flags; - boolean vmSafeMode = (flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0; // When a priv app is configured to run out of box, only verify it. if (info.isPrivilegedApp() && DexManager.isPackageSelectedToRunOob(info.packageName)) { return "verify"; } - if (vmSafeMode) { + + // We force vmSafeMode on debuggable apps as well: + // - the runtime ignores their compiled code + // - they generally have lots of methods that could make the compiler used run + // out of memory (b/130828957) + // Note that forcing the compiler filter here applies to all compilations (even if they + // are done via adb shell commands). That's ok because right now the runtime will ignore + // the compiled code anyway. The alternative would have been to update either + // PackageDexOptimizer#canOptimizePackage or PackageManagerService#getOptimizablePackages + // but that would have the downside of possibly producing a big odex files which would + // be ignored anyway. + boolean vmSafeModeOrDebuggable = ((info.flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0) + || ((info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0); + + if (vmSafeModeOrDebuggable) { return getSafeModeCompilerFilter(targetCompilerFilter); } -- cgit v1.2.3-59-g8ed1b