Skip to content

Commit a335b19

Browse files
committed
fix(core.loader): 像普通ClassLoader一样优先findLoadedClass
避免重复加载类时反复进行白名单逻辑判断。
1 parent d4b6e9e commit a335b19

File tree

1 file changed

+35
-24
lines changed
  • projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/classloaders

1 file changed

+35
-24
lines changed

projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/classloaders/PluginClassLoader.kt

+35-24
Original file line numberDiff line numberDiff line change
@@ -65,38 +65,49 @@ class PluginClassLoader(
6565

6666
@Throws(ClassNotFoundException::class)
6767
override fun loadClass(className: String, resolve: Boolean): Class<*> {
68-
if (specialClassLoader == null) {//specialClassLoader 为null 表示该classLoader依赖了其他的插件classLoader,需要遵循双亲委派
69-
return super.loadClass(className, resolve)
70-
} else if (className.subStringBeforeDot() == "com.tencent.shadow.core.runtime") {
71-
return loaderClassLoader.loadClass(className)
72-
} else if (className.inPackage(allHostWhiteList)
73-
|| (Build.VERSION.SDK_INT < 28 && className.startsWith("org.apache.http"))) {//Android 9.0以下的系统里面带有http包,走系统的不走本地的) {
74-
return super.loadClass(className, resolve)
75-
} else {
76-
var clazz: Class<*>? = findLoadedClass(className)
68+
var clazz: Class<*>? = findLoadedClass(className)
7769

70+
if (clazz == null) {
71+
//specialClassLoader 为null 表示该classLoader依赖了其他的插件classLoader,需要遵循双亲委派
72+
if (specialClassLoader == null) {
73+
return super.loadClass(className, resolve)
74+
}
75+
76+
//插件依赖跟loader一起打包的runtime类,如ShadowActivity,从loader的ClassLoader加载
77+
if (className.subStringBeforeDot() == "com.tencent.shadow.core.runtime") {
78+
return loaderClassLoader.loadClass(className)
79+
}
80+
81+
//包名在白名单中的类按双亲委派逻辑,从宿主中加载
82+
if (className.inPackage(allHostWhiteList)
83+
//Android 9.0以下的系统里面带有http包,走系统的不走本地的
84+
|| (Build.VERSION.SDK_INT < Build.VERSION_CODES.P
85+
&& className.startsWith("org.apache.http"))
86+
) {
87+
return super.loadClass(className, resolve)
88+
}
89+
90+
var suppressed: ClassNotFoundException? = null
91+
try {
92+
//正常的ClassLoader这里是parent.loadClass,插件用specialClassLoader以跳过parent
93+
clazz = specialClassLoader.loadClass(className)!!
94+
} catch (e: ClassNotFoundException) {
95+
suppressed = e
96+
}
7897
if (clazz == null) {
79-
var suppressed: ClassNotFoundException? = null
8098
try {
81-
clazz = specialClassLoader.loadClass(className)!!
99+
clazz = findClass(className)!!
82100
} catch (e: ClassNotFoundException) {
83-
suppressed = e
84-
}
85-
if (clazz == null) {
86-
try {
87-
clazz = findClass(className)!!
88-
} catch (e: ClassNotFoundException) {
89-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
90-
e.addSuppressed(suppressed)
91-
}
92-
throw e
101+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
102+
e.addSuppressed(suppressed)
93103
}
94-
104+
throw e
95105
}
96-
}
97106

98-
return clazz
107+
}
99108
}
109+
110+
return clazz
100111
}
101112

102113
}

0 commit comments

Comments
 (0)