@@ -62,15 +62,27 @@ public DexFactory(Logger logger, ClassLoader classLoader, File dexBaseDir, Strin
62
62
static long totalMultiDexTime = 0 ;
63
63
static long totalLoadDexTime = 0 ;
64
64
65
- public Class <?> resolveClass (String name , String className , String [] methodOverrides ) throws ClassNotFoundException , IOException
65
+ public Class <?> resolveClass (String name , String className , String [] methodOverrides , boolean isInterface ) throws ClassNotFoundException , IOException
66
66
{
67
- String fullClassName = className .replace ("$" , "_" ) + CLASS_NAME_LOCATION_SEPARATOR + name ;
67
+ String fullClassName = className .replace ("$" , "_" );
68
+
69
+ if (!isInterface ) {
70
+ fullClassName += CLASS_NAME_LOCATION_SEPARATOR + name ;
71
+ }
68
72
69
73
// try to get pre-generated binding classes
70
74
try
71
75
{
76
+ if (logger .isEnabled ()) {
77
+ logger .write ("getting pre-generated proxy class with name: " + fullClassName .replace ("-" , "_" ));
78
+ }
79
+
72
80
Class <?> pregeneratedClass = classLoader .loadClass (fullClassName .replace ("-" , "_" ));
73
81
82
+ if (logger .isEnabled ()) {
83
+ logger .write ("Pre-generated class found: " + fullClassName .replace ("-" , "_" ));
84
+ }
85
+
74
86
return pregeneratedClass ;
75
87
}
76
88
catch (Exception e )
@@ -85,7 +97,12 @@ public Class<?> resolveClass(String name, String className, String[] methodOverr
85
97
}
86
98
87
99
String classToProxy = this .getClassToProxyName (className );
88
- String dexFilePath = classToProxy + CLASS_NAME_LOCATION_SEPARATOR + name ;
100
+ String dexFilePath = classToProxy ;
101
+
102
+ if (!isInterface ) {
103
+ dexFilePath += CLASS_NAME_LOCATION_SEPARATOR + name ;
104
+ }
105
+
89
106
File dexFile = this .getDexFile (dexFilePath );
90
107
91
108
// generate dex file
@@ -97,7 +114,7 @@ public Class<?> resolveClass(String name, String className, String[] methodOverr
97
114
logger .write ("generating proxy in place" );
98
115
}
99
116
100
- dexFilePath = this .generateDex (name , classToProxy , methodOverrides );
117
+ dexFilePath = this .generateDex (name , classToProxy , methodOverrides , isInterface );
101
118
dexFile = new File (dexFilePath );
102
119
long stopGenTime = System .nanoTime ();
103
120
totalGenTime += stopGenTime - startGenTime ;
@@ -139,6 +156,7 @@ public Class<?> resolveClass(String name, String className, String[] methodOverr
139
156
// be directly used.
140
157
// However, this is the only viable way to get our dynamic classes
141
158
// loaded within the system class loader
159
+
142
160
df = DexFile .loadDex (jarFilePath , new File (this .odexDir , fullClassName ).getAbsolutePath (), 0 );
143
161
result = df .loadClass (fullClassName , classLoader );
144
162
}
@@ -234,7 +252,7 @@ private File getDexFile(String className) throws InvalidClassException
234
252
return null ;
235
253
}
236
254
237
- private String generateDex (String proxyName , String className , String [] methodOverrides ) throws ClassNotFoundException , IOException
255
+ private String generateDex (String proxyName , String className , String [] methodOverrides , boolean isInterface ) throws ClassNotFoundException , IOException
238
256
{
239
257
Class <?> classToProxy = Class .forName (className );
240
258
@@ -249,7 +267,7 @@ private String generateDex(String proxyName, String className, String[] methodOv
249
267
}
250
268
}
251
269
252
- return proxyGenerator .generateProxy (proxyName , classToProxy , methodOverridesSet );
270
+ return proxyGenerator .generateProxy (proxyName , classToProxy , methodOverridesSet , isInterface );
253
271
}
254
272
255
273
private void updateDexThumbAndPurgeCache ()
0 commit comments