天天看点

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