Android 自动休眠
Android Autosleep
目前我正在锁定 Android 内核,我想知道唤醒锁定机制。指定间隔时间的方式和位置定义了 phone 将暂停的时间点。是否有一个 sysfs 接口将一个值(以毫秒为单位)传递给内核。例如 Android OS 设置中的睡眠选项,其中的更改如何反映在内核中?
在 Android 资源中进行一些研究和挖掘后,我发现 PowerManagerService 正在负责测量自上次 activity 以来的时间,以便让设备进入睡眠状态。
关于suspend/resume代码流是个大话题(在android phone上)。内核中的代码流已经说明了通过:
After Android receice event.POWER and affirm no wake_lock exist,
Android trigger the suspend flow in kernel by echo mem >
/sys/power/state:
state_store >> pm_suspend >> enter_state >> suspend_prepare >>
suspend_devices_and_enter >> dpm_suspend_start >> dpm_suspend >>
device_suspend >> __device_suspend ---> suspend_enter (called by
suspend_device_and_enter after __device_suspend is completed)
更重要的是,内核私有接口(机制)将系统挂起到Android。但是大部分控制逻辑(策略)在Android系统的PowerManagerService中。我希望这能帮助你了解按下电源键后系统真正做了什么。
1。报告 PowerKey
在内核中通过输入系统报告电源键事件,可能是这样的:(取决于你是什么SoC平台)
input_report_key(powerkeydev,KEY_POWER, 1);
input_sync(powerkeydev);
睡眠(1);
input_report_key(powerkeydev,KEY_POWER, 1);
input_sync(powerkeydev);
KEY_POWER = 116 在include/uapi/linux/input.h
中定义
键码映射在android
android/frameworks/base/data/keyboards/Generic.kl
android/frameworks/native/include/input/KeycodeLables.h
拦截Key事件
android/frameworks/base/services/core/java/com/anroid/server/policy/PhoneWindowManager.java
interceptKeyBeforeQueueing() >> interceptPowerKeyUp() >> powerPress() >> powerPress >> case SHORT_PRESS_POWER_GO_TO_SLEEP >> mPowerManager.goToSleep
管理 PowerManagerService 中的唤醒锁:
PowerManager.java: goToSleep() -> mService.goToSleep()
PowerManagerService.java:goToSleep() -> goToSleepInternal -> goToSleepNoUpdateLocked() -> updatePowerStateLocked() -> updateSuspendBlockerLocked()(清除唤醒锁)
2。 libsuspend 触发挂起
suspend_thread_func 检查应该每 100 毫秒暂停一次。所有唤醒锁清除后:
android/system/core/libsuspend/autosuspend.c:
suspend_thread_func() -> 写入(state_fd, sleep_state, strlen(sleep_state))
这意味着:echo "mem" > /sys/power/state,这会触发内核中的挂起流程。
3。如何设置自动挂起线程?
线程 suspend_thread_func() 创建者:
初始化自动挂起
android/system/core/libsuspend/autosuspend.c: int autosuspend_enable(void)
在 jni 中调用自动挂起
android/frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp:
autosuspend_enable() -> nativeSetAutoSuspend()
由 PowerManagerService 初始化
android/services/core/java/com/android/server/power/PowerManagerService.java: nativeSetAutoSuspend(布尔启用);
目前我正在锁定 Android 内核,我想知道唤醒锁定机制。指定间隔时间的方式和位置定义了 phone 将暂停的时间点。是否有一个 sysfs 接口将一个值(以毫秒为单位)传递给内核。例如 Android OS 设置中的睡眠选项,其中的更改如何反映在内核中?
在 Android 资源中进行一些研究和挖掘后,我发现 PowerManagerService 正在负责测量自上次 activity 以来的时间,以便让设备进入睡眠状态。
关于suspend/resume代码流是个大话题(在android phone上)。内核中的代码流已经说明了通过:
After Android receice event.POWER and affirm no wake_lock exist, Android trigger the suspend flow in kernel by echo mem > /sys/power/state:
state_store >> pm_suspend >> enter_state >> suspend_prepare >> suspend_devices_and_enter >> dpm_suspend_start >> dpm_suspend >> device_suspend >> __device_suspend ---> suspend_enter (called by suspend_device_and_enter after __device_suspend is completed)
更重要的是,内核私有接口(机制)将系统挂起到Android。但是大部分控制逻辑(策略)在Android系统的PowerManagerService中。我希望这能帮助你了解按下电源键后系统真正做了什么。
1。报告 PowerKey
在内核中通过输入系统报告电源键事件,可能是这样的:(取决于你是什么SoC平台)
input_report_key(powerkeydev,KEY_POWER, 1); input_sync(powerkeydev); 睡眠(1); input_report_key(powerkeydev,KEY_POWER, 1); input_sync(powerkeydev);
KEY_POWER = 116 在include/uapi/linux/input.h
中定义
键码映射在android android/frameworks/base/data/keyboards/Generic.kl android/frameworks/native/include/input/KeycodeLables.h
拦截Key事件 android/frameworks/base/services/core/java/com/anroid/server/policy/PhoneWindowManager.java interceptKeyBeforeQueueing() >> interceptPowerKeyUp() >> powerPress() >> powerPress >> case SHORT_PRESS_POWER_GO_TO_SLEEP >> mPowerManager.goToSleep
管理 PowerManagerService 中的唤醒锁: PowerManager.java: goToSleep() -> mService.goToSleep() PowerManagerService.java:goToSleep() -> goToSleepInternal -> goToSleepNoUpdateLocked() -> updatePowerStateLocked() -> updateSuspendBlockerLocked()(清除唤醒锁)
2。 libsuspend 触发挂起
suspend_thread_func 检查应该每 100 毫秒暂停一次。所有唤醒锁清除后:
android/system/core/libsuspend/autosuspend.c: suspend_thread_func() -> 写入(state_fd, sleep_state, strlen(sleep_state))
这意味着:echo "mem" > /sys/power/state,这会触发内核中的挂起流程。
3。如何设置自动挂起线程?
线程 suspend_thread_func() 创建者:
初始化自动挂起
android/system/core/libsuspend/autosuspend.c: int autosuspend_enable(void)
在 jni 中调用自动挂起
android/frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp: autosuspend_enable() -> nativeSetAutoSuspend()
由 PowerManagerService 初始化
android/services/core/java/com/android/server/power/PowerManagerService.java: nativeSetAutoSuspend(布尔启用);