Input子系统架构包括内核层与框架层详解

上传人:鲁** 文档编号:454552194 上传时间:2023-01-01 格式:DOC 页数:43 大小:394.64KB
返回 下载 相关 举报
Input子系统架构包括内核层与框架层详解_第1页
第1页 / 共43页
Input子系统架构包括内核层与框架层详解_第2页
第2页 / 共43页
Input子系统架构包括内核层与框架层详解_第3页
第3页 / 共43页
Input子系统架构包括内核层与框架层详解_第4页
第4页 / 共43页
Input子系统架构包括内核层与框架层详解_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《Input子系统架构包括内核层与框架层详解》由会员分享,可在线阅读,更多相关《Input子系统架构包括内核层与框架层详解(43页珍藏版)》请在金锄头文库上搜索。

1、第1章 Android Input子系统架构1.1 Input服务的启动在Android的开机过程中,系统中的服务很多都是由SystemServer中启动的。SystemServer的代码中有这么一句话。Framework/base/services/java/com/android/server/SystemServer.javaSlog.i(TAG, Window Manager); wm = WindowManagerService.main(context, power, factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL,!first

2、Boot);在这里new了一个WindowManagerService的类,我们找到这个类的构造函数。Framework/base/services/java/com/android/server/wm/WindowManagerServer.javaprivate WindowManagerService(Context context, PowerManagerService pm, boolean haveInputMethods, boolean showBootMsgs) mInputManager = new InputManager(context, this);mInputMa

3、nager.start();在WindowManagerService的构造函数中又new了一个InputManager类。InputManager类是整个android的input的上层代码最重要的类,就是通过这个类繁衍出了整个复杂的Android的input子系统。作用就好像Zygote的孕育着Android的各个服务,而InputManager就是负责将整个android的Input子系统。Framework/base/services/java/com/android/server/wm/WindowManagerServer.javapublic InputManager(Conte

4、xt context, WindowManagerService windowManagerService) Looper looper = windowManagerService.mH.getLooper();nativeInit(mContext, mCallbacks, looper.getQueue();在InputManger的构造函数中,调用了nativeInit这个方式,看到native开头或者结尾的函数,一般都是JNI。在InputManager的JNI可以找到这个函数的实现。Framework/base/services/jni/com_android_server_Inp

5、utManager.javastatic JNINativeMethod gInputManagerMethods = nativeInit, (Landroid/content/Context;Lcom/android/server/wm/InputManager$Callbacks;Landroid/os/MessageQueue;)V, (void*) android_server_InputManager_nativeInit ,简单介绍下JNI的代码风格,第一个引号括起来的函数就是我们java代码的函数原型,中间的引号中的就是代表java原型函数的参数。而最后的那个函数就是在对应的函

6、数。一般都是c+代码。Framework/base/services/jni/com_android_server_InputManager.javastatic void android_server_InputManager_nativeInit(JNIEnv* env, jclass clazz, jobject contextObj, jobject callbacksObj, jobject messageQueueObj) gNativeInputManager = new NativeInputManager(contextObj, callbacksObj, looper);在

7、JNI的代码中,又构造了一个重要的NativeInputManager类,这是个C+的本地类。已经不在是之前了那个java的InputManager类。接下来看看NativeInputManager的构造函数。Framework/base/services/jni/com_android_server_InputManager.javaNativeInputManager:NativeInputManager(jobject contextObj, jobject callbacksObj, const sp& looper) :mLooper(looper) sp eventHub = ne

8、w 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/InputM

9、anager.cppInputManager:InputManager( const sp& reader, const sp& dispatcher) : mReader(reader), mDispatcher(dispatcher) initialize();void InputManager:initialize() mReaderThread = new InputReaderThread(mReader); mDispatcherThread = new InputDispatcherThread(mDispatcher);在InputManager中的initialize的初始化

10、了两个线程。一个是inputReaderThread,负责从EventHub中读取事件,另外一个是InputDispatcherThread线程,主要负责分发读取的事件去处理。Framework/base/services/java/com/android/server/wm/WindowManagerServer.javaprivate WindowManagerService(Context context, PowerManagerService pm, boolean haveInputMethods, boolean showBootMsgs) mInputManager.start

11、();在开始的时候,new了一个InputManager,然后在继续调用其start方法。Framework/base/services/java/com/android/server/wm/WindowManagerServer.javapublic void start() Slog.i(TAG, Starting input manager); nativeStart(); registerPointerSpeedSettingObserver(); registerShowTouchesSettingObserver(); updatePointerSpeedFromSettings(

12、); updateShowTouchesFromSettings(); NativeStart()跑到JNI的代码中去了,跟上面的方式一样。Framework/base/services/jni/com_android_server_InputManager.javastatic JNINativeMethod gInputManagerMethods = nativeStart, ()V, (void*) android_server_InputManager_nativeStart ,static void android_server_InputManager_nativeStart(J

13、NIEnv* env, jclass clazz) status_t result = gNativeInputManager-getInputManager()-start();在java代码中用了nativeStart(),然后JNI中又调用了NativeInputManager的start方法。在Native的InputManager中找到start的实现。Framework/base/services/input/InputManager.cppstatus_t InputManager:start() status_t result = mDispatcherThread-run(I

14、nputDispatcher, PRIORITY_URGENT_DISPLAY);result = mReaderThread-run(InputReader, PRIORITY_URGENT_DISPLAY);这个方法就是在前面InputManager中的构造函数initialize中的两个线程运行起来。先看InputDispatcher线程运行的情况,然后就是InputReader线程。Framework/base/services/input/InputDispatcher.cppbool InputDispatcherThread:threadLoop() mDispatcher-dispatchOnce(); return true;InputDispatcher线程调用了Dispatcher的dispatchOnce的方法。同样的InputReader线程也会调用Reader的ReaderOnce的方法。Framework/base/services/input/InputDispatcher.cppvoid InputDispatcher:dispatchOnce() dispatchOnceInnerLocked(&nextWakeupTime); in

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号