安卓屏保调试

本文最后更新于:2025年3月16日 下午

先看一下在设置点击屏保预览后的调用链(Android 14)

sequenceDiagram
    participant User
    participant MaterialButton
    participant View
    participant DreamSettings
    participant DreamBackend

    User->>MaterialButton: 点击按钮( performClick())
    MaterialButton->>View: performClick()
    View->>DreamSettings: 触发 onClick() (lambda 表达式)
    DreamSettings->>DreamBackend: 调用 preview()

DreamController的打印信息

Starting dream: name=ComponentInfo{com.google.android.apps.tv.dreamx/com.google.android.apps.tv.dreamx.service.Backdrop}, isPreviewMode=true, canDoze=false, userId=0, reason=’test dream’

DreamActivity是一个不需要注册的Activity,运行在各个屏保进程。

屏保应用实现DreamService即可。

屏保状态时,后台起应用会进入 onStop 状态(该例子 onStop 里面调用了 finish)

img

退出屏保的方法

1、有触摸或者按键输入

2、配置config_dismissDreamOnActivityStart 为 true 则会在新 activity 起来后退出屏保

1
2
3
4
5
 <!-- Whether to dismiss the active dream when an activity is started. Doesn't apply to

assistant activities (ACTIVITY_TYPE_ASSISTANT) -->

<bool name="config_dismissDreamOnActivityStart">false</bool>

img

img

3、跨进程调用DreamManagerService 的awaken(需要系统签名)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import android.os.IBinder
import androidx.annotation.RequiresPermission

class DreamManager {
private val TAG = "DreamManager"
//private var mDreamManager: Any? = context.getSystemService("dream")
private var mDreamManager: Any? = null

init {
mDreamManager = try {
val dream = Reflector.on("android.os.ServiceManager").method("getService", String::class.java).call<Any>("dreams")
Reflector.on("android.service.dreams.IDreamManager\$Stub").method("asInterface", IBinder::class.java).call<Any>(dream)
} catch (e: Exception) {
null
}
}

@RequiresPermission("android.permission.READ_DREAM_STATE")
fun isDreaming(): Boolean {
if (mDreamManager == null) {
return false
}
return try {
Reflector.with(mDreamManager!!).method("isDreaming").call()
} catch (e: Exception) {
false
}
}

@RequiresPermission("android.permission.WRITE_DREAM_STATE")
fun stopDream() {
mDreamManager?.let {
try {
Reflector.with(it).method("awaken").call<Unit>()
} catch (e: Exception) {
}
}
}
}

屏保调试命令:cmd dreams

roc_rk3588s_pc:/ # cmd dreams -h

Dream manager (dreams) commands:

help

​ Print this help text.

start-dreaming

​ Start the currently configured dream.

stop-dreaming

​ Stops any active dream

cmd dreams start-dreaming

cmd dreams stop-dreaming