diff --git a/app/src/main/java/org/meowcat/edxposed/manager/xposed/Enhancement.java b/app/src/main/java/org/meowcat/edxposed/manager/xposed/Enhancement.java index f58f92f9..4a99bd3c 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/xposed/Enhancement.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/xposed/Enhancement.java @@ -12,6 +12,7 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import de.robv.android.xposed.IXposedHookLoadPackage; @@ -32,6 +33,18 @@ public class Enhancement implements IXposedHookLoadPackage { private static final String LEGACY_INSTALLER = "de.robv.android.xposed.installer"; + private static final List HIDE_WHITE_LIST = Arrays.asList( // TODO: more whitelist packages + APPLICATION_ID, // Whitelist or crash + "com.android.providers.downloads", // For download modules + "com.android.providers.downloads.ui", + "com.android.packageinstaller", // For uninstall EdXposed Manager + "com.google.android.packageinstaller", + "com.android.systemui", // For notifications + "com.android.permissioncontroller", // For permissions grant + "com.topjohnwu.magisk", // For superuser root grant + "eu.chainfire.supersu" + ); // System server (uid <= 1000) will auto pass + private static List modulesList = null; private static boolean getFlagState(int user, String flag) { @@ -79,12 +92,16 @@ public class Enhancement implements IXposedHookLoadPackage { protected void afterHookedMethod(MethodHookParam param) { if (param.args != null && param.args[0] != null) { final int userId = (int) param.args[1]; + final int packageUid = Binder.getCallingUid(); boolean isXposedModule = false; final String[] packages = - (String[]) XposedHelpers.callMethod(param.thisObject, "getPackagesForUid", Binder.getCallingUid()); + (String[]) XposedHelpers.callMethod(param.thisObject, "getPackagesForUid", packageUid); + if (packages == null || packages.length == 0 || packageUid <= 1000) { + return; + } for (String packageName : packages) { - if (packageName.equals(APPLICATION_ID)) { + if (HIDE_WHITE_LIST.contains(packageName)) { return; } if (getModulesList(userId).contains(packageName)) { @@ -107,7 +124,7 @@ public class Enhancement implements IXposedHookLoadPackage { } else { if (getFlagState(userId, mHideEdXposedManagerFlag)) { for (ApplicationInfo applicationInfo : applicationInfoList) { - if (applicationInfo.packageName.equals(APPLICATION_ID)) { + if (applicationInfo.packageName.equals(APPLICATION_ID) || applicationInfo.packageName.equals(LEGACY_INSTALLER)) { applicationInfoList.remove(applicationInfo); break; } @@ -124,12 +141,16 @@ public class Enhancement implements IXposedHookLoadPackage { protected void afterHookedMethod(MethodHookParam param) { if (param.args != null && param.args[0] != null) { final int userId = (int) param.args[1]; + final int packageUid = Binder.getCallingUid(); boolean isXposedModule = false; final String[] packages = - (String[]) XposedHelpers.callMethod(param.thisObject, "getPackagesForUid", Binder.getCallingUid()); + (String[]) XposedHelpers.callMethod(param.thisObject, "getPackagesForUid", packageUid); + if (packages == null || packages.length == 0 || packageUid <= 1000) { + return; + } for (String packageName : packages) { - if (packageName.equals(APPLICATION_ID)) { + if (HIDE_WHITE_LIST.contains(packageName)) { return; } if (getModulesList(userId).contains(packageName)) { @@ -152,7 +173,7 @@ public class Enhancement implements IXposedHookLoadPackage { } else { if (getFlagState(userId, mHideEdXposedManagerFlag)) { for (PackageInfo packageInfo : packageInfoList) { - if (packageInfo.packageName.equals(APPLICATION_ID)) { + if (packageInfo.packageName.equals(APPLICATION_ID) || packageInfo.packageName.equals(LEGACY_INSTALLER)) { packageInfoList.remove(packageInfo); break; } @@ -169,12 +190,16 @@ public class Enhancement implements IXposedHookLoadPackage { protected void beforeHookedMethod(MethodHookParam param) { if (param.args != null && param.args[0] != null) { final int userId = (int) param.args[2]; + final int packageUid = Binder.getCallingUid(); boolean isXposedModule = false; final String[] packages = - (String[]) XposedHelpers.callMethod(param.thisObject, "getPackagesForUid", Binder.getCallingUid()); + (String[]) XposedHelpers.callMethod(param.thisObject, "getPackagesForUid", packageUid); + if (packages == null || packages.length == 0 || packageUid <= 1000) { + return; + } for (String packageName : packages) { - if (packageName.equals(APPLICATION_ID)) { + if (HIDE_WHITE_LIST.contains(packageName)) { return; } if (getModulesList(userId).contains(packageName)) { @@ -191,7 +216,7 @@ public class Enhancement implements IXposedHookLoadPackage { } } else { if (getFlagState(userId, mHideEdXposedManagerFlag)) { - if (param.args[0].equals(APPLICATION_ID)) { + if (param.args[0].equals(APPLICATION_ID) || param.args[0].equals(LEGACY_INSTALLER)) { param.setResult(null); } } @@ -206,12 +231,16 @@ public class Enhancement implements IXposedHookLoadPackage { protected void beforeHookedMethod(MethodHookParam param) { if (param.args != null && param.args[0] != null) { final int userId = (int) param.args[2]; + final int packageUid = Binder.getCallingUid(); boolean isXposedModule = false; final String[] packages = - (String[]) XposedHelpers.callMethod(param.thisObject, "getPackagesForUid", Binder.getCallingUid()); + (String[]) XposedHelpers.callMethod(param.thisObject, "getPackagesForUid", packageUid); + if (packages == null || packages.length == 0 || packageUid <= 1000) { + return; + } for (String packageName : packages) { - if (packageName.equals(APPLICATION_ID)) { + if (HIDE_WHITE_LIST.contains(packageName)) { return; } if (getModulesList(userId).contains(packageName)) { @@ -228,7 +257,7 @@ public class Enhancement implements IXposedHookLoadPackage { } } else { if (getFlagState(userId, mHideEdXposedManagerFlag)) { - if (param.args[0].equals(APPLICATION_ID)) { + if (param.args[0].equals(APPLICATION_ID) || param.args[0].equals(LEGACY_INSTALLER)) { param.setResult(null); } } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 06c56619..3a1d1f01 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -302,6 +302,7 @@ 着色应用栏 主题 惨白设计 + 版本 %d 启用 EdXposed 的增强功能:\n - 判断 Xposed 是否正常工作\n - 移除针对 EdXposed 的后台限制\n - 假装安装了 Xposed Installer\n - 隐藏 EdXposed Manager 增强模式已激活 增强模式 @@ -309,7 +310,7 @@ 未激活\n你可以在「模块」中启用增强模块 已激活 Xposed Installer 伪装 - 假装已安装 Xposed Installer 来使一些过时但有用的模块正常工作\n注:开启此功能可能会被某些软件(如 RootBeer)检测到 EdXposed + 假装已安装 Xposed Installer 来使一些过时但有用的模块正常工作\n仅对「模块」中已启用模块生效\n注:开启此功能可能会被某些软件(如 RootBeer)检测到 EdXposed 隐藏 EdXposed Manager - 防止软件检测到 EdXposed Manager\n注:模块可能无法正常打开 Manager 界面 + 防止软件检测到 EdXposed Manager\n注:模块可能无法正常打开 EdXposed Manager 界面,系统中关于 EdXposed Manager 的一些功能可能无法正常使用 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 113c79e2..72dc4d20 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -333,6 +333,7 @@ Colorized action bar Theme Material Design 2 + Version %d Enable EdXposed enhancements:\nRemove background restrictions on EdXposed\nDetermine if Xposed is working properly\nPretend to have Xposed Installer installed\nHide EdXposed Manager Enhancement mode Enhancement mode @@ -340,8 +341,7 @@ Disabled\nYou can enable enhancement mode in the module Enabled Pretend to have Xposed Installer installed - Pretend that Xposed Installer is installed to make some outdated but useful modules work\nWARNING: Some software (eg. RootBeer) may detect that EdXposed when this function is turned on + Pretend that Xposed Installer is installed to make some outdated but useful modules work\nOnly work for the enabled modules in \"Modules\"\nWARNING: Some software (eg. RootBeer) may detect that EdXposed when this function is turned on Hide EdXposed Manager - Prevent the software from detecting EdXposed Manager\nWARNING: Modules may not be able to start the Manager UI properly - Version %d + Prevent the software from detecting EdXposed Manager\nWARNING: Modules may not be able to start the EdXposed Manager UI properly, some fratures of EdXposed Manager in the system may not work properly