Android 輸入系統架構 筆記1

1. 首先看下服務的啓動:

    Android系統啓動的時候,會啓動很多服務,一般都是在SystemServer中啓動的,代碼如下:

   路徑 Framework/base/services/java/com/android/server/SystemServer.java

                         wm = WindowManagerService.main(context, power,factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL,!firstBoot);

  這裏創建了一個WindowManagerService的類,我們來看看這個類的構造函數:

  Framework/base/services/java/com/android/server/wm/WindowManagerServer.java

   private WindowManagerService(Context context, PowerManagerService pm,boolean haveInputMethods, boolean showBootMsgs) {
    ……
    mInputManager = new InputManager(context, this);
    ……
    mInputManager.start();
    ……
    }
 在WindowManagerService的構造函數中又new了一個InputManager類。InputManager類是整個android的input的上層代碼最重要的類就是通過這個類繁衍出了整個複雜的Android的input子系統。作用就好像Zygote的孕育着Android的各個服務而InputManager就是負責將整個android的Input子系統。

Framework/base/services/java/com/android/server/wm/WindowManagerServer.java
 
public InputManager(Context context, WindowManagerService windowManagerService) { 
……
Looper loo
per = windowManagerService.mH.getLooper();
nativeInit(mContext, mCallbacks, looper.getQueue());
……
}

在InputManger的構造函數中調用了nativeInit這個方式看到native開頭或者結尾的函數一般都是JNI。在InputManager的JNI可以找到這個函數的實現。

 Framework/base/services/jni/com_android_server_InputManager.java
 
static JNINativeMethod gInputManagerMethods[] = {
{ "nativeInit", "(Landroid/content/Context;"   "Lcom/android/server/wm/InputManager$Callbacks;Landroid/os/MessageQueue;)V",
                                                              (void*) android_server_InputManager_nativeInit },
 

Framework/base/services/jni/com_android_server_InputManager.java
 
static void android_server_InputManager_nativeInit(JNIEnv* env, jclass clazz,        
            jobject contextObj, jobject callbacksObj, jobject messageQueueObj) {
……
            gNativeInputManager = new NativeInputManager(contextObj, callbacksObj, looper);
            ……
           }
 
在JNI的代碼中又構造了一個重要的NativeInputManager類這是個C++的本地類。已經不在是之前了那個java的InputManager類。接下來看看NativeInputManager的構造函數。 

Framework/base/services/jni/com_android_server_InputManager.java
 
NativeInputManager::NativeInputManager(jobject contextObj,  
jobject callbacksObj, const sp<Looper>& looper) :mLooper(looper) {
……
sp<EventHub> eventHub = new EventHub();
mInputManager = new InputManager(eventHub, this, this);
……
}
 
這裏new了兩個類EventHub和InputManager類。EventHub就是Input子系統的HAL層了負責將linux的所有的input設備打開並負責輪詢讀取他們的上報的數據後面會詳細介紹這裏先簡單介紹一下。InputManager類主要是負責管理input Event有InputReader從EventHub讀取事件然後交給InputDispatcher進行分發。


Framework/base/services/input/InputManager.cpp
 
InputManager::InputManager(
const sp<InputReaderInterface>& reader,        
const sp<InputDispatcherInterface>& dispatcher) :
mReader(reader),
mDispatcher(dispatcher) {
initialize();
}
 
void InputManager::initialize() {
mReaderThread = new InputReaderThread(mReader);
mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

在InputManager中的initialize的初始化了兩個線程。一個是inputReaderThread負責從EventHub中讀取事件另外一個是InputDispatcherThread線程主要負責分發讀取的事件去處理。

Framework/base/services/java/com/android/server/wm/WindowManagerServer.java
 
private WindowManagerService(Context context, PowerManagerService pm, boolean haveInputMethods, boolean showBootMsgs){
 
mInputManager.start();
……
}

在開始的時候new了一個InputManager然後在繼續調用其start方法。 
Framework/base/services/java/com/android/server/wm/WindowManagerServer.java
 
public void start() {     
Slog.i(TAG, "Starting input manager");
nativeStart();
registerPointerSpeedSettingObserver();       
registerShowTouchesSettingO
bserver();
updatePointerSpeedFromSettings();
updateShowTouchesFromSettings();
}   
 
NativeStart()跑到JNI的代碼中去了跟上面的方式一樣。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章