如今手持功能中出現的一對不可調和的矛盾就是越來越大的能量消耗與電池容量瓶頸之間的矛盾,就算沒有這個瓶頸,相對更持久的續航能力也是眾向所歸。
Android
系統一般應用於高端智慧型裝置,能源消耗尤其突出,因此對
Android
的電源管理系統的調研有很必要。
Android
系統是基於標準
Linux
核心之上的,在
Linux
核心在原有的
power manager
系統之上增加了相應了檔案,為
Android
系統的
power manager
提供底層服務支援。因此,調研工作在兩個層面展開:
Linux
核心層、
Android
系統層。
Linux
核心層:
針對
Android
系統而增添的
power manager
檔案有如下五個:
/Linux-2.6.29/kernel/power/ |-consoleearlysuspend.c |-earlysuspend.c |-fbearlysuspend.c |-userwakelock.c |-wakelock.c |
這五個檔案配合
Linux
層的
power manager
櫃架和與功耗相關的裝置驅動,向
Android
層提供了
power manager
的底層支援。與功耗相關的裝置主要包括
LCD
屏和鍵盤及其它裝置的
LED
燈。因些,在這類裝置的驅動中應該增加相應的
power manager
功能。
在該調研報告中,僅簡單地羅出列出各檔案中定義的功能函數以及向上提供的介面,其具體的功能調用及整個
power manager
櫃架地實現在後期的調研報告中闡述。
1
)、
consoleearlysuspend.c
功能函數:
static void console_early_suspend(struct early_suspend *h) ; static void console_late_resume(struct early_suspend *h) ; static int __init console_early_suspend_init(void) ; static void __exit console_early_suspend_exit(void) ; |
資料結構:
static struct early_suspend console_early_suspend_desc = { .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING, .suspend = console_early_suspend, .resume = console_late_resume, }; |
2
、
earlysuspend.c
功能函數:
void register_early_suspend(struct early_suspend *handler) ; void unregister_early_suspend(struct early_suspend *handler); static void early_suspend(struct work_struct *work); static void late_resume(struct work_struct *work); void request_suspend_state(suspend_state_t new_state); suspend_state_t get_suspend_state(void); |
供驅動使用的函數介面:
EXPORT_SYMBOL(register_early_suspend); EXPORT_SYMBOL(unregister_early_suspend); |
在
earlysuspend.h
檔案中定義了註冊介面函數:
#ifdef CONFIG_HAS_EARLYSUSPEND void register_early_suspend(struct early_suspend *handler); void unregister_early_suspend(struct early_suspend *handler); |
3
、
fbearlysuspend.c
功能函數:
static void stop_drawing_early_suspend(struct early_suspend *h); static void start_drawing_late_resume(struct early_suspend *h) ; static ssize_t wait_for_fb_sleep_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) ; static ssize_t wait_for_fb_wake_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) ; static int __init android_power_init(void) ; static void __exit android_power_exit(void) |
主要的資料結構:
static struct early_suspend stop_drawing_early_suspend_desc = { .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING, .suspend = stop_drawing_early_suspend, .resume = start_drawing_late_resume, }; |
在以上面的幾個函數中,都調用了
__wake_up
:
在
sched.c
中定義了這個函數
/** * __wake_up - wake up threads blocked on a waitqueue. * @q: the waitqueue * @mode: which threads * @nr_exclusive: how many wake-one or wake-many threads to wake up * @key: is directly passed to the wakeup function */ void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr_exclusive, void *key) { unsigned long flags; spin_lock_irqsave(&q->lock, flags); __wake_up_common(q, mode, nr_exclusive, 0, key); spin_unlock_irqrestore(&q->lock, flags); } |
4
、
userwakelock.c
static struct user_wake_lock *lookup_wake_lock_name(const char *buf, int allocate, long *timeoutptr); ssize_t wake_lock_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf); ssize_t ssixe_t wake_lock_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t n); ssize_t wake_unlock_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf); ssize_t wake_unlock_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t n); |
5
、
wakelock.c
提供了介面函數有:
EXPORT_SYMBOL(wake_lock_init); EXPORT_SYMBOL(wake_lock_destroy); EXPORT_SYMBOL(wake_lock); EXPORT_SYMBOL(wake_lock_timeout); EXPORT_SYMBOL(wake_unlock); EXPORT_SYMBOL(wake_lock_active); |
以上函數僅提供了一個
android power manager
實現的底層櫃架,要使其很好的
work
起來,需要相關裝置
driver
的支援和與
Android
層
power manager
系統很好的配合。
Android
系統層
Android
層的電源管理主要在
framework
層實現,其中
battery
的管理組件括充放電狀態、電量顯示等,但這部分暫不在調研範圍之間。該部分調研的重點在於
LCD
以及相關裝置
LED
狀態的切換。
相關檔案包括:
/frameworks/base/services/java/com/android/server/PowerManagerService.java
/platform/frameworks/base/core/java/android/os/PowerManager.java
/platform/frameworks/base/core/java/android/os/Power.java
/frameworks/base/core/jni/android_os_Power.cpp
/hardware/libhardware_legacy/power/power.c
引用一張比較全面的
power manager
架構圖,我們可以看到
power manager
的核心代碼在
PowerManagerService.java
中,該檔案通過利用
PowerManager.java
提供的類,
android_os_Power.cpp
提供的一些本地方法以及
power.c
對底層的調用,完成了
android
系統
power manager
的各自服務。該檔案的分析見後續的調研報告。