From 2c563ec9e28103bdfff673caa4a30d9fd0705a41 Mon Sep 17 00:00:00 2001
From: NekoInverter <42698724+NekoInverter@users.noreply.github.com>
Date: Sat, 4 Apr 2020 15:15:18 +0800
Subject: [PATCH] Enhancement module
---
app/build.gradle | 10 +-
app/src/main/AndroidManifest.xml | 12 +++
.../manager/StatusInstallerFragment.java | 11 ++-
.../edxposed/manager/adapters/AppHelper.java | 4 +-
.../edxposed/manager/xposed/Enhancement.java | 91 +++++++++++++++++++
app/src/main/res/values-zh-rCN/strings.xml | 2 +
app/src/main/res/values/strings.xml | 2 +
7 files changed, 125 insertions(+), 7 deletions(-)
create mode 100644 app/src/main/java/org/meowcat/edxposed/manager/xposed/Enhancement.java
diff --git a/app/build.gradle b/app/build.gradle
index 18635773..4a856134 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -24,15 +24,14 @@ android {
}
}
compileSdkVersion 29
- //noinspection GradleDependency
- buildToolsVersion "29.0.2"
+ buildToolsVersion "29.0.3"
defaultConfig {
applicationId "org.meowcat.edxposed.manager"
minSdkVersion 26
//noinspection OldTargetApi
targetSdkVersion 27
- versionCode 45611
- versionName "4.5.6.1"
+ versionCode 457000
+ versionName "4.5.7.1"
signingConfig signingConfigs.release
}
buildTypes {
@@ -73,6 +72,7 @@ dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.takisoft.preferencex:preferencex:1.1.0'
implementation 'com.takisoft.preferencex:preferencex-colorpicker:1.1.0'
- implementation 'com.github.NekoInverter.preferencex-android:preferencex-simplemenu:88f93154b2'
+ implementation 'tech.rectifier.preferencex-android:preferencex-simplemenu:88f93154b2'
implementation 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar'
+ compileOnly 'de.robv.android.xposed:api:82'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 89011554..3e9c1018 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -106,6 +106,18 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/org/meowcat/edxposed/manager/StatusInstallerFragment.java b/app/src/main/java/org/meowcat/edxposed/manager/StatusInstallerFragment.java
index 7ce22345..64a02d8d 100644
--- a/app/src/main/java/org/meowcat/edxposed/manager/StatusInstallerFragment.java
+++ b/app/src/main/java/org/meowcat/edxposed/manager/StatusInstallerFragment.java
@@ -44,6 +44,10 @@ public class StatusInstallerFragment extends Fragment {
.setNegativeButton(R.string.later, null).show());
}
+ public static boolean isEnhancementEnabled() {
+ return false;
+ }
+
private static void update(Context context) {
Uri uri = Uri.parse(updateLink);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
@@ -103,7 +107,12 @@ public class StatusInstallerFragment extends Fragment {
installedXposedVersion = null;
}
- String mAppVer = "v" + BuildConfig.VERSION_NAME + " (" + BuildConfig.VERSION_CODE + ")";
+ String mAppVer;
+ if (isEnhancementEnabled()) {
+ mAppVer = String.format("v%s (%s) (%s)", BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, getString(R.string.status_enhancement));
+ } else {
+ mAppVer = String.format("v%s (%s)", BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE);
+ }
binding.manager.setText(mAppVer);
if (installedXposedVersion != null) {
int installedXposedVersionInt = extractIntPart(installedXposedVersion);
diff --git a/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java b/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java
index bd867157..c36622c9 100644
--- a/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java
+++ b/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java
@@ -18,6 +18,7 @@ import androidx.fragment.app.FragmentManager;
import org.meowcat.edxposed.manager.BuildConfig;
import org.meowcat.edxposed.manager.R;
+import org.meowcat.edxposed.manager.StatusInstallerFragment;
import org.meowcat.edxposed.manager.XposedApp;
import org.meowcat.edxposed.manager.util.CompileUtil;
@@ -26,6 +27,7 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -44,7 +46,7 @@ public class AppHelper {
private static final String WHITE_LIST_MODE = "conf/usewhitelist";
private static final String BLACK_LIST_MODE = "conf/blackwhitelist";
- private static final List FORCE_WHITE_LIST = new ArrayList<>(Collections.singletonList(BuildConfig.APPLICATION_ID));
+ private static final List FORCE_WHITE_LIST = new ArrayList<>(StatusInstallerFragment.isEnhancementEnabled() ? Arrays.asList(BuildConfig.APPLICATION_ID, "android") : Collections.singletonList(BuildConfig.APPLICATION_ID));
public static List FORCE_WHITE_LIST_MODULE = new ArrayList<>(FORCE_WHITE_LIST);
@SuppressWarnings("OctalInteger")
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
new file mode 100644
index 00000000..ddadff78
--- /dev/null
+++ b/app/src/main/java/org/meowcat/edxposed/manager/xposed/Enhancement.java
@@ -0,0 +1,91 @@
+package org.meowcat.edxposed.manager.xposed;
+import android.os.Build;
+
+import de.robv.android.xposed.IXposedHookLoadPackage;
+import de.robv.android.xposed.XC_MethodHook;
+import de.robv.android.xposed.XC_MethodReplacement;
+import de.robv.android.xposed.XposedBridge;
+import de.robv.android.xposed.XposedHelpers;
+import de.robv.android.xposed.callbacks.XC_LoadPackage;
+
+import static org.meowcat.edxposed.manager.BuildConfig.APPLICATION_ID;
+
+public class Enhancement implements IXposedHookLoadPackage {
+
+ private static final String LEGACY_INSTALLER = "de.robv.android.xposed.installer";
+
+ private static void hookAllMethods(String className, ClassLoader classLoader, String methodName, XC_MethodHook callback) {
+ try {
+ Class> hookClass = XposedHelpers.findClassIfExists(className, classLoader);
+ if (hookClass == null || XposedBridge.hookAllMethods(hookClass, methodName, callback).size() == 0)
+ XposedBridge.log("Failed to hook " + methodName + " method in " + className);
+ } catch (Throwable t) {
+ XposedBridge.log(t);
+ }
+ }
+
+ @Override
+ public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
+ if (lpparam.packageName.equals("android")) {
+ // Hook PM to pretend to have legacy Xposed Installer installed
+ hookAllMethods("com.android.server.pm.PackageManagerService", lpparam.classLoader, "getApplicationInfo", new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) {
+ if (param.args != null && param.args[0] != null) {
+ if (param.args[0].equals(LEGACY_INSTALLER)) {
+ param.args[0] = APPLICATION_ID;
+ }
+ }
+
+ }
+ });
+ hookAllMethods("com.android.server.pm.PackageManagerService", lpparam.classLoader, "getPackageInfo", new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) {
+ if (param.args != null && param.args[0] != null) {
+ if (param.args[0].equals(LEGACY_INSTALLER)) {
+ param.args[0] = APPLICATION_ID;
+ }
+ }
+ }
+ });
+ // Hook AM to remove restrict of EdXposed Manager
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ hookAllMethods("com.android.server.am.ActivityManagerService", lpparam.classLoader, "appRestrictedInBackgroundLocked", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) {
+ if (param.args != null && param.args[1] != null) {
+ if (param.args[1].equals(APPLICATION_ID)) {
+ param.setResult(0);
+ }
+ }
+ }
+ });
+ hookAllMethods("com.android.server.am.ActivityManagerService", lpparam.classLoader, "appServicesRestrictedInBackgroundLocked", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) {
+ if (param.args != null && param.args[1] != null) {
+ if (param.args[1].equals(APPLICATION_ID)) {
+ param.setResult(0);
+ }
+ }
+ }
+ });
+ hookAllMethods("com.android.server.am.ActivityManagerService", lpparam.classLoader, "getAppStartModeLocked", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) {
+ if (param.args != null && param.args[1] != null) {
+ if (param.args[1].equals(APPLICATION_ID)) {
+ param.setResult(0);
+ }
+ }
+ }
+ });
+ }
+ } else if (lpparam.packageName.equals(APPLICATION_ID)) {
+ // Make sure Xposed work
+ XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.StatusInstallerFragment", lpparam.classLoader, "isEnhancementEnabled", XC_MethodReplacement.returnConstant(true));
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 46455adc..af363c78 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -302,4 +302,6 @@
着色应用栏
主题
惨白设计
+ 启用 EdXposed 的增强功能:\n判断 Xposed 是否正常工作\n移除针对 EdXposed 的后台限制\n假装安装了 Xposed Installer
+ 增强模式已激活
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 30336506..7f070899 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -333,4 +333,6 @@
Colorized action bar
Theme
Material Design 2
+ Enable EdXposed enhancements:\nRemove background restrictions on EdXposed\nDetermine if Xposed is working properly\nPretend to have Xposed Installer installed
+ Enhancement mode