├── .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'
--------------------------------------------------------------------------------