天天看點

android5.1之vibration學習總結前言流程

前言

   前幾天有一個點選輸入法按鍵偶現不震動的bug。是以看了學習了Vibration的流程,大概了解其實作。最後發現framework的值都已經寫進去了,是以就開開心心的轉給你BSP的同僚了。

流程

流程圖

以下的流程圖是AOSP輸入法按鍵的流程

android5.1之vibration學習總結前言流程

代碼介紹

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”節點中。