5

有没有人知道关于android/linux挂起/恢复的整个过程和代码流如何的好读物(按下手机上的结束键后)?我正在尝试理解和阅读相关的代码和文件。

或者,也许有人可以指出我要查看的代码......

4

2 回答 2

12

我希望我能帮上忙。

Android是基于Linux的,所以和Linux Suspend Resume的基础差不多。几乎没有额外的功能,最重要的是唤醒锁早期暂停,它们被添加以使手机、PDA 更省电,因为它们的电池有限。

现在让我们从您要问的问题开始:一旦您按下电源按钮,显然会触发中断,从而启动序列。

区别:您应该已经注意到,一旦按下电源按钮,LCD 和触摸就会进入睡眠状态。他们是early_suspend。设备可能已启动,只是最耗电的 LCD,触摸已进入睡眠状态。然后在后台检查唤醒锁,是否有人在获取,就好像有人在获取一样,然后执行那些待处理的任务。

常见:然后文件系统被同步(RAM--> NAND)并且进程被冻结。然后设备被挂起,然后 CPU 状态被保存,然后它进入睡眠状态。序列在 Linux 和 Android 中都很常见。

在 Android 收到 event.POWER 并确认不存在唤醒锁后,Android 通过以下方式触发内核中的挂起流程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(在__device_suspend完成后由suspend_device_and_enter调用)

上述序列在 Linux 和 Android 中都存在。

文件:suspend.c、(kernel/power/)wakelock.c、main.c(drivers/base/power)。

注意:所有 SoC 特定的挂起回调,如 enter、valid、begin 都存在于 pm.c 中,存在于 arch/arm/< 文件夹中。

于 2012-11-07T04:31:46.177 回答
2

这是一个关于暂停/恢复代码流的大话题(在安卓手机上)。内核中的代码流由 shingaridavesh 说明。

更重要的是,内核私有接口(机制)将系统挂起到 Android。但大部分控制逻辑(策略)都在Android系统的PowerManagerService中。我希望这能帮助您了解按下电源键后系统的真正作用。

1.报告PowerKey

  1. 通过内核中的输入系统报告电源键事件,可能是这样的:(取决于你是什么SoC平台)

    input_report_key(powerkeydev,KEY_POWER, 1); input_sync(powerkeydev); msleep(1); input_report_key(powerkeydev,KEY_POWER, 1); input_sync(powerkeydev);

    KEY_POWER = 116 在 include/uapi/linux/input.h 中定义

  2. android/frameworks/base/data/keyboards/Generic.kl 中的键码映射 android/frameworks/native/include/input/KeycodeLables.h

  3. 拦截关键事件 android/frameworks/base/services/core/java/com/anroid/server/policy/PhoneWindowManager.java interceptKeyBeforeQueueing() >> interceptPowerKeyUp() >> powerPress() >> powerPress >> case SHORT_PRESS_POWER_GO_TO_SLEEP >> mPowerManager 。去睡觉

  4. 管理 PowerManagerService 中的唤醒锁: PowerManager.java: goToSleep() -> mService.goToSleep() PowerManagerService.java: goToSleep() -> goToSleepInternal -> goToSleepNoUpdateLocked() -> updatePowerStateLocked() -> updateSuspendBlockerLocked() (清除唤醒锁

2. libsuspend 触发挂起

  1. suspend_thread_func 检查应该每 100 毫秒暂停一次。清除所有唤醒锁后:

    android/system/core/libsuspend/autosuspend.c: suspend_thread_func() -> write(state_fd, sleep_state, strlen(sleep_state))

这个menes: echo "mem" > /sys/power/state触发内核中的挂起流程。

3. 如何设置自动挂起线程?

线程 suspend_thread_func() 由以下人员创建:

  1. 初始化自动挂起

    android/system/core/libsuspend/autosuspend.c: int autosuspend_enable(void)

  2. 在 jni 中调用 autosuspend

    android/frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp: autosuspend_enable() -> nativeSetAutoSuspend()

  3. 由 PowerManagerService 初始化

    android/services/core/java/com/android/server/power/PowerManagerService.java: nativeSetAutoSuspend(boolean enable);

于 2017-03-04T08:09:38.113 回答