diff options
author | Calin Juravle <calin@google.com> | 2017-07-19 14:18:07 -0700 |
---|---|---|
committer | Calin Juravle <calin@google.com> | 2017-08-03 14:47:19 -0700 |
commit | 48f977a3b1791ade9ca162139095a3c7cb41416b (patch) | |
tree | a6e10b4424df73ce3697cd929dc62a2bd4fd2e14 /dalvik | |
parent | 6ea6973dc177bb57a4558cb6203b4b27a20a8d1e (diff) | |
download | libcore-48f977a3b1791ade9ca162139095a3c7cb41416b.tar.gz |
Extend dex load reporting to report the full ClassLoader chain
Report the full class loader chain to BaseDexClassLoader.reporter during
construction. The information will be passed down to the compiler when
compiling secondary dex modules.
Note that this only reports if the all class loader in the chain are
BaseDexClassLoader. This means that we will stop recording secondary dex
modules which are loaded in unsupported class loaders.
Bug: 38138251
Test: vogar
luni/src/test/java/libcore/dalvik/system/BaseDexClassLoaderTest.java
(cherry picked from commit 5ac512c07cfa80160e240c359349c1390a20a981)
Change-Id: I7d4457b19684d0a87b1edd3b5689cfbb58559d03
Diffstat (limited to 'dalvik')
-rw-r--r-- | dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java b/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java index bab2f469919..0863abd6743 100644 --- a/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java +++ b/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java @@ -65,7 +65,39 @@ public class BaseDexClassLoader extends ClassLoader { this.pathList = new DexPathList(this, dexPath, librarySearchPath, null); if (reporter != null) { - reporter.report(this.pathList.getDexPaths()); + reportClassLoaderChain(); + } + } + + /** + * Reports the current class loader chain to the registered {@code reporter}. + * The chain is reported only if all its elements are {@code BaseDexClassLoader}. + */ + private void reportClassLoaderChain() { + ArrayList<BaseDexClassLoader> classLoadersChain = new ArrayList<>(); + ArrayList<String> classPaths = new ArrayList<>(); + + classLoadersChain.add(this); + classPaths.add(String.join(File.pathSeparator, pathList.getDexPaths())); + + boolean onlySawSupportedClassLoaders = true; + ClassLoader bootClassLoader = ClassLoader.getSystemClassLoader().getParent(); + ClassLoader current = getParent(); + + while (current != null && current != bootClassLoader) { + if (current instanceof BaseDexClassLoader) { + BaseDexClassLoader bdcCurrent = (BaseDexClassLoader) current; + classLoadersChain.add(bdcCurrent); + classPaths.add(String.join(File.pathSeparator, bdcCurrent.pathList.getDexPaths())); + } else { + onlySawSupportedClassLoaders = false; + break; + } + current = current.getParent(); + } + + if (onlySawSupportedClassLoaders) { + reporter.report(classLoadersChain, classPaths); } } @@ -206,6 +238,19 @@ public class BaseDexClassLoader extends ClassLoader { * @hide */ public interface Reporter { - public void report(List<String> dexPaths); + /** + * Reports the construction of a BaseDexClassLoader and provides information about the + * class loader chain. + * Note that this only reports if all class loader in the chain are BaseDexClassLoader. + * + * @param classLoadersChain the chain of class loaders used during the construction of the + * class loader. The first element is the BaseDexClassLoader being constructed, + * the second element is its parent, and so on. + * @param classPaths the class paths of the class loaders present in + * {@param classLoadersChain}. The first element corresponds to the first class + * loader and so on. A classpath is represented as a list of dex files separated by + * {@code File.pathSeparator}. + */ + void report(List<BaseDexClassLoader> classLoadersChain, List<String> classPaths); } } |