Shamrock: 允许禁止QQ启动无关紧要的进程服务

This commit is contained in:
白池 2024-02-16 00:09:35 +08:00
parent cf943fd13a
commit 494b1f1fd0
4 changed files with 47 additions and 14 deletions

View File

@ -229,6 +229,16 @@ object ShamrockConfig {
return preferences.getBoolean("anti_qq_trace", true) return preferences.getBoolean("anti_qq_trace", true)
} }
fun isForbidUselessProcess(ctx: Context): Boolean {
val preferences = ctx.getSharedPreferences("config", 0)
return preferences.getBoolean("forbid_useless_process", false)
}
fun setForbidUselessProcess(ctx: Context, v: Boolean) {
val preferences = ctx.getSharedPreferences("config", 0)
preferences.edit().putBoolean("forbid_useless_process", v).apply()
}
fun setAntiTrace(ctx: Context, v: Boolean) { fun setAntiTrace(ctx: Context, v: Boolean) {
val preferences = ctx.getSharedPreferences("config", 0) val preferences = ctx.getSharedPreferences("config", 0)
preferences.edit().putBoolean("anti_qq_trace", v).apply() preferences.edit().putBoolean("anti_qq_trace", v).apply()
@ -333,6 +343,7 @@ object ShamrockConfig {
"alive_reply" to preferences.getBoolean("alive_reply", false), "alive_reply" to preferences.getBoolean("alive_reply", false),
"enable_sync_msg_as_sent_msg" to preferences.getBoolean("enable_sync_msg_as_sent_msg", false), "enable_sync_msg_as_sent_msg" to preferences.getBoolean("enable_sync_msg_as_sent_msg", false),
"disable_auto_sync_setting" to preferences.getBoolean("disable_auto_sync_setting", false), "disable_auto_sync_setting" to preferences.getBoolean("disable_auto_sync_setting", false),
"forbid_useless_process" to preferences.getBoolean("forbid_useless_process", false)
) )
} }

View File

@ -100,17 +100,16 @@ fun LabFragment() {
thickness = 0.2.dp thickness = 0.2.dp
) )
/*
Function( Function(
title = "自动清理QQ垃圾", title = "禁止无用进程",
desc = "也许会导致奇怪的问题(无效)。", desc = "禁止QQ生成无用进程浪费内存",
descColor = color, descColor = color,
isSwitch = ShamrockConfig.isAutoClean(ctx) isSwitch = ShamrockConfig.isForbidUselessProcess(ctx)
) { ) {
ShamrockConfig.setAutoClean(ctx, it) ShamrockConfig.setForbidUselessProcess(ctx, it)
ShamrockConfig.pushUpdate(ctx) ShamrockConfig.pushUpdate(ctx)
return@Function false return@Function true
}*/ }
Function( Function(
title = "自回复测试", title = "自回复测试",

View File

@ -76,6 +76,7 @@ internal object ShamrockConfig {
putBoolean("enable_self_msg", intent.getBooleanExtra("enable_self_msg", false)) // 推送自己发的消息 putBoolean("enable_self_msg", intent.getBooleanExtra("enable_self_msg", false)) // 推送自己发的消息
putBoolean("shell", intent.getBooleanExtra("shell", false)) // 开启Shell接口 putBoolean("shell", intent.getBooleanExtra("shell", false)) // 开启Shell接口
putBoolean("enable_sync_msg_as_sent_msg", intent.getBooleanExtra("enable_sync_msg_as_sent_msg", false)) // 推送同步消息 putBoolean("enable_sync_msg_as_sent_msg", intent.getBooleanExtra("enable_sync_msg_as_sent_msg", false)) // 推送同步消息
putBoolean("forbid_useless_process", intent.getBooleanExtra("forbid_useless_process", false)) // 禁用QQ生成无用进程
} }
Config.defaultToken = intent.getStringExtra("token") Config.defaultToken = intent.getStringExtra("token")
Config.antiTrace = intent.getBooleanExtra("anti_qq_trace", true) Config.antiTrace = intent.getBooleanExtra("anti_qq_trace", true)
@ -126,6 +127,10 @@ internal object ShamrockConfig {
return mmkv.getBoolean("enable_self_msg", false) return mmkv.getBoolean("enable_self_msg", false)
} }
fun forbidUselessProcess(): Boolean {
return mmkv.getBoolean("forbid_useless_process", false)
}
fun openWebSocketClient(): Boolean { fun openWebSocketClient(): Boolean {
return mmkv.getBoolean("ws_client", false) return mmkv.getBoolean("ws_client", false)
} }

View File

@ -1,10 +1,14 @@
package moe.fuqiuluo.shamrock.xposed package moe.fuqiuluo.shamrock.xposed
import android.content.Context import android.content.Context
import android.os.Process
import de.robv.android.xposed.IXposedHookLoadPackage import de.robv.android.xposed.IXposedHookLoadPackage
import de.robv.android.xposed.XposedBridge import de.robv.android.xposed.XposedBridge
import de.robv.android.xposed.callbacks.XC_LoadPackage import de.robv.android.xposed.callbacks.XC_LoadPackage
import de.robv.android.xposed.XposedBridge.log import de.robv.android.xposed.XposedBridge.log
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.remote.service.config.ShamrockConfig
import moe.fuqiuluo.shamrock.utils.MMKVFetcher import moe.fuqiuluo.shamrock.utils.MMKVFetcher
import moe.fuqiuluo.shamrock.xposed.loader.KeepAlive import moe.fuqiuluo.shamrock.xposed.loader.KeepAlive
import moe.fuqiuluo.shamrock.xposed.loader.LuoClassloader import moe.fuqiuluo.shamrock.xposed.loader.LuoClassloader
@ -15,12 +19,14 @@ import moe.fuqiuluo.shamrock.xposed.hooks.runFirstActions
import mqq.app.MobileQQ import mqq.app.MobileQQ
import java.lang.reflect.Field import java.lang.reflect.Field
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
import kotlin.system.exitProcess
internal const val PACKAGE_NAME_QQ = "com.tencent.mobileqq" private const val PACKAGE_NAME_QQ = "com.tencent.mobileqq"
internal const val PACKAGE_NAME_QQ_INTERNATIONAL = "com.tencent.mobileqqi" private const val PACKAGE_NAME_QQ_INTERNATIONAL = "com.tencent.mobileqqi"
internal const val PACKAGE_NAME_QQ_LITE = "com.tencent.qqlite" private const val PACKAGE_NAME_QQ_LITE = "com.tencent.qqlite"
internal const val PACKAGE_NAME_TIM = "com.tencent.tim" private const val PACKAGE_NAME_TIM = "com.tencent.tim"
private val uselessProcess = listOf("peak", "tool", "mini", "qzone")
internal class XposedEntry: IXposedHookLoadPackage { internal class XposedEntry: IXposedHookLoadPackage {
companion object { companion object {
@ -121,9 +127,7 @@ internal class XposedEntry: IXposedHookLoadPackage {
System.setProperty("qxbot_flag", "1") System.setProperty("qxbot_flag", "1")
} else return } else return
log("Process Name = " + MobileQQ.getMobileQQ().qqProcessName) val processName = MobileQQ.getMobileQQ().qqProcessName
PlatformUtils.isTim()
// MSG LISTENER 进程运行在主进程 // MSG LISTENER 进程运行在主进程
// API 也应该开放在主进程 // API 也应该开放在主进程
@ -134,6 +138,20 @@ internal class XposedEntry: IXposedHookLoadPackage {
MMKVFetcher.initMMKV(ctx) MMKVFetcher.initMMKV(ctx)
} }
if (ShamrockConfig.forbidUselessProcess()) {
if(uselessProcess.any {
processName.contains(it, ignoreCase = true)
}) {
log("[Shamrock] Useless process detected: $processName, exit.")
Process.killProcess(Process.myPid())
exitProcess(0)
}
} else {
log("[Shamrock] Useless process detection is disabled.")
}
log("Process Name = $processName")
runFirstActions(ctx) runFirstActions(ctx)
} }
} }