在聽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模組關核心#
有Root權限比較方便。用Magisk模組來關掉核心,只要往
/sys/devices/system/cpu/cpuX/online傳入0就能關閉核心。以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
- 關掉核心之後可以用Termux執行
sudo htop指令,檢查CPU核心是否真的顯示offline了。
與其關核心還不如使用Scene#
經過神人推薦,發現了這個中國神人開發的APP。其實Scene的效果就很好了,全部核心暴力關掉還不如優化過的演算法調度。它可以在不暴力關閉核心的情況下達成很好的省電效果。
而且這個APP也有關核心的功能。
安裝Scene,開啟均衡模式。不需要刷SD888 Efficient Tuning,讓它自己在背景調控頻率就行了

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