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