快轉到主要內容

Android手機CPU關核心降頻省電,以高通SD888為例

· 民國115年丙午年
·
切換繁體/簡體
分類 智慧型手機 Root與刷機
標籤 Magisk
目錄

在聽Paul Yang - Everytime You Go Away的時候做的實驗

討論關掉手機核心達成省電的方法。

為了拯救Xperia 1 III的高通SD888續航力,踏上了路途。

後來又發現,其實不應該做這種暴力的操作,只要有一個針對電源模式極度優化的演算法APP就能解決了。

Hey, if we can solve any problem. Then why do we lose so many tears?

評析
#

入手SD888的第一天起,我就察覺到發熱耗電問題。

靠著刷SD888 Efficient Turning模組,稍微降頻壓制了發熱,可是依然耗電

我考慮用SecondScreen將手機解析度降為720p(1700x720,DPI 300),但是我覺得這個效果跟開啟深色模式一樣微乎其微。還不如進一步降低核心頻率,或者乾脆把SD888的大核和中核全部關掉,只剩下小核在線上。不過這樣就犧牲了玩遊戲效能。

手機最重要的應該是好攜帶與長續航,其他都是其次。唉,習慣Xperia 10 V(SD695 + 5000mAh)的8小時SOT(螢幕使用時間)之後,不管換哪支續航都不合我意

可旗艦機就算效能強又如何,不過是玻璃大砲。根據GSMArena資料,恐怕只有200g以上的超重手機能超越8小時SOT,或者起碼得是8Gen3處理器才有最佳能效比。Pixel 6a縱然相對省電,可是Tensor G1架構怎麼調都是只有5小時SOT。

現在使用Xperia 1 III + LineageOS,4500mAh電池健康度80%,為了解決SD888的發熱與耗電導致SOT只有4小時的問題,我嘗試調教一下系統深處的東西,總覺得降解析度到720p跟開啟深色模式一樣沒什麼效果,還會影響視覺效果,維持1080p就好。

SD888(1x 2.84GHz X1 + 3x 2.4GHz Cortex A78 + 4x 1.8GHz Cortex A55)

動機來自SD695(2x 2.2GHz Cortex A78 + 6x 1.8GHz Cortex A55),在Xperia 10 V的使用經驗,讓我想要追求8小時SOT

這根本不可能的事情!這個要求我知道很不合理,好比二戰日本海軍要求零戰速度快又要輕量又要能飛3000公里一樣瘋狂。但是我們可以無限逼近。

這是一個自廢武功的操作,實際上,或許我不需要那麼多強力的效能。我不涉及複雜的能效曲線設計,不去算哪個頻率比較好,不去折騰kernel governor。就只是暴力的關掉我不需要的核心,達成省電效果。

我發現Android 16現在不能用SmartPack Kernel Manager(Kernel Auditor的fork)關核心與調整頻率了,它會自己彈回去。這樣的話就只能用Magisk模組去壓了,它有常駐系統服務的功能。中國開發者有製作過SD888 Efficient Tuner模組,可以抑制發熱但還是耗電。我以這個模組為藍本,半vibe coding的協助下寫了我第一個Magisk模組。透過傳一些參數,關掉X1超大核,中小核限制在2GHz以下,並將核心頻率調整到類似SD695的水準。

預期目標
#

這樣歸納出了SD888的三檔電源模式,SOT時間來自AccuBattery估算:

  • 日用省電小卡頓模式:4x Cortex A55,SOT時間約6小時
  • 日用流暢模式:2x Cortex A78 + 4x Cortex A55,SOT時間約5小時
  • 效能全開模式:1x Cortex X1 + 3x Cortex A78 + 4x Cortex A55,稍微降頻防止過熱,SOT時間約4小時

1x Cortex X1 + 3x Cortex A78 + 4x Cortex A55降頻,這樣SOT有無進步呢?嗯,提升不明顯,SOT撐死就從原本的4小時提升到5小時。這續航看起來沒救了,我還是別浪費錢換電池了吧。

喔,還有一招,大核中核全關掉,只剩4個A55小核在線上,實測就可以有6小時SOT啦。

4x Cortex A55基本上已經把手機弄到變成RK3566開發板的等級了。但是因為Adreno 660 GPU還在線上所以Android UI不至於非常卡,當然120Hz是不可能使用的了。

這個模式連玩FGO都會卡。

相機啟動會頓個5秒,錄1080p60影片會lag。

不過,就我大部份的操作場景來說(瀏覽器看社群網站 + 背景播放音樂),滑動還是流暢的,其實我是可以忍受。

利用Magisk模組關核心
#

  1. 有Root權限比較方便。用Magisk模組來關掉核心,只要往/sys/devices/system/cpu/cpuX/online傳入0就能關閉核心。

  2. SD888 Efficient Tuner為範本,只要修改Magisk模組中的service.sh,設定要常駐執行的指令就行了。然後修改module.prop數值,壓縮為.zip刷入。

展開:日用省電小卡頓模式 4x Cortex A55
#!/system/bin/sh

MODDIR=${0%/*}

# 等系統、thermal、vendor service 完全起來
sleep 35

# CPU governor(保守)
for gov in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    chmod 644 $gov
    echo schedutil > $gov
done


# 小核 A55(cpu0 1 2 3)
for cpu in 0 1 2 3; do
    chmod 644 /sys/devices/system/cpu/cpu$cpu/cpufreq/scaling_max_freq
done

# 中核 A78 (cpu 4 5 6 7) 全關閉
for cpu in 4 5 6 7; do
    chmod 644 /sys/devices/system/cpu/cpu$cpu/cpufreq/scaling_max_freq
    echo 0 > /sys/devices/system/cpu/cpu$cpu/online
done

chmod 644 /sys/devices/system/cpu/cpu4/online
    echo 0 > /sys/devices/system/cpu/cpu4/online

chmod 644 /sys/devices/system/cpu/cpu5/online
    echo 0 > /sys/devices/system/cpu/cpu5/online

    chmod 644 /sys/devices/system/cpu/cpu6/online
    echo 0 > /sys/devices/system/cpu/cpu6/online

# 大核 X1(cpu7)關閉
chmod 644 /sys/devices/system/cpu/cpu7/online
echo 0 > /sys/devices/system/cpu/cpu7/online


# GPU(Adreno 660)降頻

chmod 644 /sys/class/kgsl/kgsl-3d0/max_pwrlevel
echo 5 > /sys/class/kgsl/kgsl-3d0/max_pwrlevel

# Scheduler(減少升核)

if [ -e /proc/sys/kernel/sched_upmigrate ]; then
    echo 95 > /proc/sys/kernel/sched_upmigrate
fi

if [ -e /proc/sys/kernel/sched_downmigrate ]; then
    echo 85 > /proc/sys/kernel/sched_downmigrate
fi

# cpuset(背景只跑小核)

if [ -e /dev/cpuset/background/cpus ]; then
    echo 0-3 > /dev/cpuset/background/cpus
fi

if [ -e /dev/cpuset/system-background/cpus ]; then
    echo 0-3 > /dev/cpuset/system-background/cpus
fi

exit 0
展開:日用流暢模式 2x Cortex A78 + 4x Cortex A55
#!/system/bin/sh

MODDIR=${0%/*}

# 等系統、thermal、vendor service 完全起來
sleep 35

# CPU governor(保守)
for gov in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    chmod 644 $gov
    echo schedutil > $gov
done


# 小核 A55(cpu 0 1 2 3)
for cpu in 0 1 2 3; do
    chmod 644 /sys/devices/system/cpu/cpu$cpu/cpufreq/scaling_max_freq
done

# 中核 A78(cpu 4 5 6)關閉1中核並降頻
chmod 644 /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq
echo 2227200 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq

chmod 644 /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq
echo 2227200 > /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq

chmod 644 /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu6/online

# 大核 X1(cpu7)關閉
chmod 644 /sys/devices/system/cpu/cpu7/online
echo 0 > /sys/devices/system/cpu/cpu7/online


# GPU(Adreno 660)降頻

chmod 644 /sys/class/kgsl/kgsl-3d0/max_pwrlevel
echo 5 > /sys/class/kgsl/kgsl-3d0/max_pwrlevel

# Scheduler(減少升核)

if [ -e /proc/sys/kernel/sched_upmigrate ]; then
    echo 95 > /proc/sys/kernel/sched_upmigrate
fi

if [ -e /proc/sys/kernel/sched_downmigrate ]; then
    echo 85 > /proc/sys/kernel/sched_downmigrate
fi

# cpuset(背景只跑小核)
if [ -e /dev/cpuset/background/cpus ]; then
    echo 0-3 > /dev/cpuset/background/cpus
fi

if [ -e /dev/cpuset/system-background/cpus ]; then
    echo 0-3 > /dev/cpuset/system-background/cpus
fi

exit 0
  1. 關掉核心之後可以用Termux執行sudo htop指令,檢查CPU核心是否真的顯示offline了。

與其關核心還不如使用Scene
#

經過神人推薦,發現了這個中國神人開發的APP。其實Scene的效果就很好了,全部核心暴力關掉還不如優化過的演算法調度。它可以在不暴力關閉核心的情況下達成很好的省電效果。

而且這個APP也有關核心的功能。

安裝Scene,開啟均衡模式。不需要刷SD888 Efficient Tuning,讓它自己在背景調控頻率就行了

在不關閉任何核心的情況下,Scene達成的續航力效果,從AccuBattery的資料來看,幾乎跟Cortex A55 x4的成果相當

相關文章


此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Giscus留言板,需要Github帳號才能留言。支援Markdown語法,若要上傳圖片請善用外部圖床。您的留言會在Github Discussions向所有人公開。

Click here to edit your comments.

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用外部圖床網站。