Breaking the
Android ClassLoader
Zac Sweers
@pandanomic
Photo by Vitalis Hirschmann on Unsplash
Slide 2
Slide 2 text
ClassLoader
Slide 3
Slide 3 text
class ClassLoader
Slide 4
Slide 4 text
class ClassLoader {a
Class loadClass(String name);
Class findClass(String name);
Class defineClass(...);
URL getResource(String name);
// A few others
}a
Slide 5
Slide 5 text
class ClassLoader {a
Class loadClass(String name);
Class findClass(String name);
Class defineClass(...);
URL getResource(String name);
// A few others
}a
Slide 6
Slide 6 text
class URLClassLoader {a
Class loadClass(String name) {
// Go fetch them from a jar
}a
}a
Slide 7
Slide 7 text
class URLClassLoader {a
Class loadClass(String name) {
// Go fetch them from a jar
}a
}a
Slide 8
Slide 8 text
class URLClassLoader {a
Class loadClass(String name) {
// Go fetch them from a jar
}a
}a
Slide 9
Slide 9 text
class URLClassLoader {a
// ClassLoader parent
Class loadClass(String name)
}a
Slide 10
Slide 10 text
class URLClassLoader {a
// ClassLoader parent
Class loadClass(String name)
}a
Slide 11
Slide 11 text
Class loadClass(String name)
Slide 12
Slide 12 text
package example;
class Foo {
private Bar bar;
}a
Slide 13
Slide 13 text
package example;
class Foo {
private Bar bar;
}a
loadClass("example.Foo")
Slide 14
Slide 14 text
package example;
class Foo {
private Bar bar;
}a
loadClass("example.Foo")
Foo.class.getClassLoader().loadClass("example.Bar")
Slide 15
Slide 15 text
No content
Slide 16
Slide 16 text
class PathClassLoader
Slide 17
Slide 17 text
class PathClassLoader
class DexClassLoader
Slide 18
Slide 18 text
class PathClassLoader extends BaseDexClassLoader
class DexClassLoader extends BaseDexClassLoader
Slide 19
Slide 19 text
class BaseDexClassLoader {a
DexPathList pathList
}a
Slide 20
Slide 20 text
class BaseDexClassLoader {a
DexPathList pathList
// --> DexFile, etc
}a
Slide 21
Slide 21 text
class BaseDexClassLoader {a
DexPathList pathList
// --> DexFile, etc
}a
class CustomClassLoader extends PathClassLoader {
@Override public Class loadClass(String name) {
Log.d("ClLoading", "Loading " + name);
return super.loadClass(name);
}
}
Slide 29
Slide 29 text
CustomClassLoader cl = new CustomClassLoader(...);
Slide 30
Slide 30 text
CustomClassLoader cl = new CustomClassLoader(...);
// set java.lang.ClassLoader$SystemClassLoader.loader
Slide 31
Slide 31 text
CustomClassLoader cl = new CustomClassLoader(...);
// set java.lang.ClassLoader$SystemClassLoader.loader
Thread.currentThread().setContextClassLoader(cl)
Slide 32
Slide 32 text
CustomClassLoader cl = new CustomClassLoader(...);
// set java.lang.ClassLoader$SystemClassLoader.loader
Thread.currentThread().setContextClassLoader(cl)
ContextImpl
Slide 33
Slide 33 text
CustomClassLoader cl = new CustomClassLoader(...);
// set java.lang.ClassLoader$SystemClassLoader.loader
Thread.currentThread().setContextClassLoader(cl)
ContextImpl.mClassLoader
Slide 34
Slide 34 text
CustomClassLoader cl = new CustomClassLoader(...);
// set java.lang.ClassLoader$SystemClassLoader.loader
Thread.currentThread().setContextClassLoader(cl)
ContextImpl
Slide 35
Slide 35 text
CustomClassLoader cl = new CustomClassLoader(...);
// set java.lang.ClassLoader$SystemClassLoader.loader
Thread.currentThread().setContextClassLoader(cl)
ContextImpl.mPackageInfo
Slide 36
Slide 36 text
CustomClassLoader cl = new CustomClassLoader(...);
// set java.lang.ClassLoader$SystemClassLoader.loader
Thread.currentThread().setContextClassLoader(cl)
ContextImpl.mPackageInfo.mClassLoader