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的代碼中去了跟上面的方式一樣。