現在的Android手機雙核、四核變得非常普遍,同時CPU頻率經常輕松上2G,功耗肯定會顯著增加。而大多數的ARM架構的CPU采用的是對稱多處理(SMP)的方式處理多CPU。這就意味着每個CPU核心是被平等對待的,同時打開又同時關閉。顯然,這樣的做法在Mobile Device上顯得很耗能。所以,Qualcomm的Snapdragon CPU使用了一種叫非對稱多處理(aSMP)的技術,每個CPU核心可以獨立的開啟和關閉,也能設置不同的頻率。因此,針對使用Snapdragon CPU的Android手機,我們可以通過限制CPU核心數或者限制CPU的頻率達到節能的目的。
Snapdragon有一個叫做mpdecision的程序管理CPU各個核心的開、關和頻率。所以如果想手動開關CPU的核心或者設置CPU核心的頻率就必須把這個程序關閉。
1
|
stop mpdecision
|
需要注意的是,這個程序會在每次啟動后執行,所以每次重啟后都需要重新執行上面的命令停止mpdecisiopn。
設置CPU的核心數在/sys/devices/system/cpu目錄下可以看到你的CPU有幾個核心,如果是雙核,就是cpu0和cpu1,如果是四核,還會加上cpu2和cpu3。
隨便進一個文件夾,比如cpu1,里面有個online文件。我們可以用cat命令查看該文件的內容
1
|
cat
/sys/devices/system/cpu/cpu1/online
|
這個文件只有一個數字,0或1。0表示該核心是offline狀態的,1表示該核心是online狀態的。所以,如果你想關閉這個核心,就把online文件的內容改為“0”;如果想打開該核心,就把文件內容改為“1”。
1
2
|
echo
"0"
>
/sys/devices/system/cpu/cpu1/online
# 關閉該CPU核心
echo
"1"
>
/sys/devices/system/cpu/cpu1/online
# 打開該CPU核心
|
首先我們要修改governor的模式,但在修改前需要查下CPU支持哪些governor的模式
1
|
cat
/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
|
我用的是Nexus 4手機,所以有以下5個選擇,其他的手機型號可能略有不同
1
|
interactive ondemand userspace powersave performance
|
這里performance表示不降頻,ondemand表示使用內核提供的功能,可以動態調節頻率,powersvae表示省電模式,通常是在最低頻率下運行,userspace表示用戶模式,在此模式下允許其他用戶程序調節CPU頻率。
在這里,我們將模式調整為“userspace”。
1
|
echo
"userspace"
>
/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
|
然后我們對CPU的頻率進行修改,CPU的頻率不是可以任意設置的,需要查看scaling_available_frequencies文件,看CPU支持哪些頻率。
1
|
cat
/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
|
從我的手機中可以獲得以下的值
384000 486000 594000 702000 810000 918000 1026000 1134000 1242000 1350000 1458000 1512000
這里的頻率是以Hz為單位的,我准備將cpu0設置為1.242GHz,那就將1242000寫入scaling_setspeed即可。
1
|
echo
"1242000"
>
/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
|
設置好后,我們可以通過scaling_cur_freq文件查看當前這個核心的頻率
1
|
cat
/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
|
最后我們也可以設置下CPU的最大和最小頻率,只需要將需要設置的頻率值寫入scaling_max_freq和scaling_min_freq即可
1
2
|
echo
"1350000"
>
/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
# 設置最大頻率
echo
"384000"
>
/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
# 設置最小頻率
|
這里要注意的是“最大值”需要大於等於“最小值”。
注意,這里設置的僅為某個CPU核心的頻率,你需要對每個online的CPU核心都進行設置,同時以上對文件的修改均需要root權限。
通過減少online的核心數和限制CPU頻率固然可以起到節省電量的目的,但是性能也是顯著降低,所以需要做一個權衡。