├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ └── xposed_init │ ├── java │ └── com │ │ └── trump │ │ └── myxposed │ │ ├── App.java │ │ ├── Constant.java │ │ ├── XposedInit.java │ │ ├── hook │ │ ├── AbsHook.java │ │ ├── MiuiAnalyticsHook.java │ │ ├── MiuiGuardHook.java │ │ ├── MiuiPersonalAssistantHook.java │ │ ├── TestHook.java │ │ ├── VmosProHook.java │ │ └── WeicoHook.java │ │ ├── ui │ │ └── MainActivity.java │ │ └── util │ │ ├── SPUtil.java │ │ ├── Utils.java │ │ └── XSpUtil.java │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ └── ic_launcher_background.xml │ ├── layout │ ├── activity_main.xml │ └── item_setting_view.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── values-night │ └── themes-night.xml │ └── values │ ├── arrays.xml │ ├── attrs.xml │ ├── colors.xml │ ├── strings.xml │ ├── styles.xml │ └── themes.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | /.idea 16 | apk 17 | /app/release/ 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MyXposed 2 | 3 | 个人自用的Xposed模块 4 | 5 | ## 微博轻享版 6 | 7 | * 去除开屏广告 8 | * 去除时间线广告 支持6.1.7 6.2.6 6.3.8 9 | * 强制暗黑模式 10 | * 去除首页右下角发布按钮 11 | 12 | 13 | ## MIUI [参考noguardpls](https://github.com/Xposed-Modules-Repo/cn.fyyr.noguardpls) 14 | 15 | * 阻止GuardProvider的跟踪行为 16 | * 欺骗Analytics为无网络状态 17 | 18 | ## todo 19 | 20 | * ... 21 | 22 | 23 | 24 | ### 更新历史 25 | 26 | #### 微博版本 27 | 28 | v1.3 29 | 新增兼容-微博轻享版6.3.8 30 | 31 | v1.1 32 | 新增兼容-微博轻享版6.2.6 33 | 34 | v1.0 35 | 支持-微博轻享版6.1.7 36 | 37 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | } 4 | 5 | android { 6 | compileSdk 33 7 | //buildToolsVersion "31.0.0" 8 | 9 | defaultConfig { 10 | applicationId "com.trump.myxposed" 11 | minSdkVersion 22 12 | targetSdkVersion 33 13 | versionCode 4 14 | versionName "1.3" 15 | 16 | } 17 | 18 | signingConfigs { 19 | release { 20 | storeFile file('D:\\Personnal\\wangyuan.jks') 21 | storePassword "wangyuan" 22 | keyAlias "wangyuan" 23 | keyPassword "wangyuan" 24 | } 25 | } 26 | 27 | buildTypes { 28 | debug { 29 | minifyEnabled false 30 | signingConfig signingConfigs.release 31 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 32 | } 33 | release { 34 | minifyEnabled false 35 | signingConfig signingConfigs.release 36 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 37 | } 38 | } 39 | 40 | compileOptions { 41 | sourceCompatibility JavaVersion.VERSION_11 42 | targetCompatibility JavaVersion.VERSION_11 43 | } 44 | 45 | sourceSets { 46 | main { 47 | jniLibs.srcDirs = ['libs'] 48 | } 49 | } 50 | 51 | lintOptions { 52 | checkReleaseBuilds false 53 | abortOnError false 54 | } 55 | 56 | buildFeatures { 57 | dataBinding true 58 | } 59 | } 60 | 61 | dependencies { 62 | implementation 'androidx.appcompat:appcompat:1.6.1' 63 | implementation 'com.google.android.material:material:1.9.0' 64 | 65 | implementation 'com.github.zhaokaiqiang.klog:library:1.6.0' 66 | 67 | compileOnly 'de.robv.android.xposed:api:82' 68 | compileOnly 'de.robv.android.xposed:api:82:sources' 69 | 70 | // For developers using AndroidX in their applications 71 | implementation 'pub.devrel:easypermissions:3.0.0' 72 | implementation 'com.google.code.gson:gson:2.8.9' 73 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 15 | 16 | 17 | 20 | 21 | 22 | 25 | 26 | 27 | 30 | 31 | 32 | 35 | 36 | 37 | 40 | 41 | 42 | 43 | 44 | 45 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /app/src/main/assets/xposed_init: -------------------------------------------------------------------------------- 1 | com.trump.myxposed.XposedInit -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/App.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed; 2 | 3 | import android.app.Application; 4 | 5 | import com.socks.library.KLog; 6 | 7 | /** 8 | * Author: TRUMP 9 | * Date: 2022/2/10 0010 15:00 10 | * Desc: 主入口 11 | */ 12 | public class App extends Application { 13 | 14 | private static App instance; 15 | 16 | public static App getContext() { 17 | return instance; 18 | } 19 | 20 | @Override 21 | public void onCreate() { 22 | super.onCreate(); 23 | 24 | instance = this; 25 | 26 | KLog.init(true); 27 | 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/Constant.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed; 2 | 3 | public interface Constant { 4 | 5 | interface PackageIds { 6 | String wechat = "com.tencent.mm"; 7 | String weico = "com.weico.international"; //微博国际版 8 | String vmos = "com.vmos.pro"; //vmos 9 | 10 | String miui_guardprovider = "com.miui.guardprovider"; 11 | 12 | String miui_analytics = "com.miui.analytics"; 13 | 14 | String miui_personalassistant = "com.miui.personalassistant"; 15 | } 16 | 17 | String SpFileName = "MyXposed"; 18 | 19 | String activityNameAlias = "com.trump.myxposed.ui.MainActivityAlias"; 20 | 21 | interface SpKey { 22 | String darkMode = "darkMode"; 23 | String hidePostBtn = "hidePostBtn"; 24 | 25 | String swFuckMiuiGuard = "swFuckMiuiGuard"; 26 | 27 | String swFuckMiuiAnalytics = "swFuckMiuiAnalytics"; 28 | } 29 | 30 | /** 31 | * 各个加固厂商的入口特征 32 | */ 33 | interface StubName { 34 | //360加固 35 | String c360 = "com.stub.StubApp"; 36 | //腾讯御安全 37 | String cTenctent = "com.wrapper.proxyapplication.WrapperProxyApplication"; 38 | //梆梆加固 39 | String cBangBang = "com.SecShell.SecShell.AW"; 40 | //百度加固 41 | String cBaiDu = "com.sagittarius.v6.StubApplication"; 42 | //爱加密加固 43 | String cAiJiaMi = "coms.h.e.l.l.S"; // 这里hook 需要采用log.e去打log 不然直接拦截 只有log.e ijm才会放行 44 | //... 45 | 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/XposedInit.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed; 2 | 3 | import android.content.SharedPreferences; 4 | 5 | import com.socks.library.KLog; 6 | import com.trump.myxposed.hook.MiuiAnalyticsHook; 7 | import com.trump.myxposed.hook.MiuiGuardHook; 8 | import com.trump.myxposed.hook.MiuiPersonalAssistantHook; 9 | import com.trump.myxposed.hook.VmosProHook; 10 | import com.trump.myxposed.hook.WeicoHook; 11 | import com.trump.myxposed.util.Utils; 12 | import com.trump.myxposed.util.XSpUtil; 13 | 14 | import de.robv.android.xposed.IXposedHookInitPackageResources; 15 | import de.robv.android.xposed.IXposedHookLoadPackage; 16 | import de.robv.android.xposed.IXposedHookZygoteInit; 17 | import de.robv.android.xposed.XC_MethodHook; 18 | import de.robv.android.xposed.XposedHelpers; 19 | import de.robv.android.xposed.callbacks.XC_InitPackageResources; 20 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 21 | 22 | /** 23 | * Author: TRUMP 24 | * Date: 2022/2/10 0010 14:56 25 | * Desc: 26 | */ 27 | public class XposedInit implements IXposedHookLoadPackage, IXposedHookZygoteInit, IXposedHookInitPackageResources { 28 | 29 | @Override 30 | public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { 31 | Utils.log("LoadPackage:" + lpparam.packageName); 32 | switch (lpparam.packageName) { 33 | case Constant.PackageIds.wechat: 34 | break; 35 | case Constant.PackageIds.weico: 36 | new WeicoHook().handleLoadPackage(lpparam); 37 | break; 38 | case Constant.PackageIds.vmos: 39 | new VmosProHook().handleLoadPackage(lpparam); 40 | break; 41 | case Constant.PackageIds.miui_guardprovider: 42 | new MiuiGuardHook().handleLoadPackage(lpparam); 43 | break; 44 | case Constant.PackageIds.miui_analytics: 45 | new MiuiAnalyticsHook().handleLoadPackage(lpparam); 46 | break; 47 | case Constant.PackageIds.miui_personalassistant: 48 | new MiuiPersonalAssistantHook().handleLoadPackage(lpparam); 49 | break; 50 | } 51 | } 52 | 53 | @Override 54 | public void initZygote(StartupParam startupParam) throws Throwable { 55 | 56 | } 57 | 58 | @Override 59 | public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) throws Throwable { 60 | 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/hook/AbsHook.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.hook; 2 | 3 | import android.app.Application; 4 | import android.os.Handler; 5 | import android.os.Looper; 6 | import android.util.Log; 7 | import android.widget.Toast; 8 | import com.trump.myxposed.util.Utils; 9 | import de.robv.android.xposed.XC_MethodHook; 10 | import de.robv.android.xposed.XposedHelpers; 11 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 12 | 13 | import java.util.Map; 14 | 15 | /** 16 | * @author: wangpan 17 | * @emial: p.wang@aftership.com 18 | * @date: 2021/4/9 19 | */ 20 | abstract class AbsHook { 21 | 22 | protected Application application; 23 | protected Handler handler; 24 | 25 | public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { 26 | log("handleLoadPackage"); 27 | String packageName = lpparam.packageName; 28 | log("callApplicationCreate " + packageName); 29 | try { 30 | XposedHelpers.findAndHookMethod(Application.class, "onCreate", new XC_MethodHook() { 31 | @Override 32 | protected void beforeHookedMethod(MethodHookParam param) { 33 | application = (Application) param.thisObject; 34 | ClassLoader classLoader = application.getClassLoader(); 35 | handler = new Handler(Looper.getMainLooper()); 36 | onApplicationCreate(application, classLoader); 37 | if (Utils.getProcessName(application).equals(packageName)) { 38 | onMainApplicationCreate(application, classLoader); 39 | } 40 | String verionName = Utils.getPackageVersionNameInXp(packageName); 41 | onHandleLoadPackage(verionName, classLoader, lpparam); 42 | } 43 | } 44 | ); 45 | } 46 | catch (Throwable t) { 47 | t.printStackTrace(); 48 | log("callApplicationCreate e " + t.getMessage()); 49 | } 50 | } 51 | 52 | abstract void onHandleLoadPackage(String versionName, ClassLoader classLoader, XC_LoadPackage.LoadPackageParam lpparam); 53 | 54 | protected void onApplicationCreate(Application application, ClassLoader classLoader) { 55 | 56 | } 57 | 58 | protected void onMainApplicationCreate(Application application, ClassLoader classLoader) { 59 | 60 | } 61 | 62 | protected void runOnUIThread(Runnable runnable) { 63 | handler.post(runnable); 64 | } 65 | 66 | protected void showToast(String msg) { 67 | handler.post(() -> Toast.makeText(application, msg, Toast.LENGTH_SHORT).show()); 68 | } 69 | 70 | protected static void log(String msg) { 71 | Utils.log(msg); 72 | } 73 | 74 | /** 75 | * 打印堆栈 76 | * // 函数调用完成之后打印堆栈调用的信息 77 | * // 方法一: 78 | * printStackThrowable(); 79 | * // 方法二: 80 | * new Exception().printStackTrace(); // 直接干脆 81 | * // 方法三: 82 | * Thread.dumpStack(); // 直接暴力 83 | * // 方法四: 84 | * // 打印调用堆栈: http://blog.csdn.net/jk38687587/article/details/51752436 85 | * RuntimeException e = new RuntimeException(""); 86 | * e.fillInStackTrace(); 87 | * Log.i(":", "++++++++++++", e); 88 | * // 方法五: 89 | * printStackThreadAllStackTraces(); 90 | */ 91 | private void printStackThrowable() { 92 | Log.i("Dump Stack: ", "---------------start----------------"); 93 | Throwable ex = new Throwable(); 94 | StackTraceElement[] stackElements = ex.getStackTrace(); 95 | for (int i = 0; i < stackElements.length; i++) { 96 | Log.i("Dump Stack" + i + ": ", stackElements[i].getClassName() 97 | + "----" + stackElements[i].getFileName() 98 | + "----" + stackElements[i].getLineNumber() 99 | + "----" + stackElements[i].getMethodName()); 100 | } 101 | Log.i("Dump Stack: ", "---------------over----------------"); 102 | } 103 | 104 | private void printStackThreadAllStackTraces() { 105 | // Thread类的getAllStackTraces()方法获取虚拟机中所有线程的StackTraceElement对象,可以查看堆栈 106 | for (Map.Entry stackTrace : Thread.getAllStackTraces().entrySet()) { 107 | Thread thread = stackTrace.getKey(); 108 | StackTraceElement[] stack = stackTrace.getValue(); 109 | 110 | // 进行过滤 111 | if (thread.equals(Thread.currentThread())) continue; 112 | 113 | Log.i("[Dump Stack]", "**********Thread name:" + thread.getName() + "**********"); 114 | int index = 0; 115 | for (StackTraceElement stackTraceElement : stack) { 116 | Log.i("[Dump Stack]" + index + ": ", stackTraceElement.getClassName() 117 | + "----" + stackTraceElement.getFileName() 118 | + "----" + stackTraceElement.getLineNumber() 119 | + "----" + stackTraceElement.getMethodName()); 120 | } 121 | // 增加序列号 122 | index++; 123 | } 124 | Log.i("[Dump Stack]", "********************* over **********************"); 125 | } 126 | 127 | } -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/hook/MiuiAnalyticsHook.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.hook; 2 | 3 | import android.content.Context; 4 | 5 | import com.trump.myxposed.Constant; 6 | import com.trump.myxposed.util.XSpUtil; 7 | 8 | import de.robv.android.xposed.XC_MethodHook; 9 | import de.robv.android.xposed.XposedHelpers; 10 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 11 | 12 | 13 | public class MiuiAnalyticsHook extends AbsHook { 14 | 15 | @Override 16 | void onHandleLoadPackage(String versionName, ClassLoader classLoader, XC_LoadPackage.LoadPackageParam lpparam) { 17 | log("MiuiAnalyticsHook hook start"); 18 | boolean swFuckMiuiAnalytics = XSpUtil.getBoolean(true, Constant.SpKey.swFuckMiuiAnalytics); 19 | log("MiuiAnalyticsHook hook swFuckMiuiAnalytics = " + swFuckMiuiAnalytics); 20 | if (swFuckMiuiAnalytics) { 21 | int i; 22 | try { 23 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.miui.analytics.onetrack.p.u", classLoader), "w", new Object[]{Long.TYPE, Long.TYPE, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.2 24 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 25 | log("com.miui.analytics:执行拦截! --- 1"); 26 | methodHookParam.setResult((Object) null); 27 | } 28 | }}); 29 | i = 1; 30 | } catch (NoSuchMethodError unused3) { 31 | log("Method 不存在,版本可能不兼容 --- com.miui.analytics --- com.miui.analytics.onetrack.p.u.w"); 32 | i = 0; 33 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.miui.analytics.c.f.k", classLoader), "y", new Object[]{Long.TYPE, Long.TYPE, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.3 34 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 35 | log("com.miui.analytics:执行拦截! --- 2"); 36 | methodHookParam.setResult((Object) null); 37 | } 38 | }}); 39 | i++; 40 | Class findClass = XposedHelpers.findClass("com.miui.analytics.onetrack.q.c", classLoader); 41 | try { 42 | XposedHelpers.findAndHookMethod(findClass, "a", new Object[]{Context.class, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.4 43 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 44 | log("com.miui.analytics:执行拦截! --- 3"); 45 | methodHookParam.setResult(0); 46 | } 47 | }}); 48 | i++; 49 | } catch (NoSuchMethodError unused4) { 50 | log("Method 不存在,版本可能不兼容 --- com.miui.analytics --- com.miui.analytics.onetrack.q.c.a"); 51 | } 52 | try { 53 | XposedHelpers.findAndHookMethod(findClass, "b", new Object[]{Context.class, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.5 54 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 55 | log("com.miui.analytics:执行拦截! --- 4"); 56 | methodHookParam.setResult("NONE"); 57 | } 58 | }}); 59 | i++; 60 | } catch (NoSuchMethodError unused5) { 61 | log("Method 不存在,版本可能不兼容 --- com.miui.analytics --- com.miui.analytics.onetrack.q.c.b"); 62 | } 63 | try { 64 | XposedHelpers.findAndHookMethod(findClass, "c", new Object[]{new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.6 65 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 66 | log("com.miui.analytics:执行拦截! --- 5"); 67 | methodHookParam.setResult(false); 68 | } 69 | }}); 70 | i++; 71 | } catch (NoSuchMethodError unused6) { 72 | log("Method 不存在,版本可能不兼容 --- com.miui.analytics --- com.miui.analytics.onetrack.q.c.c"); 73 | } 74 | log("com.miui.analytics:已修改 " + i + " 次"); 75 | } catch (XposedHelpers.ClassNotFoundError unused7) { 76 | log("Class 不存在,版本可能不兼容 --- com.miui.analytics --- com.miui.analytics.onetrack.p.u"); 77 | i = 0; 78 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.miui.analytics.c.f.k", classLoader), "y", new Object[]{Long.TYPE, Long.TYPE, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.3 79 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 80 | log("com.miui.analytics:执行拦截! --- 2"); 81 | methodHookParam.setResult((Object) null); 82 | } 83 | }}); 84 | i++; 85 | Class findClass2 = XposedHelpers.findClass("com.miui.analytics.onetrack.q.c", classLoader); 86 | XposedHelpers.findAndHookMethod(findClass2, "a", new Object[]{Context.class, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.4 87 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 88 | log("com.miui.analytics:执行拦截! --- 3"); 89 | methodHookParam.setResult(0); 90 | } 91 | }}); 92 | i++; 93 | XposedHelpers.findAndHookMethod(findClass2, "b", new Object[]{Context.class, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.5 94 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 95 | log("com.miui.analytics:执行拦截! --- 4"); 96 | methodHookParam.setResult("NONE"); 97 | } 98 | }}); 99 | i++; 100 | XposedHelpers.findAndHookMethod(findClass2, "c", new Object[]{new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.6 101 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 102 | log("com.miui.analytics:执行拦截! --- 5"); 103 | methodHookParam.setResult(false); 104 | } 105 | }}); 106 | i++; 107 | log("com.miui.analytics:已修改 " + i + " 次"); 108 | } 109 | try { 110 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.miui.analytics.c.f.k", classLoader), "y", new Object[]{Long.TYPE, Long.TYPE, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.3 111 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 112 | log("com.miui.analytics:执行拦截! --- 2"); 113 | methodHookParam.setResult((Object) null); 114 | } 115 | }}); 116 | i++; 117 | } catch (NoSuchMethodError unused8) { 118 | log("Method 不存在,版本可能不兼容 --- com.miui.analytics --- com.miui.analytics.c.f.k.y"); 119 | } catch (XposedHelpers.ClassNotFoundError unused9) { 120 | log("Class 不存在,版本可能不兼容 --- com.miui.analytics --- com.miui.analytics.c.f.k"); 121 | } 122 | try { 123 | Class findClass22 = XposedHelpers.findClass("com.miui.analytics.onetrack.q.c", classLoader); 124 | XposedHelpers.findAndHookMethod(findClass22, "a", new Object[]{Context.class, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.4 125 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 126 | log("com.miui.analytics:执行拦截! --- 3"); 127 | methodHookParam.setResult(0); 128 | } 129 | }}); 130 | i++; 131 | XposedHelpers.findAndHookMethod(findClass22, "b", new Object[]{Context.class, new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.5 132 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 133 | log("com.miui.analytics:执行拦截! --- 4"); 134 | methodHookParam.setResult("NONE"); 135 | } 136 | }}); 137 | i++; 138 | XposedHelpers.findAndHookMethod(findClass22, "c", new Object[]{new XC_MethodHook() { // from class: cn.fyyr.noguardpls.MainHook.6 139 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 140 | log("com.miui.analytics:执行拦截! --- 5"); 141 | methodHookParam.setResult(false); 142 | } 143 | }}); 144 | i++; 145 | } catch (XposedHelpers.ClassNotFoundError unused10) { 146 | log("Class 不存在,版本可能不兼容 --- com.miui.analytics --- com.miui.analytics.onetrack.q.c"); 147 | } 148 | log("com.miui.analytics:已修改 " + i + " 次"); 149 | } 150 | } 151 | 152 | } 153 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/hook/MiuiGuardHook.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.hook; 2 | 3 | import android.content.Context; 4 | 5 | import com.trump.myxposed.Constant; 6 | import com.trump.myxposed.util.XSpUtil; 7 | 8 | import de.robv.android.xposed.XC_MethodHook; 9 | import de.robv.android.xposed.XposedHelpers; 10 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 11 | 12 | 13 | public class MiuiGuardHook extends AbsHook { 14 | 15 | @Override 16 | void onHandleLoadPackage(String versionName, ClassLoader classLoader, XC_LoadPackage.LoadPackageParam lpparam) { 17 | log("MiuiGuardHook hook start"); 18 | 19 | boolean swFuckMiuiGuard = XSpUtil.getBoolean(true, Constant.SpKey.swFuckMiuiGuard); 20 | log("MiuiGuardHook hook swFuckMiuiGuard = " + swFuckMiuiGuard); 21 | if (swFuckMiuiGuard) { 22 | try { 23 | XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.miui.guardprovider.GuardApplication", classLoader), "e", new Object[]{Context.class, new XC_MethodHook() { 24 | // from class: cn.fyyr.noguardpls.MainHook.1 25 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) { 26 | methodHookParam.setResult(false); 27 | log("com.miui.guardprovider:执行拦截!"); 28 | log("com.miui.guardprovider:已修改 1 次"); 29 | } 30 | }}); 31 | } catch (XposedHelpers.ClassNotFoundError unused) { 32 | log("Class 不存在,版本可能不兼容 --- com.miui.guardprovider --- com.miui.guardprovider.GuardApplication.e"); 33 | return; 34 | } catch (NoSuchMethodError unused2) { 35 | log("Method 不存在,版本可能不兼容 --- com.miui.guardprovider --- com.miui.guardprovider.GuardApplication.e"); 36 | } 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/hook/MiuiPersonalAssistantHook.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.hook; 2 | 3 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 4 | 5 | public class MiuiPersonalAssistantHook extends AbsHook { 6 | 7 | @Override 8 | void onHandleLoadPackage(String versionName, ClassLoader classLoader, XC_LoadPackage.LoadPackageParam lpparam) { 9 | log("MiuiPersonalAssistantHook hook start"); 10 | 11 | // final Class clazz = XposedHelpers.findClass("c.h.d.p.s", classLoader); 12 | // XposedHelpers.setStaticBooleanField(clazz, "h", true); 13 | 14 | // XposedHelpers.findAndHookMethod("c.h.d.f.g.b", classLoader, "b", new XC_MethodHook() { 15 | // @Override 16 | // protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 17 | // super.beforeHookedMethod(param); 18 | // param.setResult(true); 19 | // } 20 | // }); 21 | 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/hook/TestHook.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.hook; 2 | 3 | import com.socks.library.KLog; 4 | 5 | import de.robv.android.xposed.XC_MethodHook; 6 | import de.robv.android.xposed.XposedHelpers; 7 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 8 | 9 | 10 | public class TestHook extends AbsHook { 11 | 12 | @Override 13 | void onHandleLoadPackage(String versionName, ClassLoader classLoader, XC_LoadPackage.LoadPackageParam lpparam) { 14 | log("TestHook start"); 15 | 16 | XposedHelpers.findAndHookMethod("com.trump.home.HomeFragment", lpparam.classLoader, "getText", String.class, new XC_MethodHook() { 17 | 18 | @Override 19 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 20 | KLog.d("trump hook in beforeHookedMethod"); 21 | //第一个参数 22 | String str1 = (String) param.args[0]; 23 | KLog.d("trump com.trump.home.HomeFragment.getText() 的入参为:" + str1); 24 | //修改参数 25 | param.args[0] = "samuel"; 26 | } 27 | 28 | @Override 29 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 30 | KLog.d("trump hook in afterHookedMethod"); 31 | 32 | //返回值 33 | String resultStr = (String) param.getResult(); 34 | KLog.d("trump com.trump.home.HomeFragment.getText() 的返回值为:" + resultStr); 35 | 36 | //修改返回值 37 | param.setResult("Hooked2"); 38 | } 39 | }); 40 | 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/hook/VmosProHook.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.hook; 2 | 3 | import android.content.Context; 4 | 5 | import de.robv.android.xposed.XC_MethodHook; 6 | import de.robv.android.xposed.XposedHelpers; 7 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 8 | 9 | /** 10 | * VMOS Pro vip hook 11 | */ 12 | public class VmosProHook extends AbsHook { 13 | 14 | @Override 15 | void onHandleLoadPackage(String versionName, ClassLoader classLoader, XC_LoadPackage.LoadPackageParam lpparam) { 16 | log("VmosProHook hook start"); 17 | 18 | try { 19 | XposedHelpers.findAndHookMethod("com.stub.StubApp", lpparam.classLoader, 20 | "attachBaseContext", Context.class, new XC_MethodHook() { 21 | @Override 22 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 23 | super.afterHookedMethod(param); 24 | //获取到Context对象,通过这个对象来获取classloader 25 | Context context = (Context) param.args[0]; 26 | //获取classloader,之后hook加固后的就使用这个classloader 27 | ClassLoader classLoader = context.getClassLoader(); 28 | //已经绕过360加固取得classloader 29 | 30 | log("VmosProHook hook start true"); 31 | 32 | XposedHelpers.findAndHookMethod( 33 | "com.vmos.pro.bean.UserBean", 34 | classLoader, 35 | "getNickName", 36 | new XC_MethodHook() { 37 | 38 | @Override 39 | protected void afterHookedMethod(MethodHookParam param) { 40 | log("VmosProHook hook after getNickName"); 41 | param.setResult("Trump"); 42 | } 43 | }); 44 | 45 | XposedHelpers.findAndHookMethod( 46 | "com.vmos.pro.bean.UserBean", 47 | classLoader, 48 | "isTasteMember", 49 | new XC_MethodHook() { 50 | 51 | @Override 52 | protected void afterHookedMethod(MethodHookParam param) { 53 | log("VmosProHook hook after isTasteMember"); 54 | param.setResult(true); 55 | } 56 | }); 57 | 58 | XposedHelpers.findAndHookMethod( 59 | "com.vmos.pro.account.AccountHelper", 60 | classLoader, 61 | "isVipVM", 62 | new XC_MethodHook() { 63 | 64 | @Override 65 | protected void afterHookedMethod(MethodHookParam param) { 66 | log("VmosProHook hook after isVipVM"); 67 | param.setResult(true); 68 | } 69 | }); 70 | 71 | XposedHelpers.findAndHookMethod( 72 | "com.vmos.pro.account.AccountHelper", 73 | classLoader, 74 | "permanentMember", 75 | new XC_MethodHook() { 76 | 77 | @Override 78 | protected void afterHookedMethod(MethodHookParam param) { 79 | param.setResult(true); 80 | } 81 | }); 82 | 83 | XposedHelpers.findAndHookMethod( 84 | "com.vmos.pro.bean.UserBean", 85 | classLoader, 86 | "isExists", 87 | new XC_MethodHook() { 88 | 89 | @Override 90 | protected void afterHookedMethod(MethodHookParam param) { 91 | param.setResult(true); 92 | } 93 | }); 94 | 95 | XposedHelpers.findAndHookMethod( 96 | "com.vmos.pro.bean.UserBean", 97 | classLoader, 98 | "isAuthorFlag", 99 | new XC_MethodHook() { 100 | 101 | @Override 102 | protected void afterHookedMethod(MethodHookParam param) { 103 | param.setResult(true); 104 | } 105 | }); 106 | 107 | XposedHelpers.findAndHookMethod( 108 | "com.vmos.pro.account.AccountHelper", 109 | classLoader, 110 | "notLogin", 111 | new XC_MethodHook() { 112 | 113 | @Override 114 | protected void afterHookedMethod(MethodHookParam param) { 115 | param.setResult(false); 116 | } 117 | }); 118 | 119 | XposedHelpers.findAndHookMethod( 120 | "com.vmos.pro.account.AccountHelper", 121 | classLoader, 122 | "allowedDisplayAd", 123 | new XC_MethodHook() { 124 | 125 | @Override 126 | protected void afterHookedMethod(MethodHookParam param) { 127 | param.setResult(false); 128 | } 129 | }); 130 | 131 | XposedHelpers.findAndHookMethod( 132 | "com.vmos.pro.account.AccountHelper", 133 | classLoader, 134 | "unlimited", 135 | new XC_MethodHook() { 136 | 137 | @Override 138 | protected void afterHookedMethod(MethodHookParam param) { 139 | param.setResult(true); 140 | } 141 | }); 142 | 143 | } 144 | }); 145 | } catch (Throwable t) { 146 | t.printStackTrace(); 147 | log("callApplicationCreate jiagu e " + t.getMessage()); 148 | } 149 | } 150 | 151 | } 152 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/hook/WeicoHook.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.hook; 2 | 3 | import android.app.Application; 4 | import android.view.View; 5 | 6 | import com.trump.myxposed.Constant; 7 | import com.trump.myxposed.util.XSpUtil; 8 | 9 | import java.lang.reflect.Field; 10 | import java.util.ArrayList; 11 | import java.util.HashMap; 12 | import java.util.HashSet; 13 | import java.util.Set; 14 | 15 | import de.robv.android.xposed.XC_MethodHook; 16 | import de.robv.android.xposed.XC_MethodReplacement; 17 | import de.robv.android.xposed.XposedHelpers; 18 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 19 | 20 | /** 21 | * Desc: 微博国际版 22 | * Functions : 23 | * 1.去除开屏广告 24 | * 2.强制暗黑模式 25 | * 3.去除时间线广告-支持6.1.7 6.2.6 6.3.8 26 | */ 27 | public class WeicoHook extends AbsHook { 28 | 29 | private ArrayList currFunctionNames; 30 | 31 | private static HashMap> currFunctionNamesMap = new HashMap<>() {{ 32 | put("6.1.7", new ArrayList<>() {{ 33 | add("queryUveAdRequest$lambda$156"); 34 | add("queryUveAdRequest$lambda$157"); 35 | add("queryUveAdRequest$lambda$158"); 36 | }}); 37 | put("6.2.6", new ArrayList<>() {{ 38 | add("queryUveAdRequest$lambda$151"); 39 | add("queryUveAdRequest$lambda$152"); 40 | add("queryUveAdRequest$lambda$153"); 41 | }}); 42 | put("6.3.8", new ArrayList<>() {{ 43 | add("queryUveAdRequest$lambda$159"); 44 | add("queryUveAdRequest$lambda$160"); 45 | add("queryUveAdRequest$lambda$161"); 46 | }}); 47 | }}; 48 | 49 | @Override 50 | void onHandleLoadPackage(String versionName, ClassLoader classLoader, XC_LoadPackage.LoadPackageParam lpparam) { 51 | currFunctionNames = currFunctionNamesMap.get(versionName); 52 | if (currFunctionNames == null) { 53 | //默认 54 | currFunctionNames = currFunctionNamesMap.get("6.2.6"); 55 | } 56 | log("WeicoHook hook start version = " + versionName); 57 | 58 | removeSpalshAd(classLoader); 59 | 60 | boolean flagDarkMode = XSpUtil.getBoolean(true, Constant.SpKey.darkMode); 61 | log("weico hook flagDarkMode = " + flagDarkMode); 62 | if (flagDarkMode) { 63 | forceDarkMode(classLoader); 64 | } 65 | 66 | boolean hidePostBtn = XSpUtil.getBoolean(true, Constant.SpKey.hidePostBtn); 67 | log("weico hook hidePostBtn = " + hidePostBtn); 68 | if (hidePostBtn) { 69 | hideIndexPostBtn(classLoader); 70 | } 71 | 72 | removeTimeLineAd(classLoader); 73 | } 74 | 75 | private void removeSpalshAd(ClassLoader classLoader) { 76 | try { 77 | XposedHelpers.findAndHookMethod("com.weico.international.activity.LogoActivity", classLoader, "doWhatNext", new XC_MethodHook() { 78 | @Override 79 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 80 | super.beforeHookedMethod(param); 81 | param.setResult("main"); 82 | log("weico hook doWhatNext:main"); 83 | } 84 | }); 85 | 86 | XposedHelpers.findAndHookMethod("com.weico.international.activity.LogoActivity", classLoader, "triggerPermission", boolean.class, new XC_MethodHook() { 87 | @Override 88 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 89 | super.beforeHookedMethod(param); 90 | param.args[0] = true; 91 | } 92 | }); 93 | 94 | //劫持整个生命周期,“后台到前台”动作失效,不会跳新界面 95 | XposedHelpers.findAndHookMethod("com.weico.international.manager.ProcessMonitor", classLoader, "attach", Application.class, new XC_MethodReplacement() { 96 | @Override 97 | protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { 98 | log("weico hook attach"); 99 | return null; 100 | } 101 | }); 102 | } catch (Exception e) { 103 | log("weico hook removeSpalshAd exception = " + e.getMessage()); 104 | } 105 | } 106 | 107 | private void removeTimeLineAd(ClassLoader classLoader) { 108 | try { 109 | XposedHelpers.findAndHookMethod("com.weico.international.api.RxApiKt", classLoader, currFunctionNames.get(0), java.util.Map.class, new XC_MethodHook() { 110 | @Override 111 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 112 | super.beforeHookedMethod(param); 113 | param.setResult(""); 114 | } 115 | }); 116 | 117 | 118 | Class Function1 = XposedHelpers.findClass("kotlin.jvm.functions.Function1", classLoader); 119 | 120 | XposedHelpers.findAndHookMethod("com.weico.international.api.RxApiKt", classLoader, currFunctionNames.get(1), Function1, java.lang.Object.class, new XC_MethodHook() { 121 | @Override 122 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 123 | super.beforeHookedMethod(param); 124 | param.setResult(""); 125 | } 126 | }); 127 | 128 | XposedHelpers.findAndHookMethod("com.weico.international.api.RxApiKt", classLoader, currFunctionNames.get(2), Function1, java.lang.Object.class, new XC_MethodHook() { 129 | @Override 130 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 131 | super.beforeHookedMethod(param); 132 | param.setResult(new ArrayList<>()); 133 | } 134 | }); 135 | 136 | 137 | Class Status = XposedHelpers.findClass("com.weico.international.model.sina.Status", classLoader); 138 | XposedHelpers.findAndHookMethod("com.weico.international.utility.KotlinExtendKt", classLoader, "isWeiboUVEAd", Status, new XC_MethodHook() { 139 | @Override 140 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 141 | super.beforeHookedMethod(param); 142 | param.setResult(false); 143 | } 144 | }); 145 | 146 | XposedHelpers.findAndHookMethod("com.weico.international.utility.KotlinExtendKt", classLoader, "isVideoLogEnable", Status, new XC_MethodHook() { 147 | @Override 148 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 149 | super.beforeHookedMethod(param); 150 | param.setResult(false); 151 | } 152 | }); 153 | 154 | Class PageInfo = XposedHelpers.findClass("com.weico.international.model.sina.PageInfo", classLoader); 155 | XposedHelpers.findAndHookMethod("com.weico.international.utility.KotlinUtilKt", classLoader, "findUVEAd", PageInfo, new XC_MethodHook() { 156 | @Override 157 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 158 | super.beforeHookedMethod(param); 159 | param.setResult(null); 160 | } 161 | }); 162 | 163 | XposedHelpers.findAndHookMethod("com.weico.international.activity.v4.Setting", classLoader, "loadBoolean", java.lang.String.class, boolean.class, new XC_MethodHook() { 164 | @Override 165 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 166 | super.beforeHookedMethod(param); 167 | String p0 = (String) param.args[0]; 168 | if ("BOOL_UVE_FEED_AD".equals(p0)) { 169 | param.setResult(false); 170 | } else if (p0.startsWith("BOOL_AD_ACTIVITY_BLOCK_")) { 171 | param.setResult(true); 172 | } 173 | } 174 | 175 | }); 176 | 177 | XposedHelpers.findAndHookMethod("com.weico.international.activity.v4.Setting", classLoader, "loadInt", java.lang.String.class, new XC_MethodHook() { 178 | @Override 179 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 180 | super.beforeHookedMethod(param); 181 | String p0 = (String) param.args[0]; 182 | if ("ad_interval".equals(p0)) { 183 | param.setResult(Integer.MAX_VALUE); 184 | } else if ("display_ad".equals(p0)) { 185 | param.setResult(0); 186 | } 187 | } 188 | }); 189 | 190 | XposedHelpers.findAndHookMethod("com.weico.international.activity.v4.Setting", classLoader, "loadInt", java.lang.String.class, int.class, new XC_MethodHook() { 191 | @Override 192 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 193 | super.beforeHookedMethod(param); 194 | String p0 = (String) param.args[0]; 195 | if ("ad_interval".equals(p0)) { 196 | param.setResult(Integer.MAX_VALUE); 197 | } else if ("display_ad".equals(p0)) { 198 | param.setResult(0); 199 | } 200 | } 201 | }); 202 | 203 | XposedHelpers.findAndHookMethod("com.weico.international.activity.v4.Setting", classLoader, "loadStringSet", java.lang.String.class, new XC_MethodHook() { 204 | @Override 205 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 206 | super.beforeHookedMethod(param); 207 | String p0 = (String) param.args[0]; 208 | if ("CYT_DAYS".equals(p0)) { 209 | Set set = new HashSet<>(); 210 | param.setResult(set); 211 | } 212 | } 213 | }); 214 | 215 | XposedHelpers.findAndHookMethod("com.weico.international.activity.v4.Setting", classLoader, "loadString", java.lang.String.class, new XC_MethodHook() { 216 | @Override 217 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 218 | super.beforeHookedMethod(param); 219 | String p0 = (String) param.args[0]; 220 | if ("video_ad".equals(p0)) { 221 | param.setResult(""); 222 | } 223 | } 224 | }); 225 | XposedHelpers.findAndHookMethod("com.weico.international.activity.v4.Setting", classLoader, "loadString", java.lang.String.class, java.lang.String.class, new XC_MethodHook() { 226 | @Override 227 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 228 | super.beforeHookedMethod(param); 229 | String p0 = (String) param.args[0]; 230 | if ("video_ad".equals(p0)) { 231 | param.setResult(""); 232 | } 233 | } 234 | }); 235 | } catch (Exception e) { 236 | log("weico hook removeTimeLineAd exception = " + e.getMessage()); 237 | } 238 | } 239 | 240 | private void forceDarkMode(ClassLoader classLoader) { 241 | try { 242 | XposedHelpers.findAndHookMethod("com.skin.loader.SkinManager", classLoader, "isDarkMode", new XC_MethodHook() { 243 | @Override 244 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 245 | super.beforeHookedMethod(param); 246 | param.setResult(true); 247 | } 248 | }); 249 | 250 | XposedHelpers.findAndHookMethod("com.skin.loader.SkinManager", classLoader, "getDarkModeStatus", android.content.Context.class, new XC_MethodHook() { 251 | @Override 252 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 253 | super.beforeHookedMethod(param); 254 | param.setResult(true); 255 | } 256 | }); 257 | } catch (Exception e) { 258 | log("weico hook forceDarkMode exception = " + e.getMessage()); 259 | } 260 | } 261 | 262 | private void hideIndexPostBtn(ClassLoader classLoader) { 263 | try { 264 | XposedHelpers.findAndHookMethod("com.google.android.material.floatingactionbutton.FloatingActionButton", classLoader, "setVisibility", int.class, new XC_MethodHook() { 265 | @Override 266 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 267 | super.beforeHookedMethod(param); 268 | param.args[0] = View.GONE; 269 | } 270 | }); 271 | 272 | Class indexFragment = null; 273 | try { 274 | indexFragment = classLoader.loadClass("com.weico.international.ui.maintab.MainTabFragment"); 275 | } catch (ClassNotFoundException e) { 276 | throw new RuntimeException(e); 277 | } 278 | if (indexFragment == null) return; 279 | Class finalIndexFragment = indexFragment; 280 | XposedHelpers.findAndHookMethod(indexFragment, "initView", new XC_MethodHook() { 281 | @Override 282 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 283 | super.afterHookedMethod(param); 284 | Field field = XposedHelpers.findField(finalIndexFragment, "mIndexFab"); 285 | View view = (View) field.get(param.thisObject); 286 | view.setVisibility(View.INVISIBLE); 287 | } 288 | }); 289 | } catch (Exception e) { 290 | log("weico hook hideIndexPostBtn exception = " + e.getMessage()); 291 | } 292 | } 293 | 294 | } 295 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/ui/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.ui; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.appcompat.app.AppCompatActivity; 6 | import androidx.core.content.ContextCompat; 7 | 8 | import com.trump.myxposed.Constant; 9 | import com.trump.myxposed.R; 10 | import com.trump.myxposed.databinding.ActivityMainBinding; 11 | import com.trump.myxposed.util.Utils; 12 | import com.trump.myxposed.util.XSpUtil; 13 | 14 | public class MainActivity extends AppCompatActivity { 15 | 16 | ActivityMainBinding mBinding; 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | mBinding = ActivityMainBinding.inflate(getLayoutInflater()); 22 | setContentView(mBinding.getRoot()); 23 | initListener(); 24 | 25 | mBinding.tvStatusXp.setText(XSpUtil.isOk() ? "已激活" : "未激活"); 26 | mBinding.tvStatusXp.setTextColor(ContextCompat.getColor(this, XSpUtil.isOk() ? R.color.black : R.color.red)); 27 | } 28 | 29 | private void initListener() { 30 | //Launcher 31 | mBinding.swHideLauncher.setChecked(!Utils.isLauncherIconVisible(this)); 32 | mBinding.swHideLauncher.setOnCheckedChangeListener((buttonView, isChecked) -> { 33 | if (!buttonView.isPressed()) return; 34 | Utils.setLauncherIconVisible(MainActivity.this, !isChecked); 35 | }); 36 | 37 | //暗黑模式 38 | mBinding.swDarkMode.setChecked(XSpUtil.getBoolean(false, Constant.SpKey.darkMode)); 39 | mBinding.swDarkMode.setOnCheckedChangeListener((buttonView, isChecked) -> { 40 | if (!buttonView.isPressed()) return; 41 | XSpUtil.put(Constant.SpKey.darkMode, isChecked); 42 | }); 43 | 44 | //暗黑模式 45 | mBinding.swHidePostBtn.setChecked(XSpUtil.getBoolean(false, Constant.SpKey.hidePostBtn)); 46 | mBinding.swHidePostBtn.setOnCheckedChangeListener((buttonView, isChecked) -> { 47 | if (!buttonView.isPressed()) return; 48 | XSpUtil.put(Constant.SpKey.hidePostBtn, isChecked); 49 | }); 50 | 51 | //阻止GuardProvider跟踪 52 | mBinding.swFuckMiuiGuard.setChecked(XSpUtil.getBoolean(false, Constant.SpKey.swFuckMiuiGuard)); 53 | mBinding.swFuckMiuiGuard.setOnCheckedChangeListener((buttonView, isChecked) -> { 54 | if (!buttonView.isPressed()) return; 55 | XSpUtil.put(Constant.SpKey.swFuckMiuiGuard, isChecked); 56 | }); 57 | 58 | //暗黑模式 59 | mBinding.swFuckMiuiAnalytics.setChecked(XSpUtil.getBoolean(false, Constant.SpKey.swFuckMiuiAnalytics)); 60 | mBinding.swFuckMiuiAnalytics.setOnCheckedChangeListener((buttonView, isChecked) -> { 61 | if (!buttonView.isPressed()) return; 62 | XSpUtil.put(Constant.SpKey.swFuckMiuiAnalytics, isChecked); 63 | }); 64 | } 65 | 66 | } -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/util/SPUtil.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.util; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | 6 | import androidx.annotation.NonNull; 7 | 8 | import com.trump.myxposed.App; 9 | import com.trump.myxposed.Constant; 10 | 11 | import java.util.Collections; 12 | import java.util.HashMap; 13 | import java.util.Map; 14 | import java.util.Set; 15 | 16 | /** 17 | * @author 王元_Trump 18 | * @time 2020/03/19 16:32 19 | * @desc 20 | */ 21 | public final class SPUtil { 22 | 23 | private static final String SpFileName = Constant.SpFileName; 24 | 25 | private static final Map SP_UTILS_MAP = new HashMap<>(); 26 | private SharedPreferences sp; 27 | 28 | /** 29 | * Return the single {@link SPUtil} instance 30 | * 31 | * @return the single {@link SPUtil} instance 32 | */ 33 | public static SPUtil getInstance() { 34 | return getInstance(SpFileName, Context.MODE_PRIVATE); 35 | } 36 | 37 | /** 38 | * Return the single {@link SPUtil} instance 39 | * 40 | * @param mode Operating mode. 41 | * @return the single {@link SPUtil} instance 42 | */ 43 | public static SPUtil getInstance(final int mode) { 44 | return getInstance(SpFileName, mode); 45 | } 46 | 47 | /** 48 | * Return the single {@link SPUtil} instance 49 | * 50 | * @param spName The name of sp. 51 | * @return the single {@link SPUtil} instance 52 | */ 53 | public static SPUtil getInstance(String spName) { 54 | return getInstance(spName, Context.MODE_PRIVATE); 55 | } 56 | 57 | /** 58 | * Return the single {@link SPUtil} instance 59 | * 60 | * @param spName The name of sp. 61 | * @param mode Operating mode. 62 | * @return the single {@link SPUtil} instance 63 | */ 64 | public static SPUtil getInstance(String spName, final int mode) { 65 | if (isSpace(spName)) spName = "SPUtil"; 66 | SPUtil SPUtil = SP_UTILS_MAP.get(spName); 67 | if (SPUtil == null) { 68 | synchronized (SPUtil.class) { 69 | SPUtil = SP_UTILS_MAP.get(spName); 70 | if (SPUtil == null) { 71 | SPUtil = new SPUtil(spName, mode); 72 | SP_UTILS_MAP.put(spName, SPUtil); 73 | } 74 | } 75 | } 76 | return SPUtil; 77 | } 78 | 79 | private SPUtil(final String spName) { 80 | sp = App.getContext().getSharedPreferences(spName, Context.MODE_PRIVATE); 81 | } 82 | 83 | private SPUtil(final String spName, final int mode) { 84 | sp = App.getContext().getSharedPreferences(spName, mode); 85 | } 86 | 87 | /** 88 | * Put the string value in sp. 89 | * 90 | * @param key The key of sp. 91 | * @param value The value of sp. 92 | */ 93 | public void put(@NonNull final String key, final String value) { 94 | put(key, value, false); 95 | } 96 | 97 | /** 98 | * Put the string value in sp. 99 | * 100 | * @param key The key of sp. 101 | * @param value The value of sp. 102 | * @param isCommit True to use {@link SharedPreferences.Editor#commit()}, 103 | * false to use {@link SharedPreferences.Editor#apply()} 104 | */ 105 | public void put(@NonNull final String key, final String value, final boolean isCommit) { 106 | if (isCommit) { 107 | sp.edit().putString(key, value).commit(); 108 | } else { 109 | sp.edit().putString(key, value).apply(); 110 | } 111 | } 112 | 113 | /** 114 | * Return the string value in sp. 115 | * 116 | * @param key The key of sp. 117 | * @return the string value if sp exists or {@code ""} otherwise 118 | */ 119 | public String getString(@NonNull final String key) { 120 | return getString(key, ""); 121 | } 122 | 123 | /** 124 | * Return the string value in sp. 125 | * 126 | * @param key The key of sp. 127 | * @param defaultValue The default value if the sp doesn't exist. 128 | * @return the string value if sp exists or {@code defaultValue} otherwise 129 | */ 130 | public String getString(@NonNull final String key, final String defaultValue) { 131 | return sp.getString(key, defaultValue); 132 | } 133 | 134 | /** 135 | * Put the int value in sp. 136 | * 137 | * @param key The key of sp. 138 | * @param value The value of sp. 139 | */ 140 | public void put(@NonNull final String key, final int value) { 141 | put(key, value, false); 142 | } 143 | 144 | /** 145 | * Put the int value in sp. 146 | * 147 | * @param key The key of sp. 148 | * @param value The value of sp. 149 | * @param isCommit True to use {@link SharedPreferences.Editor#commit()}, 150 | * false to use {@link SharedPreferences.Editor#apply()} 151 | */ 152 | public void put(@NonNull final String key, final int value, final boolean isCommit) { 153 | if (isCommit) { 154 | sp.edit().putInt(key, value).commit(); 155 | } else { 156 | sp.edit().putInt(key, value).apply(); 157 | } 158 | } 159 | 160 | /** 161 | * Return the int value in sp. 162 | * 163 | * @param key The key of sp. 164 | * @return the int value if sp exists or {@code -1} otherwise 165 | */ 166 | public int getInt(@NonNull final String key) { 167 | return getInt(key, -1); 168 | } 169 | 170 | /** 171 | * Return the int value in sp. 172 | * 173 | * @param key The key of sp. 174 | * @param defaultValue The default value if the sp doesn't exist. 175 | * @return the int value if sp exists or {@code defaultValue} otherwise 176 | */ 177 | public int getInt(@NonNull final String key, final int defaultValue) { 178 | return sp.getInt(key, defaultValue); 179 | } 180 | 181 | /** 182 | * Put the long value in sp. 183 | * 184 | * @param key The key of sp. 185 | * @param value The value of sp. 186 | */ 187 | public void put(@NonNull final String key, final long value) { 188 | put(key, value, false); 189 | } 190 | 191 | /** 192 | * Put the long value in sp. 193 | * 194 | * @param key The key of sp. 195 | * @param value The value of sp. 196 | * @param isCommit True to use {@link SharedPreferences.Editor#commit()}, 197 | * false to use {@link SharedPreferences.Editor#apply()} 198 | */ 199 | public void put(@NonNull final String key, final long value, final boolean isCommit) { 200 | if (isCommit) { 201 | sp.edit().putLong(key, value).commit(); 202 | } else { 203 | sp.edit().putLong(key, value).apply(); 204 | } 205 | } 206 | 207 | /** 208 | * Return the long value in sp. 209 | * 210 | * @param key The key of sp. 211 | * @return the long value if sp exists or {@code -1} otherwise 212 | */ 213 | public long getLong(@NonNull final String key) { 214 | return getLong(key, -1L); 215 | } 216 | 217 | /** 218 | * Return the long value in sp. 219 | * 220 | * @param key The key of sp. 221 | * @param defaultValue The default value if the sp doesn't exist. 222 | * @return the long value if sp exists or {@code defaultValue} otherwise 223 | */ 224 | public long getLong(@NonNull final String key, final long defaultValue) { 225 | return sp.getLong(key, defaultValue); 226 | } 227 | 228 | /** 229 | * Put the float value in sp. 230 | * 231 | * @param key The key of sp. 232 | * @param value The value of sp. 233 | */ 234 | public void put(@NonNull final String key, final float value) { 235 | put(key, value, false); 236 | } 237 | 238 | /** 239 | * Put the float value in sp. 240 | * 241 | * @param key The key of sp. 242 | * @param value The value of sp. 243 | * @param isCommit True to use {@link SharedPreferences.Editor#commit()}, 244 | * false to use {@link SharedPreferences.Editor#apply()} 245 | */ 246 | public void put(@NonNull final String key, final float value, final boolean isCommit) { 247 | if (isCommit) { 248 | sp.edit().putFloat(key, value).commit(); 249 | } else { 250 | sp.edit().putFloat(key, value).apply(); 251 | } 252 | } 253 | 254 | /** 255 | * Return the float value in sp. 256 | * 257 | * @param key The key of sp. 258 | * @return the float value if sp exists or {@code -1f} otherwise 259 | */ 260 | public float getFloat(@NonNull final String key) { 261 | return getFloat(key, -1f); 262 | } 263 | 264 | /** 265 | * Return the float value in sp. 266 | * 267 | * @param key The key of sp. 268 | * @param defaultValue The default value if the sp doesn't exist. 269 | * @return the float value if sp exists or {@code defaultValue} otherwise 270 | */ 271 | public float getFloat(@NonNull final String key, final float defaultValue) { 272 | return sp.getFloat(key, defaultValue); 273 | } 274 | 275 | /** 276 | * Put the boolean value in sp. 277 | * 278 | * @param key The key of sp. 279 | * @param value The value of sp. 280 | */ 281 | public void put(@NonNull final String key, final boolean value) { 282 | put(key, value, false); 283 | } 284 | 285 | /** 286 | * Put the boolean value in sp. 287 | * 288 | * @param key The key of sp. 289 | * @param value The value of sp. 290 | * @param isCommit True to use {@link SharedPreferences.Editor#commit()}, 291 | * false to use {@link SharedPreferences.Editor#apply()} 292 | */ 293 | public void put(@NonNull final String key, final boolean value, final boolean isCommit) { 294 | if (isCommit) { 295 | sp.edit().putBoolean(key, value).commit(); 296 | } else { 297 | sp.edit().putBoolean(key, value).apply(); 298 | } 299 | } 300 | 301 | /** 302 | * Return the boolean value in sp. 303 | * 304 | * @param key The key of sp. 305 | * @return the boolean value if sp exists or {@code false} otherwise 306 | */ 307 | public boolean getBoolean(@NonNull final String key) { 308 | return getBoolean(key, false); 309 | } 310 | 311 | /** 312 | * Return the boolean value in sp. 313 | * 314 | * @param key The key of sp. 315 | * @param defaultValue The default value if the sp doesn't exist. 316 | * @return the boolean value if sp exists or {@code defaultValue} otherwise 317 | */ 318 | public boolean getBoolean(@NonNull final String key, final boolean defaultValue) { 319 | return sp.getBoolean(key, defaultValue); 320 | } 321 | 322 | /** 323 | * Put the set of string value in sp. 324 | * 325 | * @param key The key of sp. 326 | * @param value The value of sp. 327 | */ 328 | public void put(@NonNull final String key, final Set value) { 329 | put(key, value, false); 330 | } 331 | 332 | /** 333 | * Put the set of string value in sp. 334 | * 335 | * @param key The key of sp. 336 | * @param value The value of sp. 337 | * @param isCommit True to use {@link SharedPreferences.Editor#commit()}, 338 | * false to use {@link SharedPreferences.Editor#apply()} 339 | */ 340 | public void put(@NonNull final String key, 341 | final Set value, 342 | final boolean isCommit) { 343 | if (isCommit) { 344 | sp.edit().putStringSet(key, value).commit(); 345 | } else { 346 | sp.edit().putStringSet(key, value).apply(); 347 | } 348 | } 349 | 350 | /** 351 | * Return the set of string value in sp. 352 | * 353 | * @param key The key of sp. 354 | * @return the set of string value if sp exists 355 | * or {@code Collections.emptySet()} otherwise 356 | */ 357 | public Set getStringSet(@NonNull final String key) { 358 | return getStringSet(key, Collections.emptySet()); 359 | } 360 | 361 | /** 362 | * Return the set of string value in sp. 363 | * 364 | * @param key The key of sp. 365 | * @param defaultValue The default value if the sp doesn't exist. 366 | * @return the set of string value if sp exists or {@code defaultValue} otherwise 367 | */ 368 | public Set getStringSet(@NonNull final String key, 369 | final Set defaultValue) { 370 | return sp.getStringSet(key, defaultValue); 371 | } 372 | 373 | /** 374 | * Return all values in sp. 375 | * 376 | * @return all values in sp 377 | */ 378 | public Map getAll() { 379 | return sp.getAll(); 380 | } 381 | 382 | /** 383 | * Return whether the sp contains the preference. 384 | * 385 | * @param key The key of sp. 386 | * @return {@code true}: yes
{@code false}: no 387 | */ 388 | public boolean contains(@NonNull final String key) { 389 | return sp.contains(key); 390 | } 391 | 392 | /** 393 | * Remove the preference in sp. 394 | * 395 | * @param key The key of sp. 396 | */ 397 | public void remove(@NonNull final String key) { 398 | remove(key, false); 399 | } 400 | 401 | /** 402 | * Remove the preference in sp. 403 | * 404 | * @param key The key of sp. 405 | * @param isCommit True to use {@link SharedPreferences.Editor#commit()}, 406 | * false to use {@link SharedPreferences.Editor#apply()} 407 | */ 408 | public void remove(@NonNull final String key, final boolean isCommit) { 409 | if (isCommit) { 410 | sp.edit().remove(key).commit(); 411 | } else { 412 | sp.edit().remove(key).apply(); 413 | } 414 | } 415 | 416 | /** 417 | * Remove all preferences in sp. 418 | */ 419 | public void clear() { 420 | clear(false); 421 | } 422 | 423 | /** 424 | * Remove all preferences in sp. 425 | * 426 | * @param isCommit True to use {@link SharedPreferences.Editor#commit()}, 427 | * false to use {@link SharedPreferences.Editor#apply()} 428 | */ 429 | public void clear(final boolean isCommit) { 430 | if (isCommit) { 431 | sp.edit().clear().commit(); 432 | } else { 433 | sp.edit().clear().apply(); 434 | } 435 | } 436 | 437 | private static boolean isSpace(final String s) { 438 | if (s == null) return true; 439 | for (int i = 0, len = s.length(); i < len; ++i) { 440 | if (!Character.isWhitespace(s.charAt(i))) { 441 | return false; 442 | } 443 | } 444 | return true; 445 | } 446 | } -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/util/Utils.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.util; 2 | 3 | import android.app.Activity; 4 | import android.app.ActivityManager; 5 | import android.content.ComponentName; 6 | import android.content.Context; 7 | import android.content.Intent; 8 | import android.content.pm.PackageInfo; 9 | import android.content.pm.PackageManager; 10 | import android.content.pm.ResolveInfo; 11 | import android.os.Build; 12 | import com.socks.library.KLog; 13 | import com.trump.myxposed.Constant; 14 | import de.robv.android.xposed.XposedBridge; 15 | import de.robv.android.xposed.XposedHelpers; 16 | 17 | import java.util.List; 18 | 19 | 20 | /** 21 | * Author: TRUMP 22 | * Date: 2022/2/10 0010 16:00 23 | * Desc: 24 | */ 25 | public class Utils { 26 | 27 | public static String getProcessName(Context context) { 28 | ActivityManager actMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 29 | List appList = actMgr.getRunningAppProcesses(); 30 | for (ActivityManager.RunningAppProcessInfo info : appList) { 31 | if (info.pid == android.os.Process.myPid()) { 32 | return info.processName; 33 | } 34 | } 35 | return "unknown"; 36 | } 37 | 38 | public static void log(String msg) { 39 | msg = "TRUMP====> " + msg; 40 | KLog.d(msg); 41 | XposedBridge.log(msg); 42 | } 43 | 44 | /** 45 | * 判断Launcher有没有隐藏 46 | * 47 | * @param activity 48 | * @return 49 | */ 50 | public static boolean isLauncherIconVisible(Activity activity) { 51 | ComponentName component = new ComponentName(activity, Constant.activityNameAlias); 52 | PackageManager manager = activity.getPackageManager(); 53 | Intent intent = new Intent().setComponent(component); 54 | List list; 55 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { 56 | list = manager.queryIntentActivities(intent, PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY)); 57 | } 58 | else { 59 | list = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 60 | } 61 | return !list.isEmpty(); 62 | } 63 | 64 | 65 | /** 66 | * 设置隐藏与显示 67 | * 68 | * @param visible 69 | */ 70 | public static void setLauncherIconVisible(Activity activity, boolean visible) { 71 | if (isLauncherIconVisible(activity) == visible) return; 72 | ComponentName component = new ComponentName(activity, Constant.activityNameAlias); 73 | PackageManager manager = activity.getPackageManager(); 74 | int newState = visible ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 75 | manager.setComponentEnabledSetting(component, newState, PackageManager.DONT_KILL_APP); 76 | } 77 | 78 | /** 79 | * 利用 Reflection 获取当前的系统 Context-- 只能用在xp环境中 80 | */ 81 | public static Context getSystemContextInXp() { 82 | Class activityThreadClass = XposedHelpers.findClass("android.app.ActivityThread", null); 83 | Object activityThread = XposedHelpers.callStaticMethod(activityThreadClass, "currentActivityThread"); 84 | Context context = (Context) XposedHelpers.callMethod(activityThread, "getSystemContext"); 85 | if (context == null) { 86 | log("getSystemContext is null"); 87 | } 88 | return context; 89 | } 90 | 91 | /** 92 | * 获取包名对应的版本号 93 | * 94 | * @param packageName 95 | * @return 96 | */ 97 | public static String getPackageVersionNameInXp(String packageName) { 98 | try { 99 | PackageManager packageManager = getSystemContextInXp().getPackageManager(); 100 | PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0); 101 | return packageInfo.versionName; 102 | } 103 | catch (PackageManager.NameNotFoundException e) { 104 | e.printStackTrace(); 105 | return ""; 106 | } 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /app/src/main/java/com/trump/myxposed/util/XSpUtil.java: -------------------------------------------------------------------------------- 1 | package com.trump.myxposed.util; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | 6 | import com.trump.myxposed.App; 7 | import com.trump.myxposed.BuildConfig; 8 | import com.trump.myxposed.Constant; 9 | 10 | import de.robv.android.xposed.XSharedPreferences; 11 | 12 | /** 13 | * Author: TRUMP 14 | * Date: 2022/2/11 0011 16:48 15 | * Desc: 只能在Xposed模块的类中使用 16 | */ 17 | public class XSpUtil { 18 | 19 | public static boolean isOk() { 20 | SharedPreferences sp = getPref(Constant.SpFileName); 21 | return sp != null; 22 | } 23 | 24 | public static boolean getBoolean(boolean inHookModule, String key) { 25 | SharedPreferences sp = inHookModule ? getXPref(Constant.SpFileName) : getPref(Constant.SpFileName); 26 | if (sp == null) { 27 | return false; 28 | } 29 | return sp.getBoolean(key, false); 30 | } 31 | 32 | public static void put(String key, Object value) { 33 | SharedPreferences sp = getPref(Constant.SpFileName); 34 | if (sp == null) { 35 | return; 36 | } 37 | SharedPreferences.Editor editor = sp.edit(); 38 | if (value instanceof String) { 39 | editor.putString(key, (String) value); 40 | } else if (value instanceof Boolean) { 41 | editor.putBoolean(key, (Boolean) value); 42 | } else if (value instanceof Integer) { 43 | editor.putInt(key, (Integer) value); 44 | } else if (value instanceof Float) { 45 | editor.putFloat(key, (Float) value); 46 | } else if (value instanceof Long) { 47 | editor.putLong(key, (Long) value); 48 | } 49 | editor.apply(); 50 | } 51 | 52 | private static SharedPreferences getXPref(String path) { 53 | XSharedPreferences pref = new XSharedPreferences(BuildConfig.APPLICATION_ID, path); 54 | pref.makeWorldReadable(); 55 | if (pref.hasFileChanged()) { 56 | pref.reload(); 57 | } 58 | return pref.getFile().canRead() ? pref : null; 59 | } 60 | 61 | private static SharedPreferences getPref(String path) { 62 | SharedPreferences pref; 63 | try { 64 | pref = App.getContext().getSharedPreferences(path, Context.MODE_WORLD_READABLE); 65 | } catch (SecurityException ignored) { 66 | // The new XSharedPreferences is not enabled or module's not loading 67 | pref = null; // other fallback, if any 68 | } 69 | return pref; 70 | } 71 | 72 | 73 | } 74 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | 15 | 21 | 22 | 29 | 30 | 38 | 39 | 40 | 41 | 45 | 46 | 54 | 55 | 61 | 62 | 63 | 73 | 74 | 79 | 80 | 88 | 89 | 90 | 95 | 96 | 104 | 105 | 111 | 112 | 113 | 118 | 119 | 127 | 128 | 134 | 135 | 136 | 146 | 147 | 152 | 153 | 161 | 162 | 168 | 169 | 170 | 175 | 176 | 184 | 185 | 191 | 192 | 193 | 194 | 195 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_setting_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 12 | 15 | 16 | 19 | 20 | 21 | 22 | 26 | 27 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes-night.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | com.weico.international 5 | com.sina.weibolite 6 | com.miui.analytics 7 | com.miui.guardprovider 8 | com.miui.personalassistant 9 | com.vmos.pro 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | /> 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FF0000 10 | #FFFFFFFF 11 | #08F 12 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MyXposed 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 19 | 20 | 29 | 30 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' version '7.4.2' apply false 3 | id 'com.android.library' version '7.4.2' apply false 4 | } 5 | 6 | task clean(type: Delete) { 7 | delete rootProject.buildDir 8 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | # When configured, Gradle will run in incubating parallel mode. 10 | # This option should only be used with decoupled projects. More details, visit 11 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 12 | # org.gradle.parallel=true 13 | # AndroidX package structure to make it clearer which packages are bundled with the 14 | # Android operating system, and which are packaged with your app"s APK 15 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 16 | 17 | 18 | android.nonTransitiveRClass=true 19 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding\=UTF-8 20 | android.useAndroidX=true 21 | android.enableJetifier=true 22 | org.gradle.daemon=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangyuan0217/MyXposed/c09f52856d1a430838939758c194aa5cfc98627a/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Feb 10 14:24:04 CST 2022 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | maven { 4 | url 'http://maven.aliyun.com/nexus/content/groups/public/' 5 | allowInsecureProtocol = true 6 | } 7 | google() 8 | } 9 | } 10 | dependencyResolutionManagement { 11 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 12 | repositories { 13 | maven { 14 | url 'http://maven.aliyun.com/nexus/content/groups/public/' 15 | allowInsecureProtocol = true 16 | } 17 | google() 18 | } 19 | } 20 | 21 | rootProject.name = "MyXposed" 22 | include ':app' --------------------------------------------------------------------------------