From 12047ded309340ba5b638ea98a7addbc443b94a8 Mon Sep 17 00:00:00 2001 From: NekoInverter <7741672-NekoInverter@users.noreply.gitlab.com> Date: Sun, 17 Jan 2021 21:20:31 +0800 Subject: [PATCH] Add new manager hook --- build.gradle | 15 +++ edxp-common/build.gradle | 6 ++ .../riru/edxp/config/BaseEdxpConfig.java | 4 - .../riru/edxp/config/ConfigManager.java | 2 - .../edxp/hooker/XposedInstallerHooker.java | 92 ++++++++++++++++--- edxp-core/build.gradle | 5 +- .../cpp/main/src/jni/edxp_config_manager.cpp | 5 - edxp-core/template_override/customize.sh | 1 - .../riru/edxp/config/EdxpConfig.java | 2 - 9 files changed, 102 insertions(+), 30 deletions(-) diff --git a/build.gradle b/build.gradle index 755b822c..348d5bc5 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,22 @@ buildscript { } allprojects { + // Values set here will be overriden by AppVeyor, feel free to modify during development. + def buildVersionName = 'v0.5.2.0' + def buildVersionCode = 233 + + if (System.env.APPVEYOR_BUILD_VERSION != null) { + buildVersionName = "v${System.getenv('appveyor_build_version')}" + } + + if (System.env.APPVEYOR_BUILD_NUMBER != null) { + // Split is necessary because PRs set the build number to "1234-something". + def parts = System.env.APPVEYOR_BUILD_NUMBER.split('-') + buildVersionCode = Integer.valueOf(parts[0]) + } ext { + versionCode = buildVersionCode + versionName = buildVersionName templateRootPath = project(":edxp-core").projectDir.path + "/template_override/" templateSystemPath = templateRootPath + "/system/" templateSystemx86Path = templateRootPath + "/system_x86/" diff --git a/edxp-common/build.gradle b/edxp-common/build.gradle index 55b22170..e94a4d20 100644 --- a/edxp-common/build.gradle +++ b/edxp-common/build.gradle @@ -14,6 +14,12 @@ android { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + buildConfigField("String", "VERSION_NAME", "\"${rootProject.ext.versionName}\"") + buildConfigField("Integer", "VERSION_CODE", String.valueOf(rootProject.ext.versionCode)) + } + debug { + buildConfigField("String", "VERSION_NAME", "\"${rootProject.ext.versionName}\"") + buildConfigField("Integer", "VERSION_CODE", String.valueOf(rootProject.ext.versionCode)) } } diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseEdxpConfig.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseEdxpConfig.java index 01ed9f7b..fd50b699 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseEdxpConfig.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseEdxpConfig.java @@ -19,10 +19,6 @@ public class BaseEdxpConfig implements EdxpConfig { return ConfigManager.getInstallerPackageName(); } - @Override - public String getXposedPropPath() { - return ConfigManager.getXposedPropPath(); - } @Override public String getLibSandHookName() { return ConfigManager.getLibSandHookName(); diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java index 1d877d21..b361cc26 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/ConfigManager.java @@ -37,8 +37,6 @@ public class ConfigManager { public static native String getInstallerPackageName(); - public static native String getXposedPropPath(); - public static native String getLibSandHookName(); public static native String getConfigPath(String suffix); diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/hooker/XposedInstallerHooker.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/hooker/XposedInstallerHooker.java index f944ce32..ddce5f6c 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/hooker/XposedInstallerHooker.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/hooker/XposedInstallerHooker.java @@ -10,10 +10,13 @@ import android.view.ViewGroup; import com.elderdrivers.riru.edxp.config.ConfigManager; import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal; +import com.elderdrivers.riru.edxp.common.BuildConfig; +import com.elderdrivers.riru.edxp.core.EdxpImpl; +import com.elderdrivers.riru.edxp.core.Main; import com.elderdrivers.riru.edxp.util.Utils; +import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import de.robv.android.xposed.XC_MethodHook; @@ -54,10 +57,27 @@ public class XposedInstallerHooker { Utils.logD("reloadXposedProp already done, skip..."); return; } - File file = new File(ConfigManager.getXposedPropPath()); - FileInputStream is = null; - try { - is = new FileInputStream(file); + //version=92.0-$version ($backend) + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("version="); + stringBuilder.append(XposedBridge.getXposedVersion()); + stringBuilder.append(".0-"); + stringBuilder.append(BuildConfig.VERSION_NAME); + stringBuilder.append(" ("); + String variant = "None"; + switch (Main.getEdxpVariant()) { + case EdxpImpl.NONE: + break; + case EdxpImpl.YAHFA: + variant = "YAHFA"; + break; + case EdxpImpl.SANDHOOK: + variant = "SandHook"; + break; + } + stringBuilder.append(variant); + stringBuilder.append(")"); + try (ByteArrayInputStream is = new ByteArrayInputStream(stringBuilder.toString().getBytes())) { Object props = XposedHelpers.callStaticMethod(InstallZipUtil, "parseXposedProp", is); synchronized (thisObject) { @@ -66,14 +86,7 @@ public class XposedInstallerHooker { Utils.logD("reloadXposedProp done..."); param.setResult(null); } catch (IOException e) { - Utils.logE("Could not read " + file.getPath(), e); - } finally { - if (is != null) { - try { - is.close(); - } catch (IOException ignored) { - } - } + Utils.logE("Could not reloadXposedProp", e); } } }); @@ -106,6 +119,59 @@ public class XposedInstallerHooker { } catch (Throwable t) { Utils.logE("Could not hook Xposed Installer", t); } + + // for new manager + try { + XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedApiVersion", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { + return XposedBridge.getXposedVersion(); + } + }); + XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedVersion", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { + return BuildConfig.VERSION_NAME; + } + }); + XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedVersionCode", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { + return BuildConfig.VERSION_CODE; + } + }); + XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedApiVersion", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { + return XposedBridge.getXposedVersion(); + } + }); + XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedVariant", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { + String variant = "None"; + switch (Main.getEdxpVariant()) { + case EdxpImpl.NONE: + break; + case EdxpImpl.YAHFA: + variant = "YAHFA"; + break; + case EdxpImpl.SANDHOOK: + variant = "SandHook"; + break; + } + return variant; + } + }); + XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getBaseDir", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { + return ConfigManager.getBaseConfigPath() + "/"; + } + }); + } catch (Throwable t) { + Utils.logE("Could not hook EdXposed Installer", t); + } } private static void deoptMethod(ClassLoader cl, String className, String methodName, Class ...params) { diff --git a/edxp-core/build.gradle b/edxp-core/build.gradle index a5007901..617be754 100644 --- a/edxp-core/build.gradle +++ b/edxp-core/build.gradle @@ -30,7 +30,6 @@ if (System.env.APPVEYOR_BUILD_NUMBER != null) { version buildVersionName ext { - versionCode = buildVersionCode module_name = "EdXposed" jar_dest_dir = "${projectDir}/template_override/system/framework/" is_windows = OperatingSystem.current().isWindows() @@ -73,8 +72,8 @@ android { cppFlags "-std=c++17 -ffixed-x18 -Qunused-arguments -frtti -fomit-frame-pointer" cFlags "-std=gnu99 -ffixed-x18 -Qunused-arguments -frtti -fomit-frame-pointer" arguments "-DRIRU_MODULE_API_VERSION=$moduleMaxRiruApiVersion", - "-DRIRU_MODULE_VERSION=$buildVersionCode", - "-DRIRU_MODULE_VERSION_NAME:STRING=\"$buildVersionName\"" + "-DRIRU_MODULE_VERSION=$rootProject.ext.versionCode", + "-DRIRU_MODULE_VERSION_NAME:STRING=\"$rootProject.ext.versionName\"" } } } diff --git a/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp b/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp index 2bed5a4c..4cf14024 100644 --- a/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp +++ b/edxp-core/src/main/cpp/main/src/jni/edxp_config_manager.cpp @@ -27,10 +27,6 @@ namespace edxp { return env->NewStringUTF(ConfigManager::GetInstance()->GetInstallerPackageName().c_str()); } - static jstring ConfigManager_getXposedPropPath(JNI_START) { - return env->NewStringUTF(ConfigManager::GetInstance()->GetXposedPropPath().c_str()); - } - static jstring ConfigManager_getLibSandHookName(JNI_START) { return env->NewStringUTF(ConfigManager::GetInstance()->GetLibSandHookName().c_str()); } @@ -80,7 +76,6 @@ namespace edxp { NATIVE_METHOD(ConfigManager, isDeoptBootImageEnabled, "()Z"), NATIVE_METHOD(ConfigManager, isNoModuleLogEnabled, "()Z"), NATIVE_METHOD(ConfigManager, getInstallerPackageName, "()Ljava/lang/String;"), - NATIVE_METHOD(ConfigManager, getXposedPropPath, "()Ljava/lang/String;"), NATIVE_METHOD(ConfigManager, getLibSandHookName, "()Ljava/lang/String;"), NATIVE_METHOD(ConfigManager, getDataPathPrefix, "()Ljava/lang/String;"), NATIVE_METHOD(ConfigManager, getConfigPath, diff --git a/edxp-core/template_override/customize.sh b/edxp-core/template_override/customize.sh index 085369ae..dd347f93 100644 --- a/edxp-core/template_override/customize.sh +++ b/edxp-core/template_override/customize.sh @@ -143,7 +143,6 @@ extract "${ZIPFILE}" 'sepolicy.rule' "${MODPATH}" extract "${ZIPFILE}" 'post-fs-data.sh' "${MODPATH}" extract "${ZIPFILE}" 'uninstall.sh' "${MODPATH}" -extract "${ZIPFILE}" 'system/framework/edconfig.jar' "${MODPATH}" extract "${ZIPFILE}" 'system/framework/eddalvikdx.dex' "${MODPATH}" extract "${ZIPFILE}" 'system/framework/eddexmaker.dex' "${MODPATH}" extract "${ZIPFILE}" 'system/framework/edservice.dex' "${MODPATH}" diff --git a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdxpConfig.java b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdxpConfig.java index 2ba46e17..c291563a 100644 --- a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdxpConfig.java +++ b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdxpConfig.java @@ -8,8 +8,6 @@ public interface EdxpConfig { String getInstallerPackageName(); - String getXposedPropPath(); - String getLibSandHookName(); boolean isNoModuleLogEnabled();