From 7afdf55eecd06aa6b8b331d1598840cf797ae273 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Sat, 7 Jan 2023 01:14:13 +0800 Subject: [PATCH] Refine xresources --- .../java/android/content/res/XResources.java | 28 +++++-------------- .../de/robv/android/xposed/XposedInit.java | 6 ++-- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/android/content/res/XResources.java b/core/src/main/java/android/content/res/XResources.java index fe76524e..70141386 100644 --- a/core/src/main/java/android/content/res/XResources.java +++ b/core/src/main/java/android/content/res/XResources.java @@ -91,34 +91,17 @@ public class XResources extends XposedResources { private static final WeakHashMap sXmlInstanceDetails = new WeakHashMap<>(); private static final String EXTRA_XML_INSTANCE_DETAILS = "xmlInstanceDetails"; - private static final ThreadLocal> sIncludedLayouts = new ThreadLocal>() { - @Override - protected LinkedList initialValue() { - return new LinkedList<>(); - } - }; + private static final ThreadLocal> sIncludedLayouts = ThreadLocal.withInitial(() -> new LinkedList<>()); private static final HashMap sResDirLastModified = new HashMap<>(); private static final HashMap sResDirPackageNames = new HashMap<>(); private static ThreadLocal sLatestResKey = null; - private boolean mIsObjectInited; private String mResDir; private String mPackageName; - public XResources(ClassLoader classLoader) { + public XResources(ClassLoader classLoader, String resDir) { super(classLoader); - } - - /** Dummy, will never be called (objects are transferred to this class only). */ -// private XResources() { -// throw new UnsupportedOperationException(); -// } - - /** @hide */ - public void initObject(String resDir) { - if (mIsObjectInited) - throw new IllegalStateException("Object has already been initialized"); this.mResDir = resDir; this.mPackageName = getPackageName(resDir); @@ -128,10 +111,13 @@ public class XResources extends XposedResources { mReplacementsCache = sReplacementsCacheMap.computeIfAbsent(resDir, k -> new byte[128]); } } - - this.mIsObjectInited = true; } + /** Dummy, will never be called (objects are transferred to this class only). */ +// private XResources() { +// throw new UnsupportedOperationException(); +// } + /** @hide */ public boolean isFirstLoad() { synchronized (sReplacements) { diff --git a/core/src/main/java/de/robv/android/xposed/XposedInit.java b/core/src/main/java/de/robv/android/xposed/XposedInit.java index 3ee8d967..56a57027 100644 --- a/core/src/main/java/de/robv/android/xposed/XposedInit.java +++ b/core/src/main/java/de/robv/android/xposed/XposedInit.java @@ -183,9 +183,8 @@ public final class XposedInit { // Replace system resources XResources systemRes = new XResources( - (ClassLoader) XposedHelpers.getObjectField(Resources.getSystem(), "mClassLoader")); + (ClassLoader) XposedHelpers.getObjectField(Resources.getSystem(), "mClassLoader"), null); HiddenApiBridge.Resources_setImpl(systemRes, (ResourcesImpl) XposedHelpers.getObjectField(Resources.getSystem(), "mResourcesImpl")); - systemRes.initObject(null); setStaticObjectField(Resources.class, "mSystem", systemRes); XResources.init(latestResKey); @@ -199,9 +198,8 @@ public final class XposedInit { // Replace the returned resources with our subclass. var newRes = new XResources( - (ClassLoader) XposedHelpers.getObjectField(param.getResult(), "mClassLoader")); + (ClassLoader) XposedHelpers.getObjectField(param.getResult(), "mClassLoader"), resDir); HiddenApiBridge.Resources_setImpl(newRes, (ResourcesImpl) XposedHelpers.getObjectField(param.getResult(), "mResourcesImpl")); - newRes.initObject(resDir); // Invoke handleInitPackageResources(). if (newRes.isFirstLoad()) {