mirror of
https://github.com/whitechi73/OpenShamrock.git
synced 2024-08-14 13:12:17 +08:00
Shamrock
: fix #115
This commit is contained in:
parent
dc969440ee
commit
0bb871bf01
@ -122,16 +122,6 @@ fun LabFragment() {
|
|||||||
return@Function true
|
return@Function true
|
||||||
}
|
}
|
||||||
|
|
||||||
Function(
|
|
||||||
title = "自动唤醒QQ",
|
|
||||||
desc = "QQ进程死亡时重新打开QQ进程,前提本进程存活。",
|
|
||||||
descColor = color,
|
|
||||||
isSwitch = ShamrockConfig.enableAutoStart(ctx)
|
|
||||||
) {
|
|
||||||
ShamrockConfig.setAutoStart(ctx, it)
|
|
||||||
return@Function true
|
|
||||||
}
|
|
||||||
|
|
||||||
Function(
|
Function(
|
||||||
title = "开启Shell接口",
|
title = "开启Shell接口",
|
||||||
desc = "可能导致设备被入侵,请勿随意开启。",
|
desc = "可能导致设备被入侵,请勿随意开启。",
|
||||||
@ -142,6 +132,16 @@ fun LabFragment() {
|
|||||||
return@Function true
|
return@Function true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Function(
|
||||||
|
title = "自动唤醒QQ",
|
||||||
|
desc = "QQ进程死亡时重新打开QQ进程,前提本进程存活。",
|
||||||
|
descColor = color,
|
||||||
|
isSwitch = ShamrockConfig.enableAutoStart(ctx)
|
||||||
|
) {
|
||||||
|
ShamrockConfig.setAutoStart(ctx, it)
|
||||||
|
return@Function true
|
||||||
|
}
|
||||||
|
|
||||||
kotlin.runCatching {
|
kotlin.runCatching {
|
||||||
ctx.getSharedPreferences("shared_config", Context.MODE_WORLD_READABLE)
|
ctx.getSharedPreferences("shared_config", Context.MODE_WORLD_READABLE)
|
||||||
}.onSuccess {
|
}.onSuccess {
|
||||||
@ -155,6 +155,17 @@ fun LabFragment() {
|
|||||||
scope.toast(ctx, LocalString.restartSysToast)
|
scope.toast(ctx, LocalString.restartSysToast)
|
||||||
return@Function true
|
return@Function true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Function(
|
||||||
|
title = "禁用Doze模式",
|
||||||
|
desc = "禁止系统进入节能模式。",
|
||||||
|
descColor = color,
|
||||||
|
isSwitch = it.getBoolean("hook_doze", false)
|
||||||
|
) { value ->
|
||||||
|
it.edit().putBoolean("hook_doze", value).apply()
|
||||||
|
scope.toast(ctx, LocalString.restartSysToast)
|
||||||
|
return@Function true
|
||||||
|
}
|
||||||
}.onFailure {
|
}.onFailure {
|
||||||
AppRuntime.log("无法启用附加选项,LSPosed模块未激活或者不支持XSharedPreferences", Level.WARN)
|
AppRuntime.log("无法启用附加选项,LSPosed模块未激活或者不支持XSharedPreferences", Level.WARN)
|
||||||
}
|
}
|
||||||
|
@ -5,16 +5,13 @@ 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.utils.MMKVFetcher
|
import moe.fuqiuluo.shamrock.utils.MMKVFetcher
|
||||||
import moe.fuqiuluo.shamrock.xposed.loader.ActionLoader
|
import moe.fuqiuluo.shamrock.xposed.loader.ActionLoader
|
||||||
import moe.fuqiuluo.shamrock.xposed.loader.FuckAMS
|
import moe.fuqiuluo.shamrock.xposed.loader.KeepAlive
|
||||||
import moe.fuqiuluo.shamrock.xposed.loader.LuoClassloader
|
import moe.fuqiuluo.shamrock.xposed.loader.LuoClassloader
|
||||||
import moe.fuqiuluo.shamrock.tools.FuzzySearchClass
|
import moe.fuqiuluo.shamrock.tools.FuzzySearchClass
|
||||||
import moe.fuqiuluo.shamrock.tools.afterHook
|
import moe.fuqiuluo.shamrock.tools.afterHook
|
||||||
import moe.fuqiuluo.shamrock.utils.PlatformUtils
|
import moe.fuqiuluo.shamrock.utils.PlatformUtils
|
||||||
import moe.fuqiuluo.shamrock.xposed.loader.NativeLoader
|
|
||||||
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
|
||||||
@ -42,7 +39,7 @@ internal class XposedEntry: IXposedHookLoadPackage {
|
|||||||
override fun handleLoadPackage(param: XC_LoadPackage.LoadPackageParam) {
|
override fun handleLoadPackage(param: XC_LoadPackage.LoadPackageParam) {
|
||||||
when (param.packageName) {
|
when (param.packageName) {
|
||||||
PACKAGE_NAME_QQ -> entryMQQ(param.classLoader)
|
PACKAGE_NAME_QQ -> entryMQQ(param.classLoader)
|
||||||
"android" -> FuckAMS.injectAMS(param.classLoader)
|
"android" -> KeepAlive(param.classLoader)
|
||||||
PACKAGE_NAME_TIM -> entryTim(param.classLoader)
|
PACKAGE_NAME_TIM -> entryTim(param.classLoader)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,14 +7,12 @@ import android.content.pm.VersionedPackage
|
|||||||
import android.os.Build
|
import android.os.Build
|
||||||
import de.robv.android.xposed.XC_MethodReplacement
|
import de.robv.android.xposed.XC_MethodReplacement
|
||||||
import de.robv.android.xposed.XSharedPreferences
|
import de.robv.android.xposed.XSharedPreferences
|
||||||
import de.robv.android.xposed.XposedBridge
|
|
||||||
import de.robv.android.xposed.XposedHelpers
|
import de.robv.android.xposed.XposedHelpers
|
||||||
import moe.fuqiuluo.shamrock.helper.Level
|
import moe.fuqiuluo.shamrock.helper.Level
|
||||||
import moe.fuqiuluo.shamrock.helper.LogCenter
|
import moe.fuqiuluo.shamrock.helper.LogCenter
|
||||||
import moe.fuqiuluo.shamrock.remote.service.config.ShamrockConfig
|
import moe.fuqiuluo.shamrock.remote.service.config.ShamrockConfig
|
||||||
import moe.fuqiuluo.shamrock.tools.hookMethod
|
import moe.fuqiuluo.shamrock.tools.hookMethod
|
||||||
import moe.fuqiuluo.shamrock.xposed.XposedEntry
|
import moe.fuqiuluo.shamrock.xposed.XposedEntry
|
||||||
import moe.fuqiuluo.shamrock.xposed.loader.FuckAMS
|
|
||||||
import moe.fuqiuluo.shamrock.xposed.loader.LuoClassloader
|
import moe.fuqiuluo.shamrock.xposed.loader.LuoClassloader
|
||||||
import moe.fuqiuluo.shamrock.xposed.loader.NativeLoader
|
import moe.fuqiuluo.shamrock.xposed.loader.NativeLoader
|
||||||
|
|
||||||
|
@ -3,14 +3,15 @@ package moe.fuqiuluo.shamrock.xposed.loader
|
|||||||
|
|
||||||
import android.content.pm.ApplicationInfo
|
import android.content.pm.ApplicationInfo
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import com.arthenica.ffmpegkit.BuildConfig
|
import android.os.Process
|
||||||
import de.robv.android.xposed.XSharedPreferences
|
import de.robv.android.xposed.XSharedPreferences
|
||||||
import de.robv.android.xposed.XposedBridge
|
import de.robv.android.xposed.XposedBridge
|
||||||
import de.robv.android.xposed.XposedHelpers
|
import de.robv.android.xposed.XposedHelpers
|
||||||
import moe.fuqiuluo.shamrock.tools.hookMethod
|
import moe.fuqiuluo.shamrock.tools.hookMethod
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
|
import kotlin.concurrent.timer
|
||||||
|
|
||||||
internal object FuckAMS {
|
internal object KeepAlive {
|
||||||
private val KeepPackage = arrayOf(
|
private val KeepPackage = arrayOf(
|
||||||
"com.tencent.mobileqq", "moe.fuqiuluo.shamrock"
|
"com.tencent.mobileqq", "moe.fuqiuluo.shamrock"
|
||||||
)
|
)
|
||||||
@ -20,7 +21,46 @@ internal object FuckAMS {
|
|||||||
private lateinit var METHOD_IS_KILLED: Method
|
private lateinit var METHOD_IS_KILLED: Method
|
||||||
private var allowPersistent: Boolean = false
|
private var allowPersistent: Boolean = false
|
||||||
|
|
||||||
fun injectAMS(loader: ClassLoader) {
|
operator fun invoke(loader: ClassLoader) {
|
||||||
|
val pref = XSharedPreferences("moe.fuqiuluo.shamrock", "shared_config")
|
||||||
|
hookAMS(pref, loader)
|
||||||
|
hookDoze(pref, loader)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hookDoze(pref: XSharedPreferences, loader: ClassLoader) {
|
||||||
|
if (pref.file.canRead() && pref.getBoolean("hook_doze", false)) {
|
||||||
|
val result = runCatching {
|
||||||
|
val DeviceIdleController = XposedHelpers.findClass("com.android.server.DeviceIdleController", loader)
|
||||||
|
?: return@runCatching -1
|
||||||
|
val becomeActiveLocked = XposedHelpers.findMethodBestMatch(DeviceIdleController, "becomeActiveLocked", String::class.java, Integer.TYPE)
|
||||||
|
?: return@runCatching -2
|
||||||
|
if (!becomeActiveLocked.isAccessible) {
|
||||||
|
becomeActiveLocked.isAccessible = true
|
||||||
|
}
|
||||||
|
DeviceIdleController.hookMethod("onStart").after {
|
||||||
|
XposedBridge.log("[Shamrock] DeviceIdleController onStart")
|
||||||
|
timer(initialDelay = 120_000L, period = 240_000L) {
|
||||||
|
XposedBridge.log("[Shamrock] try to wakeup screen")
|
||||||
|
becomeActiveLocked.invoke(it.thisObject, "screen", Process.myUid())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DeviceIdleController.hookMethod("becomeInactiveIfAppropriateLocked").before {
|
||||||
|
XposedBridge.log("[Shamrock] DeviceIdleController becomeInactiveIfAppropriateLocked")
|
||||||
|
it.result = Unit
|
||||||
|
}
|
||||||
|
DeviceIdleController.hookMethod("stepIdleStateLocked").before {
|
||||||
|
XposedBridge.log("[Shamrock] DeviceIdleController stepIdleStateLocked")
|
||||||
|
it.result = Unit
|
||||||
|
}
|
||||||
|
return@runCatching 0
|
||||||
|
}.getOrElse { -5 }
|
||||||
|
if(result < 0) {
|
||||||
|
XposedBridge.log("[Shamrock] Unable to hookDoze: $result")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hookAMS(pref: XSharedPreferences, loader: ClassLoader) {
|
||||||
kotlin.runCatching {
|
kotlin.runCatching {
|
||||||
val ActivityManagerService = XposedHelpers.findClass("com.android.server.am.ActivityManagerService", loader)
|
val ActivityManagerService = XposedHelpers.findClass("com.android.server.am.ActivityManagerService", loader)
|
||||||
ActivityManagerService.hookMethod("newProcessRecordLocked").after {
|
ActivityManagerService.hookMethod("newProcessRecordLocked").after {
|
||||||
@ -30,7 +70,6 @@ internal object FuckAMS {
|
|||||||
XposedBridge.log("[Shamrock] Plan A failed: ${it.message}")
|
XposedBridge.log("[Shamrock] Plan A failed: ${it.message}")
|
||||||
}
|
}
|
||||||
|
|
||||||
val pref = XSharedPreferences("moe.fuqiuluo.shamrock", "shared_config")
|
|
||||||
if (pref.file.canRead()) {
|
if (pref.file.canRead()) {
|
||||||
allowPersistent = pref.getBoolean("persistent", false)
|
allowPersistent = pref.getBoolean("persistent", false)
|
||||||
XposedBridge.log("[Shamrock] allowPersistent = $allowPersistent")
|
XposedBridge.log("[Shamrock] allowPersistent = $allowPersistent")
|
Loading…
x
Reference in New Issue
Block a user