Linux挂起/恢复代码stream(在android手机上)

有没有人知道如何整个过程和代码stream是Android / Linux暂停/恢复(按下电话上的结束键后)有什么好的阅读? 我想了解并阅读相关的代码和文件。

或者,也许如果有人可以指向我的代码看看…

我希望我帮助。

Android是基于Linux的,所以基本上和Linux Suspend Resume基本相同。 有几个附加功能,最重要的是Wakelocks早期挂起 ,这是添加到使手机,PDA更节能,因为他们有限的电池。

现在让我们从你所问的问题开始:一旦你按下电源按钮,那么明显的中断被触发,从而启动序列。

区别:您应该注意到,只要按下电源按钮,LCD和触摸就进入睡眠状态。 他们是early_suspend 。 设备可能起来,只是最耗电的液晶显示屏,触摸已经睡着了。 然后在后台检查Wakelocks ,是否有人正在获取,就好像有人正在获取那么这些待完成的任务将被执行。

常见:然后文件系统同步(RAM – > NAND),进程被冻结。 然后设备暂停,然后保存CPU状态,然后休眠。 序列在Linux和Android中都很常见。

在Android接收event.POWER并确认不存在wake_lock之后,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都存在于arch / arm / <文件夹下的pm.c中。

关于挂起/恢复代码流(在android手机上)是一个很大的话题。 内核中的代码流已经被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的android /框架/基地/数据/键盘/ Generic.kl android /框架/本地/包括/输入/ KeycodeLables.h

  3. 拦截Key事件android / frameworks / base / services / core / java / com / anroid / server / policy / PhoneWindowManager.java拦截keyKeyBeforeQueueing()>> 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检查应该每100ms挂起一次。 所有的唤醒锁清除后:

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

这menes: echo“mem”> / sys / power / state ,它触发内核中的挂起流程。

3.如何设置autosuspend线程?

线程suspend_thread_func()是通过以下方式创建的:

  1. init autosuspend

    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 / server / core / java / com / android / server / power / PowerManagerService.java:nativeSetAutoSuspend(boolean enable);