dumpsysは全部「画面ON」なのに真っ黒 ― Androidの「論理ON・物理OFF」とscreencapの罠

キオスク用に常時表示させている Android タブレット(HyperOS 系)が、本来点いているはずの時間帯に真っ黒になっていた。リモート(adb)から状態を片っ端から確認すると、すべてが「画面はONで最大輝度」だと言い張る。なのに現物は真っ黒。この食い違いの正体と、最終的に効いた一手を残しておく。

症状 ― 機械はみんな「ONだ」と言う

adb で見える限りの指標が、全部「点いている」を示していた。

dumpsys power   : mWakefulness=Awake
dumpsys display : mScreenState=ON / state ON / committedState ON
                  policy=BRIGHT
settings        : screen_brightness=255 / screen_brightness_mode=0(manual)
dumpsys window  : 前面アプリ=キオスク表示Activity(フォーカス保持)

電源状態はAwake、ディスプレイはON、輝度ポリシーはBRIGHT、システム輝度は手動の255、表示アプリは最前面。どこを見ても「明るく点いて中身も描いている」状態だ。それでも目の前のパネルは光っていない。

罠1 ― screencap は消灯していても写る

最初に自分を騙したのがこれ。確認のために adb exec-out screencap でスクショを撮ると、ちゃんと表示中のコンテンツが写る。「ほら写ってるから点いてるでしょ」と思ってしまう。

これは間違いだ。screencap が読むのは SurfaceFlinger のフレームバッファ(合成結果)であって、物理パネルのバックライトが点いているかどうかとは無関係。バックライトが完全に消えていても、フレームバッファには絵が残っているのでスクショは正常に撮れてしまう。

つまり、

「スクショが撮れた=画面が物理的に点いている」は成り立たない。

過去に自分は「再起動 → 起動 → 画面ON → 写真表示OK」をスクショで検証して合格にしていた。だがそれはバックライトの点灯を一切保証していない“偽の合格”だった。リモートで「画面が点いたか」を確かめたいなら、スクショではなく最後は人間の目か、別の物理指標を当てるしかない。

効かなかった対処

「Awakeで画面ONなのに暗い」のだから、起こし直せばいい――と素直にやって、ことごとく効かなかった。

  • input keyevent KEYCODE_WAKEUP(単独)
  • アプリ側の setTurnScreenOn(true)(Activity再前面化)
  • 輝度を 255 / manual に再設定

理由は後で腑に落ちた。これらはいずれも「今より上の状態へ遷移させる」操作だが、システムはすでに「ON」だと思っている。状態がONからONへは遷移しないので、実質ノーオペになり、パネルの再初期化が走らない。

効いた ― 明示的に「OFF→ON」を踏ませる

決め手は、いったん確実にOFFへ落としてからONに上げる、ハードウェアの電源サイクルだった。トグルではなく、方向が確定しているキーイベントを使うのがポイント。

adb shell input keyevent 223   # KEYCODE_SLEEP  -> 物理OFF
sleep 2
adb shell input keyevent 224   # KEYCODE_WAKEUP -> 物理ON

mScreenState が一度きちんと OFF に落ちて(ここで初めて本物の状態遷移が起きる)、その後 WAKEUPON に戻ると、パネルが再初期化されて点灯した。KEYCODE_SLEEP(223) と KEYCODE_WAKEUP(224) は方向が固定なので、「今ONだから押したらOFFになってしまう」というトグルの曖昧さがない。

なぜこれで点くのか

カギは「状態遷移が起きないと、パネルのハードウェア初期化が走らない」という点に尽きる。

  • システムが「ON」だと認識している状態で WAKEUP を送っても、ON→ON はノーオペ
  • 先に SLEEP で本物のOFFへ落とすと、続く WAKEUPOFF→ON という実際の遷移になり、その過程でバックライトを含むパネルが初期化される

「論理的にはON、物理的にはOFF」という不整合スタックに陥ったときは、上から起こすのではなく、一度きちんと底(OFF)まで落としてから上げ直すのが正攻法だった。

教訓

  • screencap でバックライトの点灯は判定できない。フレームバッファは消灯中でも絵を持つ。物理点灯のリモート検証は原理的に不可能と割り切り、最後は人の目で見る
  • 「Awake / state ON / BRIGHT / 輝度255」は物理点灯を意味しない。ソフト層の申告と現物がズレ得る
  • 不整合スタックの復帰は SLEEP(223) → WAKEUP(224) の強制OFF→ONサイクル。トグルではなく方向固定キーで踏む
  • 自動で画面を起こす仕組み(スケジュール点灯など)を作るなら、setTurnScreenOn 任せにせず、確実に状態遷移を発生させる設計にしておくと、こういうスタックに強くなる

機械の自己申告を信じすぎると、目の前の真っ黒を見落とす。最後に効いたのは、難しいAPIではなく「一度ちゃんと消す」という当たり前の一手だった。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

IP: 取得中...
216.73.216.177216.73.216.177