Double Tap to Wake (Nexus 6P)

前言

把服役 3 年的蝴蝶機汰換成了 Google 的 Nexus 6P,依照阿宅工程師的一定要先 Root 在加裝 Xposed framework 的阿!一開始一切都很美好,直到我發現當把手機放在桌上想看時間,卻需要按下 Power 鍵來打開螢幕,而不是時下最流行的雙擊螢幕,心中的不滿不斷地增加…

準備工作

在 XDA 這個開發者的大本營上找到了如何透過命令的方式來開起雙擊螢幕的功能,自己也寫了一個簡單的 APP 來達成將下面的指令自動寫入系統。

1
echo 1 > /sys/devices/soc.0/f9924000.i2c/i2c-2/2-0070/input/input0/wake_gesture

那個 But

如同在其他文章都會遇到的情況,就是那個 But;APP 再重開機之後無法自動開啟這個功能,即使加入了 BOOT_COMPLETED 的 Receiver 也一樣,本來想著是可能是剛開機系統還沒有完全 Ready,需要多寫入幾次,但發現這樣是不行的…

測試方法:
安裝 APP 開啟雙擊功能,重開機後,不要按 Power 鍵或是掃描指紋,就這樣放著等幾分鐘,
你會發現雙擊功能還是沒辦法用,必須解鎖後重新執行 APP 才可以。

原因

經過調查,Double to Wake 的 Sensor 是屬於 Non-wake-up sensors,根據 Google Android 說明 指出:

Non-wake-up sensors are sensors that do not prevent the SoC from going 
into suspend mode and do not wake the SoC up to report data. 
In particular, the drivers are not allowed to hold wake-locks.

簡單來說,當 SoC 處在 Suspend mode 之時,SoC 不會處理對應的事件(Event)。重開機之後的 Nexus 6P,預設的電源狀態是 Suspend mode,對應的 Sensor 也不會啟動,導致重開機後 APP 執行前述命令後,該設定仍然無法寫入到 Sensor,自然的 Double Tap to Wake 的功能就自動失效了。

解決方案

  1. 重新編譯 Kernel,重新定義 Sensor type
  2. Boot completed 後,喚醒 APP 後讓 SoC 先進入 “On mode” 再執行前述命令

最後採用了方案 2:簡單直接,同樣的這也有兩種方案可以選擇

  1. APP 使用 WakeUp lock 來喚醒 SoC
  2. APP 模擬 Power Button 動作

當然方案 2,還是我的首選 :p

結論

廢話不多說 APP 與 Source Code 在這裡

參考文件