ByteScope

Android Battery Health

把 Android 藏起來的電池數字讀出來——設計容量、目前容量、循環次數,加上電壓、電流、功率與溫度的即時面板。

全部由你的瀏覽器透過 USB 線讀取,讀到的值不會離開這台電腦——這頁背後沒有伺服器。

正在檢查瀏覽器支援…

這頁讀了哪些東西

六個來源,其中五個是選配。同樣的 Android 版本,兩支手機在這頁能顯示的細節可以差很多,原因就在這裡。

來源是什麼多常出現
/sys/class/power_supply/*/charge_full電量計目前量到的滿電容量(µAh),也就是健康度的分子。高通與三星機種上很常見,但沒有的機種也不少。
/sys/class/power_supply/*/charge_full_design電池出廠的設計容量(µAh),也就是健康度的分母。比 charge_full 更少見,沒有它就算不出百分比。
/sys/class/power_supply/*/cycle_count電量計在電池一生中累計的完整充放電次數。很少見。Android 14 加了官方欄位,但要不要提供仍由廠商決定。
/sys/class/power_supply/*/current_now瞬時電流(µA)。單位由核心的 power-supply class 訂死,正負號沒有,所以方向改由充電狀態判斷。通常都有,這頁也優先採用它而不是 dumpsys 的值。
/sys/class/power_supply/*/voltage_now, temp端電壓(µV)與電池溫度(0.1 °C 為單位)。兩個來源至少有一個會提供,幾乎都拿得到。
dumpsys battery框架層的觀點:電量、充電狀態、HAL 健康判定、電量計數器與電池材質。除非被工作設定檔或政策擋掉,否則一定拿得到。

各 app 的耗電排行(dumpsys batterystats)還沒做——它的 checkin 格式在各版本之間差異太大,排錯還不如不排。

關於這個工具、FAQ 與相關工具

關於這個工具

用 USB 把 Android 手機接上 Chromium 系瀏覽器,這頁就會讀出設定 app 不會給你看的電池數字:電池出廠的設計容量、電量計目前量到的容量、已經數到的充放電循環次數,以及每秒更新一次的電壓、電流、由此算出的功率,還有電池自己的溫度。什麼都不會上傳。這頁是一個背後沒有伺服器的靜態檔案,數值從手機沿著 USB 線進到這個分頁,關掉分頁就不存在了。

為什麼 Android 沒有電池健康度畫面

iOS 從 iOS 11 就有「電池健康度」。Android 一直沒有對應的東西,原因是結構性的,不是忘了做:那個畫面要用的數字來自電量計晶片的驅動程式,而平台把它們當成選配。charge_full、charge_full_design、cycle_count 是核心 power-supply class 的屬性,驅動程式想公開就公開,不公開也可以——三個都沒有的手機,依然是完全合規的 Android 裝置。所以 Google 沒辦法把健康度放進設定裡,那會在相當比例的出貨機種上開天窗;公開 API 就停在電量、狀態、溫度與電壓。Android 14 總算加了官方的循環次數欄位,但要不要填仍然由廠商決定。

charge_full 到底量的是什麼

charge_full_design 是編進驅動程式裡的常數:電芯規格上的容量,也就是印在電池上的那個數字。charge_full 就不是常數了——它是電量計對「這顆電池從空到滿能吃進多少電荷」的當下估計值,會隨著它觀察完整充放電而重新學習。後者除以前者,就是任何一個 app 顯示的電池健康度,這頁也一樣。它兩個常見的行為也是這樣來的:深度放電之後跳個一兩個百分點,是電量計重新校正,電池本身沒變;有些裝置甚至會超過 100%,是電量計從一個保守的設計值往上學。這兩件事都是估計值的性質,不是電芯的性質,所以這頁選擇標示它,而不是抹平它。

為什麼兩支手機能顯示的細節差這麼多

有哪些屬性存在,取決於電量計晶片、它的驅動程式,以及廠商決定把驅動裡的多少東西露給使用者空間。高通平台和三星自家的電量計通常會給出那兩個容量欄位;不少聯發科機種則兩個都沒有。有些廠商把重要屬性放在叫 bms 或 battery_ext 的節點而不是 battery,這頁也會跟著找過去。三者之中,循環次數是罕見程度遙遙領先的一個。拿不到的時候,這頁會說是哪個來源沒有給——不會退而求其次去估,也不會把裝置沒回答的欄位寫成 0 mAh 或 0%,因為捏造出來的 0 跟一顆沒電的電池長得一模一樣。

百分比該怎麼讀,又不該怎麼讀

把它當成粗略的區間,不是量測值。設計容量的 80% 以上,對買了兩三年的手機來說很正常。60%–80% 之間你會感覺到續航變短,天冷或持續重負載時特別明顯。低於 60% 以後,手機會在需要瞬間大電流的場合——閃光燈、寒冷的早晨——明明還顯示有電卻直接關機,這個症狀才是真正該換電池的理由。這個數字沒辦法告訴你的是「從現在起還能撐多久」,那取決於你怎麼充電、手機多熱,而不是今天的比值落在哪。單一次讀值也看不出趨勢,一個月後再看一次。

你能控制的變數是溫度

鋰電池的老化來自兩件事:循環次數,以及在高溫且滿電狀態下待了多久。循環次數躲不掉,溫度則大半操之在你。即時面板把 40 °C 標成橘色、45 °C 標成紅色就是為此——持續在 45 °C 以上充電,容量掉得快到量得出來,這也是手機一熱就限制充電的原因。快充本身不如它產生的熱來得傷,所以一支戴著保護殼、放在溫暖窗邊充電的手機,比同一顆充電器放在涼快桌上傷得更多。一邊充電一邊看這裡的溫度曲線,光是拿掉保護殼的差別就看得出來。接下來:Web ADB 首頁有整台裝置的儀表板,精簡工具可以移掉在背景耗電的預載 app,儲存空間分析則處理另一個大家都會用完的東西。

常見問題

Android 要怎麼看電池循環次數?

開啟 USB 偵錯後用 USB 接上手機,看這頁的「循環次數」就是了。它來自 /sys/class/power_supply/*/cycle_count,或 Android 14 之後 dumpsys battery 的官方欄位——兩個都是選配,而且在很多手機上是真的不存在,不是藏在某個設定裡。如果這頁說此裝置未提供,那任何 app 也顯示不出來:手機上的 app 讀的是同一個檔案,還沒有 shell 權限去試別的節點。*#*#4636#*#* 那類撥號代碼叫出的測試選單,在原生 Android 上從來就沒有循環次數。

健康度掉到多少該換電池?

沒有一個「到這裡就該換」的門檻,會給你一個門檻的工具反而要小心。這個百分比就是 charge_full ÷ charge_full_design,是會隨校正漂移的電量計估計值。真正該換的理由是行為:重負載時剩 20%、30% 就關機;以前撐到晚上,現在下午就得充;同樣的用法卻明顯發燙。多數手機頭兩年都在 80% 以上,四年後大概落在 60%–70%。如果你是 85% 而且用起來沒感覺,那這個數字並沒有要你做任何事。

為什麼我的手機健康度、容量、循環次數都看不到?

因為廠商的電量計驅動程式沒有公開這些屬性,這是規格允許而且很常見的事。charge_full 和 charge_full_design 是核心 power-supply class 的選配項目,省略它們的驅動程式依然合規。這不是權限問題,不是開 USB 偵錯就會解鎖的東西,app 或 root 也變不出來——root 讓你能讀更多檔案,但變不出從來沒被建立的檔案。如果你的手機有兩個容量欄位卻沒有循環次數,那是最常見的組合:三者之中循環次數最罕見。

充電時溫度多高算危險?

持續運作在 45 °C 以上,容量損失就到了量得出來的程度,多數手機也是在這個溫度開始自己限制充電電流。快充過程中短暫超過 40 °C 很正常,不用擔心;真正折壽的是每天晚上一個小時泡在 45 °C。實用建議很無聊但有效:快充時把保護殼拿掉,別放在散不掉熱的床上或沙發上,也別留在車內或太陽直曬的地方充電。這頁的溫度讀的是電池自己的熱敏電阻,那才是重點——手機外殼一定比裡面的電芯涼。

需要 root 嗎?

不用。這裡讀的全部是一般 ADB shell 就能讀的檔案與 dump,所以你只需要打開 USB 偵錯。root 在某些裝置上能多讀幾個廠商自訂節點,但它變不出驅動程式沒公開的屬性,所以不會讓一支沒有容量欄位的手機忽然有了。也不需要裝 platform-tools:這頁用 WebUSB 在瀏覽器裡直接講 ADB 協定。不過同一時間只有一個程式能佔用 ADB 介面,桌面的 adb server 如果開著,要先用 adb kill-server 關掉。

這跟 iPhone 的「電池健康度」是同一個數字嗎?

概念一樣,實作不一樣。Apple 也是報一個最大容量比值,但那是它自己的電池管理韌體算出來的,套了它自己的濾波和它自己對「滿電」的定義。這頁顯示的是你手機的電量計此刻回報的比值,沒有平滑處理,所以它會在兩次讀值之間跳動,也可能在往上重新學習過的裝置上超過 100%。把 Android 的數字跟 iPhone 的數字比到小數點後兩位沒有意義;把同一支手機的數字隔幾個月比一次才有。