Android5.0 输入系统(一)————InputManagerService服务及相关对象的创建与启动
2017-10-22 23:26
591 查看
frameworks\base\services\java\com\android\server\SystemServer.java
public static void main(String[] args) { new SystemServer().run(); }frameworks\base\services\java\com\android\server\SystemServer.java
private void run() { ...... try { startBootstrapServices(); startCoreServices(); startOtherServices(); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; } ...... }
frameworks\base\services\java\com\android\server\SystemServer.java
startOtherServices(){ ...... /*Step1: 新建IMS*/ inputManager = new InputManagerService(context); wm = WindowManagerService.main(context, inputManager, mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL, !mFirstBoot, mOnlyCore); ServiceManager.addService(Context.WINDOW_SERVICE, wm); /*Step2: 注册*/ ServiceManager.addService(Context.INPUT_SERVICE, inputManager); mActivityManagerService.setWindowManager(wm); /*Step3: 设置向WMS发起回调的callback对象*/ inputManager.setWindowManagerCallbacks(wm.getInputMonitor()); /*Step4: 正式启动*/ inputManager.start(); ...... }Step1: 新建IMS
frameworks\base\services\core\java\com\android\server\input\InputManagerService.java
public InputManagerService(Context context) { this.mContext = context; this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper()); mUseDevInputEventForAudioJack = context.getResources().getBoolean(R.bool.config_useDevInputEventForAudioJack); Slog.i(TAG, "Initializing input manager, mUseDevInputEventForAudioJack=" + mUseDevInputEventForAudioJack); /*每一个分为Java和Native两部分的对象在创建时都有一个nativeInput函数, mPtr保存native层的InputMangerService*/ mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue()); LocalServices.addService(InputManagerInternal.class, new LocalService()); }
frameworks\base\services\core\jni\com_android_server_input_InputManagerService.cpp
static jlong nativeInit(JNIEnv* env, jclass clazz,
jobject serviceObj, jobject contextObj, jobject messageQueueObj) {
/*java层转换为C++层*/
sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
if (messageQueue == NULL) {
jniThrowRuntimeException(env, "MessageQueue is not initialized.");
return 0;
}
/*NativeInputManager是Native层组件与java层IMS进行通信的桥梁*/
NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
messageQueue->getLooper());
im->incStrong(0);
/*返回NativeInputManager对象的指针给Java层的IMS,IMS将其
*保存在mPtr成员变量中*/
return reinterpret_cast<jlong>(im);
}frameworks\base\services\core\jni\com_android_server_input_InputManagerService.cpp
NativeInputManager::NativeInputManager(jobject contextObj,
jobject serviceObj, const sp<Looper>& looper) :
mLooper(looper), mInteractive(true) {
JNIEnv* env = jniEnv();
......
/*创建一个EventHub*/
sp<EventHub> eventHub = new EventHub();
/*创建一个native层的InputManager*/
mInputManager = new InputManager(eventHub, this, this);
}frameworks\native\services\inputflinger\InputManager.cpp
InputManager::InputManager(
const sp<EventHubInterface>& eventHub,
const sp<InputReaderPolicyInterface>& readerPolicy,
const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
mDispatcher = new InputDispatcher(dispatcherPolicy);
mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
/*初始化,即创建两个线程。*/
initialize();
}frameworks\native\services\inputflinger\InputDispatcher.cpp
InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy) : mPolicy(policy), mPendingEvent(NULL), mAppSwitchSawKeyDown(false), mAppSwitchDueTime(LONG_LONG_MAX), mNextUnblockedEvent(NULL), mDispatchEnabled(false), mDispatchFrozen(false), mInputFilterEnabled(false), mInputTargetWaitCause(INPUT_TARGET_WAIT_CAUSE_NONE) { mLooper = new Looper(false); mKeyRepeatState.lastKeyEntry = NULL; /*配置相关*/ policy->getDispatcherConfiguration(&mConfig); }注意InputDispatcher类和InputReader类的成员变量mPolicy的赋值都为为NativeInputManager对象,请看博文最后的类图。
frameworks\native\services\inputflinger\InputReader.cpp
InputReader::InputReader(const sp<EventHubInterface>& eventHub, const sp<InputReaderPolicyInterface>& policy, const sp<InputListenerInterface>& listener) : mContext(this), mEventHub(eventHub), mPolicy(policy), mGlobalMetaState(0), mGeneration(1), mDisableVirtualKeysTimeout(LLONG_MIN), mNextTimeout(LLONG_MAX), mConfigurationChangesToRefresh(0) { mQueuedListener = new QueuedInputListener(listener); { // acquire lock AutoMutex _l(mLock); refreshConfigurationLocked(0); updateGlobalMetaStateLocked(); } // release lock }注意InputReader对象的构造函数的参数,第一个参数是前面创建的EventHub对象的引用,第二个参数是NativeInputManager对象的引用,第三个参数是InputDispatcher对象的引用。InputRead对象的构造函数创建一个队列监听器mQueuedListener,传入的参数是InputDispatcher对象的引用。
QueuedInputListener::QueuedInputListener(const sp<InputListenerInterface>& innerListener) : mInnerListener(innerListener) { }传入的参数是InputDispatcher对象的引用。
frameworks\native\services\inputflinger\InputManager.cpp
void InputManager::initialize() { mReaderThread = new InputReaderThread(mReader); mDispatcherThread = new InputDispatcherThread(mDispatcher); }Step2: 正式启动
frameworks\base\services\core\java\com\android\server\input\InputManagerService.java
public void start() {
Slog.i(TAG, "Starting input manager");
nativeStart(mPtr);
// Add ourself to the Watchdog monitors.
Watchdog.getInstance().addMonitor(this);
registerPointerSpeedSettingObserver();
registerShowTouchesSettingObserver();
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updatePointerSpeedFromSettings();
updateShowTouchesFromSettings();
}
}, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler);
updatePointerSpeedFromSettings();
updateShowTouchesFromSettings();
}frameworks\base\services\core\jni\com_android_server_input_InputManagerService.cpp
static void nativeStart(JNIEnv* env, jclass clazz, jlong ptr) { NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); status_t result = im->getInputManager()->start(); if (result) { jniThrowRuntimeException(env, "Input manager could not be started."); } }Java层传递过来的参数ptr实际上是Native层创建的NativeInputManager的指针,故可以转换。调用NativeInputManager对象的getInputManager()方法,得到InputManager对象,并调用其start()方法。
frameworks\native\services\inputflinger\InputManager.cpp
status_t InputManager::start() {
status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
return OK;
}
这幅图形象的描述了上面一系列代码所创建的对象
相关文章推荐
- Android 输入系统(一)InputManagerService
- Android 系统服务管家servicemanager启动过程详解
- 如何把apache和nginx 加入到系统服务,用service 命令来控制启动、停止
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- Android窗口管理服务相关对象的创建流程
- 创建一个系统的Service,能通过ServiceManager.getService取得service
- BackupManagerService 定制开发,可以去除该服务影响启动速度
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- Android 系统启动时 PackageManagerService 对应用组件信息表的构建过程
- ActivityManagerService服务线程启动源码分析【转】
- ActivityManagerService服务线程启动源码分析
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- Android应用程序管理服务启动过程浅析(PackageManagerService)
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
- Android系统启动流程分析之启动应用 - ActivityManagerService
- CryENGINE3初探Entities (三)----初试Input输入系统,搭配Lua使用C++创建完整逻辑的entity
- Android下新增JNI过程中启动新增系统服务(addService)遇安全错误问题