11package com .tns ;
22
3+ import android .os .Handler ;
4+ import android .os .HandlerThread ;
5+ import android .os .Looper ;
6+ import android .os .Message ;
7+ import android .os .Process ;
8+
9+ import com .tns .bindings .ProxyGenerator ;
10+ import com .tns .system .classes .caching .impl .ClassCacheImpl ;
11+ import com .tns .system .classes .loading .ClassStorageService ;
12+ import com .tns .system .classes .loading .impl .ClassStorageServiceImpl ;
13+ import com .tns .system .classloaders .impl .ClassLoadersCollectionImpl ;
14+
315import java .io .File ;
416import java .io .IOException ;
5- import java .nio .ByteBuffer ;
617import java .lang .ref .WeakReference ;
718import java .lang .reflect .Array ;
819import java .lang .reflect .Constructor ;
920import java .lang .reflect .Field ;
1021import java .lang .reflect .Method ;
1122import java .lang .reflect .Modifier ;
23+ import java .nio .ByteBuffer ;
1224import java .util .ArrayList ;
1325import java .util .Arrays ;
1426import java .util .Comparator ;
1527import java .util .Date ;
1628import java .util .HashMap ;
17- import java .util .HashSet ;
1829import java .util .Map ;
1930import java .util .Queue ;
2031import java .util .concurrent .ConcurrentHashMap ;
2132import java .util .concurrent .ConcurrentLinkedQueue ;
2233import java .util .concurrent .atomic .AtomicInteger ;
2334
24- import android .os .Handler ;
25- import android .os .HandlerThread ;
26- import android .os .Looper ;
27- import android .os .Message ;
28- import android .os .Process ;
29- import android .util .Log ;
30- import android .util .SparseArray ;
31-
32- import com .tns .bindings .ProxyGenerator ;
33-
3435public class Runtime {
3536 private native void initNativeScript (int runtimeId , String filesPath , String nativeLibDir , boolean verboseLoggingEnabled , boolean isDebuggable , String packageName ,
3637 Object [] v8Options , String callingDir , int maxLogcatObjectSize , boolean forceLog );
@@ -94,10 +95,6 @@ public static void passSuppressedExceptionToJs(Throwable ex, String methodName)
9495
9596 private boolean initialized ;
9697
97- private final static HashMap <String , Class <?>> classCache = new HashMap <String , Class <?>>();
98-
99- private final static HashSet <ClassLoader > classLoaderCache = new HashSet <ClassLoader >();
100-
10198 private final static String FAILED_CTOR_RESOLUTION_MSG = "Check the number and type of arguments.\n " +
10299 "Primitive types need to be manually wrapped in their respective Object wrappers.\n " +
103100 "If you are creating an instance of an inner class, make sure to always provide reference to the outer `this` as the first argument." ;
@@ -181,6 +178,8 @@ public int compare(Method lhs, Method rhs) {
181178 */
182179 private Map <Integer , Handler > workerIdToHandler = new HashMap <>();
183180
181+ private static final ClassStorageService classStorageService = new ClassStorageServiceImpl (ClassCacheImpl .INSTANCE , ClassLoadersCollectionImpl .INSTANCE );
182+
184183 public Runtime (ClassResolver classResolver , GcListener gcListener , StaticConfiguration config , DynamicConfiguration dynamicConfig , int runtimeId , int workerId , HashMap <Integer , Object > strongInstances , HashMap <Integer , WeakReference <Object >> weakInstances , NativeScriptHashMap <Object , Integer > strongJavaObjectToId , NativeScriptWeakHashMap <Object , Integer > weakJavaObjectToId ) {
185184 this .classResolver = classResolver ;
186185 this .gcListener = gcListener ;
@@ -212,7 +211,7 @@ public Runtime(StaticConfiguration config, DynamicConfiguration dynamicConfigura
212211 this .mainThreadHandler = dynamicConfiguration .mainThreadScheduler .getHandler ();
213212 }
214213
215- classResolver = new ClassResolver (this );
214+ classResolver = new ClassResolver (classStorageService );
216215 currentRuntime .set (this );
217216
218217 runtimeCache .put (this .runtimeId , this );
@@ -236,7 +235,7 @@ public static Runtime getCurrentRuntime() {
236235
237236 public static boolean isDebuggable () {
238237 Runtime runtime = com .tns .Runtime .getCurrentRuntime ();
239- if (runtime != null ) {
238+ if (runtime != null ) {
240239 return runtime .config .isDebuggable ;
241240 } else {
242241 return false ;
@@ -265,7 +264,7 @@ private static String getStackTraceOnly(String content) {
265264 lines = Arrays .copyOfRange (lines , 1 , lines .length );
266265 }
267266 String result = "" ;
268- for (String line : lines ) {
267+ for (String line : lines ) {
269268 result += line + "\n " ;
270269 }
271270 return result ;
@@ -284,7 +283,7 @@ public static String getStackTraceErrorMessage(Throwable ex) {
284283 content = baos .toString ("US-ASCII" );
285284 if (ex instanceof NativeScriptException ) {
286285 content = getStackTraceOnly (content );
287- content = ((NativeScriptException )ex ).getIncomingStackTrace () + content ;
286+ content = ((NativeScriptException ) ex ).getIncomingStackTrace () + content ;
288287 }
289288 } catch (java .io .UnsupportedEncodingException e ) {
290289 content = e .getMessage ();
@@ -599,7 +598,7 @@ private void init(Logger logger, String appName, String nativeLibDir, File rootD
599598 try {
600599 this .logger = logger ;
601600
602- this .dexFactory = new DexFactory (logger , classLoader , dexDir , dexThumb );
601+ this .dexFactory = new DexFactory (logger , classLoader , dexDir , dexThumb , classStorageService );
603602
604603 if (logger .isEnabled ()) {
605604 logger .write ("Initializing NativeScript JAVA" );
@@ -784,25 +783,7 @@ private void createJSInstance(Object instance) {
784783
785784 @ RuntimeCallable
786785 private static String [] getTypeMetadata (String className , int index ) throws ClassNotFoundException {
787- Class <?> clazz = classCache .get (className );
788-
789- if (clazz == null ) {
790- for (ClassLoader classLoader : classLoaderCache ) {
791- try {
792- clazz = classLoader .loadClass (className );
793- if (clazz != null ) {
794- classCache .put (className , clazz );
795- break ;
796- }
797- } catch (ClassNotFoundException e1 ) {
798- Log .w ("JS" , "Dynamically loading class " + className + " was unsuccessful. Will attempt to load class from alternative ClassLoader." );
799- }
800- }
801- if (clazz == null ) {
802- clazz = Class .forName (className );
803- classCache .put (className , clazz );
804- }
805- }
786+ Class <?> clazz = classStorageService .retrieveClass (className );
806787
807788 String [] result = getTypeMetadata (clazz , index );
808789
@@ -924,14 +905,7 @@ private void makeInstanceStrong(Object instance, int objectId) {
924905 strongJavaObjectToID .put (instance , key );
925906
926907 Class <?> clazz = instance .getClass ();
927- String className = clazz .getName ();
928- if (!classCache .containsKey (className )) {
929- classCache .put (className , clazz );
930- ClassLoader clazzloader = clazz .getClassLoader ();
931- if (!classLoaderCache .contains (clazzloader )) {
932- classLoaderCache .add (clazzloader );
933- }
934- }
908+ classStorageService .storeClass (clazz .getName (), clazz );
935909
936910 if (logger != null && logger .isEnabled ()) {
937911 logger .write ("MakeInstanceStrong (" + key + ", " + instance .getClass ().toString () + ")" );
@@ -1156,16 +1130,8 @@ private Object[] packageArgs(Object... args) {
11561130 return packagedArgs ;
11571131 }
11581132
1159- static Class <?> getClassForName (String className ) throws ClassNotFoundException {
1160- Class <?> clazz = classCache .get (className );
1161- if (clazz == null ) {
1162- clazz = Class .forName (className );
1163- if (clazz != null ) {
1164- classCache .put (className , clazz );
1165- }
1166- }
1167-
1168- return clazz ;
1133+ static Class <?> getClassForName (String className ) {
1134+ return classStorageService .retrieveClass (className );
11691135 }
11701136
11711137 @ RuntimeCallable
@@ -1191,7 +1157,8 @@ private String resolveMethodOverload(String className, String methodName, Object
11911157 logger .write ("resolveMethodOverload: Resolving method " + methodName + " on class " + className );
11921158 }
11931159
1194- Class <?> clazz = getClassForName (className );
1160+ Class <?> clazz = classStorageService .retrieveClass (className );
1161+
11951162
11961163 String res = MethodResolver .resolveMethodOverload (clazz , methodName , args );
11971164 if (logger .isEnabled ()) {
@@ -1306,8 +1273,14 @@ public void run() {
13061273
13071274 @ RuntimeCallable
13081275 private static Class <?> getCachedClass (String className ) {
1309- Class <?> clazz = classCache .get (className );
1310- return clazz ;
1276+ Class <?> clazz ;
1277+
1278+ try {
1279+ clazz = classStorageService .retrieveClass (className );
1280+ return clazz ;
1281+ } catch (RuntimeException e ){
1282+ return null ;
1283+ }
13111284 }
13121285
13131286 @ RuntimeCallable
0 commit comments