`

Android在标准linux基础上对休眠唤醒的实现(三)

 
阅读更多

四、android层源码解析

在linux之上经过android的软件堆层层封装,最终在上层的java应用程序中使用。休眠唤醒也是从最上层发出的命令,然后一层一层地将参数解析,往最底层传,最后走上标准linux的休眠唤醒之路。

这一部分将会初略分析休眠唤醒机制上linux之上所走的路线。

在linux之上,存在一个hal层,专门做和linux内核设备打交道的事情,这里也不例外。休眠唤醒机制的hal层源码位于:@hardware/libhardware_legacy/power/power.c

该文件源码比较简单,下面列举重点片段:



Hal层的代码在jni层中被使用,源码位于:frameworks/base/core/jni/android_os_Power.cpp,代码片段如下:



Jni的方法需要注册到上层才可以使用,同时也需要在上层的对应java类中声明了native才可以使用。那么这里的方法在java中对应的声明在哪里呢?frameworks/base/core/java/android/os/Power.java,该文件定义一个java类,如下:



声明的jni接口应该是被java server在使用,这里就是专门的电源管理服务:PowerManagerService使用,具体源码位置在:frameworks/base/services/java/com/android/server/PowerManagerService.java。android在最上层还提供了现场的android.os.PowerManager类

(frameworks/base/core/java/android/os/PowerManager.java)来供app使用,PowerManager类会调用java服务PowerManagerService的方法来完成与wakelock相关的工作。

@ frameworks/base/core/java/android/os/PowerManager.java

类PowerManager中内嵌了一个WakeLock类,另外还定义了wakelock的类型,下面是代码片段:



应用实例:


接下来就会调用到java服务PowerManagerService中:



releaseWakeLockLocked(lock, flags, false)函数会调用power类的方法:



上层休眠唤醒都是调用PowerManagerService类的方法:

goToSleep()

à goToSleepWithReason()

à goToSleepLocked()

à setPowerState()

à setScreenStateLocked()

à Power.setScreenState()

à jni方法

Android层的代码分析得不是很详细,这里只关注框架和流程。下图是网上的一个框架,可以参考一下:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics