From 1ef2b2b6eba29af497cc0d7b03d192cd8a2c1776 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Thu, 23 Apr 2020 11:57:36 -0700 Subject: [PATCH] Handle variable class loader context for system server Do not dexopt system server dex files which have a variable class-loader context. We could extract them but that will interfer with ZygoteInit code which will try to verify them again. As part of this change, also improve PackageDexOptimizer error handling, logging wtf message when we cannot retrieve the dexoptStatus. Test: manual Bug: 154789494 Change-Id: I8a8181ce637b13e5cab10267c50c0dccb187b15b --- .../com/android/server/pm/PackageDexOptimizer.java | 3 +++ .../java/com/android/server/pm/dex/DexManager.java | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 4b8a24204ca78..0d8ba3e548014 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -725,6 +725,9 @@ public class PackageDexOptimizer { } catch (IOException ioe) { Slog.w(TAG, "IOException reading apk: " + path, ioe); return DEX_OPT_FAILED; + } catch (Exception e) { + Slog.wtf(TAG, "Unexpected exception when calling dexoptNeeded on " + path, e); + return DEX_OPT_FAILED; } return adjustDexoptNeeded(dexoptNeeded); } diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index f7bf1d985786d..95a81f099e2db 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -548,6 +548,16 @@ public class DexManager { continue; } + if (dexUseInfo.isUnsupportedClassLoaderContext() + || dexUseInfo.isVariableClassLoaderContext()) { + String debugMsg = dexUseInfo.isUnsupportedClassLoaderContext() + ? "unsupported" + : "variable"; + Slog.w(TAG, "Skipping dexopt for system server path loaded with " + debugMsg + + " class loader context: " + dexPath); + continue; + } + int newResult = pdo.dexoptSystemServerPath(dexPath, dexUseInfo, overriddenOptions); // The end result is: