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