From 0544ab29e15fb59bf38a9e28fa86846befb678f7 Mon Sep 17 00:00:00 2001 From: TonyJiangWJ Date: Thu, 20 Jan 2022 21:43:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DAndroidClassLoader=E5=9C=A8?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E5=B9=B6=E5=8F=91=E6=97=B6=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=AF=BC=E8=87=B4=E7=9A=84=E5=B9=B6=E5=8F=91=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autojs/rhino/AndroidClassLoader.java | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/autojs/src/main/java/com/stardust/autojs/rhino/AndroidClassLoader.java b/autojs/src/main/java/com/stardust/autojs/rhino/AndroidClassLoader.java index ffe93ed9..ce4f8bfa 100644 --- a/autojs/src/main/java/com/stardust/autojs/rhino/AndroidClassLoader.java +++ b/autojs/src/main/java/com/stardust/autojs/rhino/AndroidClassLoader.java @@ -148,22 +148,26 @@ public class AndroidClassLoader extends ClassLoader implements GeneratedClassLoa logger.debug("dex file size: " + file.length()); DexClassLoader loader = new DexClassLoader(file.getPath(), mCacheDir.getPath(), mLibsDir.getPath(), parent); // 根据dex文件名 移除已有的,使得最新载入的在LinkedHashMap末尾 - mDexClassLoaders.remove(file.getName()); - mDexClassLoaders.put(file.getName(), loader); + synchronized (mDexClassLoaders) { + mDexClassLoaders.remove(file.getName()); + mDexClassLoaders.put(file.getName(), loader); + } return loader; } /** * 移除已加载的dex文件 */ - public void unloadAllDex() { - PFiles.deleteFilesOfDir(mCacheDir); - this.mDexClassLoaders.clear(); - if (!mCacheDir.exists()) { - mCacheDir.mkdirs(); - } - if (!mLibsDir.exists()) { - mLibsDir.mkdir(); + public synchronized void unloadAllDex() { + synchronized (mDexClassLoaders) { + PFiles.deleteFilesOfDir(mCacheDir); + this.mDexClassLoaders.clear(); + if (!mCacheDir.exists()) { + mCacheDir.mkdirs(); + } + if (!mLibsDir.exists()) { + mLibsDir.mkdir(); + } } } @@ -241,17 +245,19 @@ public class AndroidClassLoader extends ClassLoader implements GeneratedClassLoa } } if (loadedClass == null) { - ListIterator reverseIterator = new ArrayList<>(mDexClassLoaders.values()).listIterator(mDexClassLoaders.size()); - while (reverseIterator.hasPrevious()) { - DexClassLoader classLoader = reverseIterator.previous(); + synchronized (mDexClassLoaders) { + ListIterator reverseIterator = new ArrayList<>(mDexClassLoaders.values()).listIterator(mDexClassLoaders.size()); + while (reverseIterator.hasPrevious()) { + DexClassLoader classLoader = reverseIterator.previous(); // Log.d(LOG_TAG, "try to load class: " + name + " class loader info: " + classLoader.toString()); - try { - loadedClass = classLoader.loadClass(name); - } catch (Exception e) { - // do nothing - } - if (loadedClass != null) { - break; + try { + loadedClass = classLoader.loadClass(name); + } catch (Exception e) { + // do nothing + } + if (loadedClass != null) { + break; + } } } }