前言
前幾天有一個點選輸入法按鍵偶現不震動的bug。是以看了學習了Vibration的流程,大概了解其實作。最後發現framework的值都已經寫進去了,是以就開開心心的轉給你BSP的同僚了。
流程
流程圖
以下的流程圖是AOSP輸入法按鍵的流程
代碼介紹
APP層
mVibrator= (Vibrator) getSystemService(VIBRATOR_SERVICE);
擷取服務後,調用vibrate()方法,實作震動。
famework層
framework層實作在:
frameworks/base/services/java/com/android/server/VibratorService.java
frameworks/base/core/java/android/os/IVibratorService.aidl
frameworks/base/core/java/android/os/Vibrator.java
frameworks/base/core/java/android/os/SystemVibrator.java
VibratorService.java
有SystemService拉起的服務。實作IVibratorService.aidl的接口,進而實作VibratorService;它的函數接口,是通過調用JNI層對應的馬達控制函數來實作的。
Vibrator.java
是VibratorService開放給應用層的調用類。Vibrator是抽象類。它便于我們支援不同類型的馬達。
SystemVibrator.java
它是Vibrator.java的子類,實作了vibration的服務接口。
在構造函數中,通過 IVibratorService.Stub.asInterface(ServiceManager.getService("vibrator")) 擷取馬達服務,實際上擷取的是VibratorService對象。
SystemVibrator的接口都是調用VibratorService接口實作的。
JNI及HAL層
代碼路徑如下:
frameworks/base/services/jni/com_android_server_VibratorService.cpp
hardware/libhardware_legacy/vibrator/vibrator.c
通過vibrator中sendit函數将對vibrator的控制寫進“/sys/class/timed_output/vibrator/enable”節點中。