aboutsummaryrefslogtreecommitdiff
path: root/dalvik
diff options
context:
space:
mode:
authorCalin Juravle <calin@google.com>2017-07-19 14:18:07 -0700
committerCalin Juravle <calin@google.com>2017-08-03 14:47:19 -0700
commit48f977a3b1791ade9ca162139095a3c7cb41416b (patch)
treea6e10b4424df73ce3697cd929dc62a2bd4fd2e14 /dalvik
parent6ea6973dc177bb57a4558cb6203b4b27a20a8d1e (diff)
downloadlibcore-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.java49
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);
}
}