Skip to content

Commit a1d5de3

Browse files
Implement AntiWakeLock (#45)
no app should be allowed to burn out my AMOLED panel
1 parent 0da9b7d commit a1d5de3

File tree

11 files changed

+205
-0
lines changed

11 files changed

+205
-0
lines changed

AntiWakeLock/Readme.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# AntiWakeLock
2+
3+
Disable WAKE_LOCK and FLAG_KEEP_SCREEN_ON.
4+
5+
Can be applied to selected apps or the whole system.

AntiWakeLock/build.gradle.kts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
plugins {
2+
alias(libs.plugins.buildlogic.android.application)
3+
alias(libs.plugins.buildlogic.kotlin.android)
4+
}
5+
6+
android {
7+
namespace = "com.programminghoch10.AntiWakeLock"
8+
9+
defaultConfig {
10+
minSdk = 1
11+
targetSdk = 36
12+
}
13+
}
14+
15+
dependencies {
16+
implementation(project(":logger"))
17+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest
3+
xmlns:android="http://schemas.android.com/apk/res/android">
4+
5+
<application android:label="AntiWakeLock">
6+
<meta-data
7+
android:name="xposedmodule"
8+
android:value="true"
9+
/>
10+
<meta-data
11+
android:name="xposeddescription"
12+
android:value="Disable WAKE_LOCK"
13+
/>
14+
<meta-data
15+
android:name="xposedminversion"
16+
android:value="93"
17+
/>
18+
</application>
19+
20+
</manifest>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
com.programminghoch10.AntiWakeLock.PowerManagerHook
2+
com.programminghoch10.AntiWakeLock.PowerManagerServiceHook
3+
com.programminghoch10.AntiWakeLock.WindowHook
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.programminghoch10.AntiWakeLock
2+
3+
import java.util.concurrent.*
4+
import android.os.Build
5+
import android.os.PowerManager
6+
import android.os.WorkSource
7+
import de.robv.android.xposed.IXposedHookLoadPackage
8+
import de.robv.android.xposed.XC_MethodReplacement.DO_NOTHING
9+
import de.robv.android.xposed.XC_MethodReplacement.returnConstant
10+
import de.robv.android.xposed.XposedHelpers
11+
import de.robv.android.xposed.callbacks.XC_LoadPackage
12+
13+
class PowerManagerHook : IXposedHookLoadPackage {
14+
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
15+
XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "acquire", DO_NOTHING)
16+
XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "acquire", Long::class.java, DO_NOTHING)
17+
18+
// optional hooks for completeness
19+
XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "isHeld", returnConstant(false))
20+
XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "release", DO_NOTHING)
21+
XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "release", Int::class.java, DO_NOTHING)
22+
XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "setReferenceCounted", Boolean::class.java, DO_NOTHING)
23+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) XposedHelpers.findAndHookMethod(
24+
PowerManager.WakeLock::class.java,
25+
"setStateListener",
26+
Executor::class.java,
27+
PowerManager.WakeLockStateListener::class.java,
28+
DO_NOTHING,
29+
)
30+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) XposedHelpers.findAndHookMethod(
31+
PowerManager.WakeLock::class.java,
32+
"setWorkSource",
33+
WorkSource::class.java,
34+
DO_NOTHING,
35+
)
36+
}
37+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.programminghoch10.AntiWakeLock
2+
3+
import android.os.Build
4+
import de.robv.android.xposed.IXposedHookLoadPackage
5+
import de.robv.android.xposed.XC_MethodReplacement
6+
import de.robv.android.xposed.XposedBridge
7+
import de.robv.android.xposed.XposedHelpers
8+
import de.robv.android.xposed.callbacks.XC_LoadPackage
9+
10+
class PowerManagerServiceHook : IXposedHookLoadPackage {
11+
fun disableMethodByName(clazz: Class<*>, name: String) {
12+
val method = clazz.declaredMethods.single { it.name == name }
13+
XposedBridge.hookMethod(method, XC_MethodReplacement.DO_NOTHING)
14+
}
15+
16+
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
17+
if (lpparam.packageName != "android") return
18+
19+
val PowerManagerServiceClass = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) XposedHelpers.findClass("com.android.server.power.PowerManagerService", lpparam.classLoader)
20+
else XposedHelpers.findClass("com.android.server.PowerManagerService", lpparam.classLoader)
21+
22+
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
23+
disableMethodByName(PowerManagerServiceClass, "acquireWakeLock")
24+
disableMethodByName(PowerManagerServiceClass, "releaseWakeLock")
25+
}
26+
27+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
28+
disableMethodByName(PowerManagerServiceClass, "acquireWakeLockInternal")
29+
disableMethodByName(PowerManagerServiceClass, "releaseWakeLockInternal")
30+
}
31+
32+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
33+
val BinderServiceClass = XposedHelpers.findClass("${PowerManagerServiceClass.name}\$BinderService", lpparam.classLoader)
34+
disableMethodByName(BinderServiceClass, "acquireWakeLock")
35+
disableMethodByName(BinderServiceClass, "releaseWakeLock")
36+
}
37+
}
38+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.programminghoch10.AntiWakeLock
2+
3+
import android.os.Build
4+
import android.view.SurfaceView
5+
import android.view.View
6+
import android.view.Window
7+
import android.view.WindowManager
8+
import de.binarynoise.logger.Logger.log
9+
import de.robv.android.xposed.IXposedHookLoadPackage
10+
import de.robv.android.xposed.XC_MethodHook
11+
import de.robv.android.xposed.XC_MethodReplacement.DO_NOTHING
12+
import de.robv.android.xposed.XposedHelpers
13+
import de.robv.android.xposed.callbacks.XC_LoadPackage
14+
15+
class WindowHook : IXposedHookLoadPackage {
16+
fun filterKeepScreenOnFlag(flags: Int): Int {
17+
return flags and WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.inv()
18+
}
19+
20+
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
21+
XposedHelpers.findAndHookMethod(
22+
Window::class.java,
23+
"addFlags",
24+
Int::class.java,
25+
object : XC_MethodHook() {
26+
override fun beforeHookedMethod(param: MethodHookParam) {
27+
log("removing FLAG_KEEP_SCREEN_ON from addFlags")
28+
param.args[0] = filterKeepScreenOnFlag(param.args[0] as Int)
29+
}
30+
},
31+
)
32+
XposedHelpers.findAndHookMethod(
33+
Window::class.java,
34+
"setFlags", Int::class.java, Int::class.java,
35+
object : XC_MethodHook() {
36+
override fun beforeHookedMethod(param: MethodHookParam) {
37+
log("removing FLAG_KEEP_SCREEN_ON from setFlags")
38+
param.args[0] = filterKeepScreenOnFlag(param.args[0] as Int)
39+
param.args[1] = filterKeepScreenOnFlag(param.args[1] as Int)
40+
}
41+
},
42+
)
43+
44+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
45+
try {
46+
val AttachInfoClass = Class.forName(View::class.java.name + "\$AttachInfo", false, lpparam.classLoader)
47+
XposedHelpers.findAndHookMethod(
48+
SurfaceView::class.java,
49+
"performCollectViewAttributes",
50+
AttachInfoClass,
51+
Int::class.java,
52+
object : XC_MethodHook() {
53+
override fun afterHookedMethod(param: MethodHookParam) {
54+
val attachInfo = param.args[0]
55+
XposedHelpers.setBooleanField(attachInfo, "mKeepScreenOn", false)
56+
}
57+
},
58+
)
59+
} catch (e: Throwable) {
60+
log("failed to hook SurfaceView.performCollectViewAttributes", e)
61+
}
62+
}
63+
64+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
65+
try {
66+
val ViewRootImplClass = Class.forName("android.view.ViewRootImpl", false, lpparam.classLoader)
67+
XposedHelpers.findAndHookMethod(
68+
ViewRootImplClass,
69+
"applyKeepScreenOnFlag",
70+
WindowManager.LayoutParams::class.java,
71+
DO_NOTHING,
72+
)
73+
log("hooked applyKeepScreenOnFlag to do nothing")
74+
} catch (e: Throwable) {
75+
log("failed to hook ViewRootImpl.applyKeepScreenOnFlag", e)
76+
}
77+
}
78+
}
79+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Disable WAKE_LOCK and FLAG_KEEP_SCREEN_ON.
2+
3+
Can be applied to selected apps or the whole system.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Disable WAKE_LOCK and FLAG_KEEP_SCREEN_ON.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
AntiWakeLock

0 commit comments

Comments
 (0)