diff --git a/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt b/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt index 00ead85..e0b5c3c 100644 --- a/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt +++ b/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt @@ -229,6 +229,16 @@ object ShamrockConfig { 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) { val preferences = ctx.getSharedPreferences("config", 0) preferences.edit().putBoolean("anti_qq_trace", v).apply() @@ -333,6 +343,7 @@ object ShamrockConfig { "alive_reply" to preferences.getBoolean("alive_reply", 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), + "forbid_useless_process" to preferences.getBoolean("forbid_useless_process", false) ) } diff --git a/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt b/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt index b8b1ee4..608d5d5 100644 --- a/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt +++ b/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt @@ -100,17 +100,16 @@ fun LabFragment() { thickness = 0.2.dp ) - /* Function( - title = "自动清理QQ垃圾", - desc = "也许会导致奇怪的问题(无效)。", + title = "禁止无用进程", + desc = "禁止QQ生成无用进程浪费内存", descColor = color, - isSwitch = ShamrockConfig.isAutoClean(ctx) + isSwitch = ShamrockConfig.isForbidUselessProcess(ctx) ) { - ShamrockConfig.setAutoClean(ctx, it) + ShamrockConfig.setForbidUselessProcess(ctx, it) ShamrockConfig.pushUpdate(ctx) - return@Function false - }*/ + return@Function true + } Function( title = "自回复测试", diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt index f7fe44e..c305539 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt @@ -76,6 +76,7 @@ internal object ShamrockConfig { putBoolean("enable_self_msg", intent.getBooleanExtra("enable_self_msg", false)) // 推送自己发的消息 putBoolean("shell", intent.getBooleanExtra("shell", false)) // 开启Shell接口 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.antiTrace = intent.getBooleanExtra("anti_qq_trace", true) @@ -126,6 +127,10 @@ internal object ShamrockConfig { return mmkv.getBoolean("enable_self_msg", false) } + fun forbidUselessProcess(): Boolean { + return mmkv.getBoolean("forbid_useless_process", false) + } + fun openWebSocketClient(): Boolean { return mmkv.getBoolean("ws_client", false) } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt index 10ea3e0..369e79d 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt @@ -1,10 +1,14 @@ package moe.fuqiuluo.shamrock.xposed import android.content.Context +import android.os.Process import de.robv.android.xposed.IXposedHookLoadPackage import de.robv.android.xposed.XposedBridge import de.robv.android.xposed.callbacks.XC_LoadPackage 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.xposed.loader.KeepAlive import moe.fuqiuluo.shamrock.xposed.loader.LuoClassloader @@ -15,12 +19,14 @@ import moe.fuqiuluo.shamrock.xposed.hooks.runFirstActions import mqq.app.MobileQQ import java.lang.reflect.Field import java.lang.reflect.Modifier +import kotlin.system.exitProcess -internal const val PACKAGE_NAME_QQ = "com.tencent.mobileqq" -internal const val PACKAGE_NAME_QQ_INTERNATIONAL = "com.tencent.mobileqqi" -internal const val PACKAGE_NAME_QQ_LITE = "com.tencent.qqlite" -internal const val PACKAGE_NAME_TIM = "com.tencent.tim" +private const val PACKAGE_NAME_QQ = "com.tencent.mobileqq" +private const val PACKAGE_NAME_QQ_INTERNATIONAL = "com.tencent.mobileqqi" +private const val PACKAGE_NAME_QQ_LITE = "com.tencent.qqlite" +private const val PACKAGE_NAME_TIM = "com.tencent.tim" +private val uselessProcess = listOf("peak", "tool", "mini", "qzone") internal class XposedEntry: IXposedHookLoadPackage { companion object { @@ -121,9 +127,7 @@ internal class XposedEntry: IXposedHookLoadPackage { System.setProperty("qxbot_flag", "1") } else return - log("Process Name = " + MobileQQ.getMobileQQ().qqProcessName) - - PlatformUtils.isTim() + val processName = MobileQQ.getMobileQQ().qqProcessName // MSG LISTENER 进程运行在主进程 // API 也应该开放在主进程 @@ -134,6 +138,20 @@ internal class XposedEntry: IXposedHookLoadPackage { 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) } }