IMS分为Java层与Native层两部分,其中启动过程是从Java部分的初始化开始,进而完成Native部分的初始化。
/frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices() {
...
Slog.i(TAG, "Input Manager");
//新建IMS对象
inputManager = new InputManagerService(context);
...
//设置向WMS发起回调Callback对象
inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
//启动IMS
inputManager.start();
...
}
IMS和WMS、AMS一样都是重要的系统服务,IMS在SystemServer.startOtherServices()中进行初始化,并调用 start 方法启动。
/frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
public InputManagerService(Context context) {
...
//每一个分为Java和Native两部分的对象在创建时都会有一个nativeInput函数
mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
...
}
在InputManagerService 中,直接调用 nativeInit 在 native 中进行初始化。
/frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp
static jlong nativeInit(JNIEnv* env, jclass /* clazz */,
jobject serviceObj, jobject contextObj, jobject messageQueueObj) {
sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
...
//新建一个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);
}
NativeInputManager::NativeInputManager(jobject contextObj,
jobject serviceObj, const sp<Looper>& looper) :
mLooper(looper), mInteractive(true) {
...
//NativeInputManager创建了EventHub
sp<EventHub> eventHub = new EventHub();
//继续创建Native层的InputManager
mInputManager = new InputManager(eventHub, this, this);
}
nativeInit()函数创建了一个类型为NativeInputManager的对象,它是Java层和Native层互相通信的桥梁。在NativeInputManager构造函数中,有两个重要的角色,分别是EventHub和InputManager。
/frameworks/native/services/inputflinger/InputManager.cpp
InputManager::InputManager(
const sp<EventHubInterface>& eventHub,
const sp<InputReaderPolicyInterface>& readerPolicy,
const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
//创建InputDispatcher
mDispatcher = new InputDispatcher(dispatcherPolicy);
//创建InputReader
mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
//初始化
initialize();
}
void InputManager::initialize() {
//创建供InputReader运行的线程InputReaderThread
mReaderThread = new InputReaderThread(mReader);
//创建供InputDispatcher运行的线程InputDispatcherThread
mDispatcherThread = new InputDispatcherThread(mDispatcher);
}
至此,IMS的创建就完成了,在这个过程中,输入系统的重要参与者均完成创建。接下来继续分析《Android6.0输入系统之EventHub源码分析》。