From f5ed7d0818946c7a36847d5bb5feef0b190e5b73 Mon Sep 17 00:00:00 2001 From: Vladimir Tagakov Date: Tue, 10 May 2022 07:58:40 -0700 Subject: [PATCH] Traverse parent DexClassLoaders for native libraries in DelegateClassLoader Fixes https://github.com/bazelbuild/bazel/issues/13661 by traversing the class loaders looking for native libraries. Closes #14965. PiperOrigin-RevId: 447733120 --- .../IncrementalClassLoader.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/IncrementalClassLoader.java b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/IncrementalClassLoader.java index fb023f719c2fd9..a1f5c787ba4a30 100644 --- a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/IncrementalClassLoader.java +++ b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/IncrementalClassLoader.java @@ -43,6 +43,11 @@ public Class findClass(String className) throws ClassNotFoundException { return delegateClassLoader.findClass(className); } + @Override + public String findLibrary(String name) { + return delegateClassLoader.findLibrary(name); + } + /** * A class loader whose only purpose is to make {@code findClass()} public. */ @@ -56,6 +61,20 @@ private DelegateClassLoader( public Class findClass(String name) throws ClassNotFoundException { return super.findClass(name); } + + @Override + public String findLibrary(String name) { + String foundLib = super.findLibrary(name); + + for (ClassLoader parent = getParent(); + foundLib == null && parent != null; + parent = parent.getParent()) { + if (parent instanceof BaseDexClassLoader) { + foundLib = ((BaseDexClassLoader) parent).findLibrary(name); + } + } + return foundLib; + } } private static DelegateClassLoader createDelegateClassLoader(