From cdaf7909d4d6d9714101c4dc51facc70c9e00018 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 4 Jul 2023 23:23:18 +0300 Subject: [PATCH] fix old android crash accenting --- .../vtosters/lite/themes/ThemesManager.java | 5 ++-- .../themes/loaders/AssetManagerHelper.java | 28 ++++--------------- .../lite/themes/loaders/ResourcesLoader.java | 15 +++++----- 3 files changed, 15 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesManager.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesManager.java index 50f465e1e..2158a9764 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ThemesManager.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesManager.java @@ -124,7 +124,7 @@ public class ThemesManager { ResourcesLoader.load(app, modApk.getAbsolutePath(), false); } } catch (Exception e) { - Log.e("ThemesManager", e.getMessage()); + e.printStackTrace(); } } @@ -152,8 +152,7 @@ public class ThemesManager { return validated && modApk.exists() && ThemesUtils.getReservedAccent() != Color.TRANSPARENT; } - public static void generateModApk(int accentColor) - throws Throwable { + public static void generateModApk(int accentColor) throws Throwable { try (var apk = new ZipFile(baseApkPath)) { var arscEntry = apk.getEntry("resources.arsc"); var arscBis = new BufferedInputStream(apk.getInputStream(arscEntry)); diff --git a/app/src/main/java/ru/vtosters/lite/themes/loaders/AssetManagerHelper.java b/app/src/main/java/ru/vtosters/lite/themes/loaders/AssetManagerHelper.java index 6ec7b97a2..1989e2220 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/loaders/AssetManagerHelper.java +++ b/app/src/main/java/ru/vtosters/lite/themes/loaders/AssetManagerHelper.java @@ -2,6 +2,7 @@ package ru.vtosters.lite.themes.loaders; import android.annotation.SuppressLint; import android.content.res.AssetManager; +import android.util.Log; import ru.vtosters.lite.utils.ReflectionUtils; import java.lang.reflect.InvocationTargetException; @@ -9,24 +10,11 @@ import java.lang.reflect.Method; @SuppressLint("PrivateApi") public class AssetManagerHelper { - // methods - private static final Method getAssetPathMtd; - private static final Method getApkAssetsMtd; - - static { - try { - getAssetPathMtd = ReflectionUtils.findMethod(Class.forName("android.content.res.ApkAssets"), "getAssetPath"); - getApkAssetsMtd = ReflectionUtils.findMethod(AssetManager.class, "getApkAssets"); - } catch (ClassNotFoundException | NoSuchMethodException e) { - throw new RuntimeException(); - } - } - - public static String getApkPath(Object assetManager, String packagename) throws InvocationTargetException, IllegalAccessException { - Object[] apkAssetsArr = (Object[]) getAssetPathMtd.invoke(assetManager); + public static String getApkPath(Object assetManager, String packagename) throws InvocationTargetException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException { + Object[] apkAssetsArr = (Object[]) ReflectionUtils.findMethod(Class.forName("android.content.res.ApkAssets"), "getAssetPath").invoke(assetManager); // By default, base apk is the last element of array if is not, for execution speed, we should iterate array from the end to the beginning for (int i = apkAssetsArr.length - 1; i >= 0; i--) { - String pathname = (String) getApkAssetsMtd.invoke(apkAssetsArr[i]); + String pathname = (String) ReflectionUtils.findMethod(AssetManager.class, "getApkAssets").invoke(apkAssetsArr[i]); if (pathname != null && pathname.contains(packagename)) return pathname; } @@ -34,12 +22,8 @@ public class AssetManagerHelper { } //region Uses for adding own assets or getting existing cookies - public static int addAssetPath(AssetManager manager, String path) { - try { - return (int) AssetManager.class.getMethod("addAssetPath", String.class).invoke(manager, path); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - throw new RuntimeException(e); - } + public static void addAssetPath(AssetManager manager, String path) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + manager.getClass().getMethod("addAssetPath", String.class).invoke(manager, path); } public static int addAssetPathAsSharedLibrary(AssetManager manager, String path) { diff --git a/app/src/main/java/ru/vtosters/lite/themes/loaders/ResourcesLoader.java b/app/src/main/java/ru/vtosters/lite/themes/loaders/ResourcesLoader.java index 99340f531..fe1c06413 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/loaders/ResourcesLoader.java +++ b/app/src/main/java/ru/vtosters/lite/themes/loaders/ResourcesLoader.java @@ -14,7 +14,9 @@ import ru.vtosters.lite.utils.ReflectionUtils; import java.io.File; import java.lang.ref.WeakReference; +import java.lang.reflect.Array; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collection; import java.util.List; @@ -25,7 +27,6 @@ public class ResourcesLoader { private static Collection> sResourceReferences = null; private static Object sCurrentActivityThread = null; - private static AssetManager sAssetManager = null; // methods private static Method ensureStringBlocksMtd = null; @@ -89,8 +90,7 @@ public class ResourcesLoader { } } - public static void init(Context context) - throws Exception { + public static void init(Context context) throws Exception { sCurrentActivityThread = ReflectionUtils.getActivityThread(context, null); //pre-N @@ -110,8 +110,7 @@ public class ResourcesLoader { } } - public static void load(Context context, String resPath, boolean reinject) - throws Exception { + public static void load(Context context, String resPath, boolean reinject) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException, NoSuchMethodException { ApplicationInfo appInfo = context.getApplicationInfo(); Field[] packagesFlds = Build.VERSION.SDK_INT < Build.VERSION_CODES.O_MR1 @@ -135,10 +134,10 @@ public class ResourcesLoader { return; } - sAssetManager = AssetManager.class.newInstance(); // Create a new AssetManager instance and point it to the resources installed under - if (AssetManagerHelper.addAssetPath(sAssetManager, resPath) == 0) - throw new IllegalStateException("Could not create new AssetManager"); + AssetManager sAssetManager = AssetManager.class.newInstance(); + + AssetManagerHelper.addAssetPath(sAssetManager, resPath); // Add SharedLibraries to AssetManager for resolve system resources not found issue // This influence SharedLibrary Package ID