ByteScope

Android Sensor Viewer

手機上每一顆感測器的規格、瀏覽器拿不到的即時數值,以及觸控面板送出的原始多點觸控。

全部透過 USB 線讀取,只留在這個分頁裡。不會在手機上裝任何 app,也不會上傳。

正在檢查瀏覽器支援…

這一頁會執行什麼指令,代價多少

每一條都只是讀取。不會改設定、不會裝東西、也不會寫入手機。

指令拿到什麼代價
dumpsys sensorservice感測器清單與每顆感測器的最近事件緩衝區——這一頁的即時數值。每跑一次幾十 KB 的文字,而且沒有精簡版。這就是即時更新預設不開的原因。
dumpsys thermalservice每個熱區的溫度,以及手機是否正在降頻。幾 KB,跟感測器那份 dump 搭同一趟。
getevent -lp所有輸入裝置與軸的範圍,用來校正觸控畫面。跑一次就結束。
getevent -lt /dev/input/eventN即時多點觸控串流:座標、追蹤 id、壓力、接觸面。會一直跑到被結束為止,期間手機也一直醒著。
wm size螢幕解析度,用來把觸控座標放到畫面上。跑一次就結束。

感測器名稱、Android 型別 id、單位符號、事件名稱都是裝置自己的識別碼,不翻譯——你要拿它們跟自己的 shell 輸出對照。

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

關於這個工具

把 Android 手機用 USB 接上 Chromium 系瀏覽器,這一頁就會讀它的感測器:硬體提供的完整清單、加速度計/陀螺儀/磁力計/氣壓計/環境光的即時值、每個熱區的溫度,還有直接用觸控面板自己送出的事件畫出來的手指軌跡。手機上不會裝任何東西,也不會上傳。這一頁是沒有後端的靜態檔案,讀到的值在你關掉分頁的那一刻就不存在了。

為什麼瀏覽器讀不到環境光感測器

Generic Sensor API 在徵得同意後,會把加速度計、陀螺儀、磁力計交給網頁。唯一不給的就是環境光:AmbientLightSensor 在 Chrome 一直躲在 flag 後面,從來沒有預設開啟,Safari 和 Firefox 更是沒有實作。理由是隱私——亮度值會洩漏你在哪裡,讀得夠快甚至能推測旁邊螢幕上大致是什麼。所以在開放網路上,照度就是拿不到。但走 ADB,它只是系統 dump 裡的一行,因為除錯通道從來就不是同一種邊界:讀它的那個 shell,是你親手打開的、用線接的、拿在手上的那台手機。這個落差,正是這一頁長成這個樣子的原因。

輪詢快照不等於高頻取樣

這裡的即時值來自 dumpsys sensorservice,它會把每顆感測器最近幾十筆事件寫進一個環形緩衝區。這一頁每一到兩秒讀一次那個緩衝區,只把新的事件併進曲線,每一筆都放在硬體給它的時間戳上——所以每秒讀一次也可能畫出十幾個點。做不到的是保證沒有漏掉:跑在 200 Hz 的感測器會在兩次讀取之間把緩衝區寫滿一輪,掉出去的事件就回不來了。所以這些曲線看的是形狀與偏移,不是波形。真要每一筆取樣,就得在手機上跑一個註冊 listener 的 app,shell 權限再高也代替不了。頁面也會標出每次讀取的代價,因為那份 dump 是幾十 KB 的文字,每秒抓一次對手機是實實在在的工作。

為什麼感測器清單沒有量程、解析度和耗電

這張表顯示的是平台印出來的東西,而平台早就不印其中三個最有意思的欄位了。maxRangeresolutionpower 在平台的感測器物件上都有,同一份 dump 的 protobuf 版本也帶著它們,但文字版從 Android 8.1 前後就不再輸出,所以在 Pixel 上這三欄對每顆感測器都是空的。與其把整欄填滿破折號——那讀起來像「這顆加速度計沒有量程」——這一頁乾脆把欄位拿掉,並在下面說明原因。有些廠商會自己補回去:Samsung 的版本常常印出量程、解析度和以毫安培計的耗電,這時候欄位就會自動出現。其餘欄位都是感測器 HAL 列舉的內容:handle、廠商料號名稱、Android 型別、回報方式、最小間隔、最高頻率、FIFO 深度,以及這顆感測器能不能把睡著的手機叫醒。

壓力和接觸面,正是網頁拿不到的東西

觸控面板這一段會從手機的觸控面板串接 getevent,再把它組回一根一根手指。送過來的不只是座標:ABS_MT_TRACKING_ID 是核心配給每個觸點的身分,有了它才能在螢幕上跟著同一根手指走;ABS_MT_PRESSURE 是面板認為你按得多重,單位是面板自己訂的;ABS_MT_TOUCH_MAJOR 是接觸橢圓的寬度,手機就是靠它分辨指尖和手掌。瀏覽器的觸控事件這些都靠不住——force 在幾乎所有環境不是沒實作就是合成值,radiusX 也只是粗估。而且不是每片面板都給:完全不回報壓力的電容式螢幕很常見,這一頁會直接說出來,而不是把每個觸點畫成同樣的深淺,讓你以為它量到了什麼。

這是診斷用的畫面,不是校正工具。它改變不了面板的行為,座標跳一下也不等於觸控面板壞了——螢幕髒了、劣質充電器灌進雜訊、保護殼壓到邊緣,畫出來都是同一副樣子。它擅長的是讓你很快看到原始事實:沒反應的那一塊是不是真的什麼都沒回、幽靈觸控有沒有帶追蹤 id、手機放著不動陀螺儀會不會漂。接下來:Web ADB 首頁有完整的裝置儀表板,電池頁讀得到容量與循環次數,而純瀏覽器的螢幕測試則負責檢查顯示本身。

常見問題

怎麼測手機觸控螢幕有沒有失靈的區域?

在這一頁開始接收觸控,用一根手指從一邊慢慢劃到另一邊,再換個方向劃一次。失靈的區域會表現成一段空白:手指還在動,點卻停住不走,下面的數值表也跟著停。快壞而不是全壞的面板通常相反——座標會抖,或是觸點消失後又用新的追蹤 id 冒出來。測的時候把保護殼拿掉,而且只接資料線、不要接其他充電器:雜訊大的充電器是幽靈觸控最常見的原因,症狀跟面板故障一模一樣。

為什麼我的感測器清單沒有量程、解析度和耗電?

因為 Android 的文字 dump 不印它們。這三個屬性是平台感測器物件的一部分,同一份 dump 的 protobuf 版本也含有,但給人看的那個格式從 Android 8.1 前後就省略了——所以 Pixel 一個都不會出現。這不是 USB 的限制、不是 shell 的限制,也不是這一頁的限制。有些廠商會補回去:Samsung 的韌體常常印出量程、解析度和以毫安培計的耗電,這時欄位就會自動出現。永遠看得到的是型別、回報方式、取樣之間的最小間隔和最高頻率,而通常你想從量程知道的,其實是這幾項。

怎麼看陀螺儀有沒有漂移?

把手機平放在桌上,不要碰它,盯著陀螺儀的曲線看半分鐘。健康的陀螺儀三軸都會非常接近零,只有一點雜訊在旁邊跳;會漂的那顆則停在一個小小的固定偏移上——某一軸長期落在 0.01 到 0.05 rad/s,就是最典型的樣子,也是地圖 app 裡方位會慢慢自轉、VR 視角會往旁邊滑的原因。因為這一頁不會把座標軸硬撐到零,這種小偏移看得見,不會被壓平。前提是手機真的靜止:有人在上面打字的桌子不算靜止。

getevent 是什麼?執行它安全嗎?

`getevent` 是 Android 內建的小工具,會印出 `/dev/input` 的原始輸入事件,也就是框架用來組出觸控和按鍵的同一批事件。它只讀:不能注入點擊、不能改設定、也不會寫任何東西到手機(會注入的是 `sendevent`,這一頁從不執行它)。唯一的代價是持續串流的 `getevent` 會讓一個行程一直活著,也讓手機無法進入閒置。所以按停止、離開這一頁、分頁切到背景、拔掉線,這一頁都會把它結束掉。

不用 ADB 可以讀環境光感測器嗎?

從網頁不行。Chrome 的環境光介面藏在預設關閉的 flag 後面,不開放給一般網站,Safari 和 Firefox 根本沒有實作,所以在網頁上實務的答案就是不行。裝在手機上的 app 反而不需要任何特殊權限就能讀同一顆感測器,手電筒和相機 app 用得很順手就是這個道理——限制在瀏覽器,不在感測器。走 ADB 的這一頁,是從系統自己的感測器 dump 裡讀出照度值,跟平台交給 app 的完全一樣。