@@ -65,38 +65,49 @@ class PluginClassLoader(
65
65
66
66
@Throws(ClassNotFoundException ::class )
67
67
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)
77
69
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
+ }
78
97
if (clazz == null ) {
79
- var suppressed: ClassNotFoundException ? = null
80
98
try {
81
- clazz = specialClassLoader.loadClass (className)!!
99
+ clazz = findClass (className)!!
82
100
} 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)
93
103
}
94
-
104
+ throw e
95
105
}
96
- }
97
106
98
- return clazz
107
+ }
99
108
}
109
+
110
+ return clazz
100
111
}
101
112
102
113
}
0 commit comments