Input子系统(一)启动篇
代码路径
基于AndroidS(12.0)代码
system/core/libutils/Threads.cppframeworks/base/services- java/com/android/server/SystemServer.java- core- java/com/android/server/input/InputManagerService.java- jni/com_android_server_input_InputManagerService.cppframeworks/native/services/inputflinger/- InputManager.cpp- InputThread.cpp- reader- InputReader.cpp- dispatcher- InputDispatcher.cpp
启动流程图
从流程图可以看出,启动过程的有两条主线:create、start,下面分别针对这两条主线进行源码分析
create主线
create主线主要是创建 Input 系统相关对象,从 Java 层一直到 Native 层。
SystemServer启动
//=====> SystemServer.javaprivate void startOtherServices(@NonNull TimingsTraceAndSlog t) {inputManager = new InputManagerService(context);... ...//将InputManagerService注册到ServiceManager,其名字为 inputServiceManager.addService(Context.INPUT_SERVICE, inputManager,/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);... .. inputManager.start();
}
创建InputManagerService
//=====> InputManagerService.javapublic InputManagerService(Context context) {// 运行在线程"android.display"this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper());//初始化 NativeInputManager,并返回其句柄mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
}
Jni.nativeInit
//=====> com_android_server_input_InputManagerService.cpp//JNI原型 -> long nativeInit(InputManagerService, Context, MessageQueue);
static jlong nativeInit(JNIEnv* env, jclass /* clazz */,jobject serviceObj, jobject contextObj, jobject messageQueueObj) {//android_os_MessageQueue.h中的方法,获取 MessageQueue 中保存的 NativeMessageQueue 对象sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);//初始化 NativeInputManagerNativeInputManager* im = new NativeInputManager(contextObj, serviceObj,messageQueue->getLooper());im->incStrong(0);return reinterpret_cast<jlong>(im);
}
创建 NativeInputManager
//=====> com_android_server_input_InputManagerService.cppNativeInputManager::NativeInputManager(jobject contextObj,jobject serviceObj, const sp<Looper>& looper) :mLooper(looper), mInteractive(true) {InputManager* im = new InputManager(this, this);mInputManager = im;//注册 InputManager 到 SystemServer,服务名为 inputflingerdefaultServiceManager()->addService(String16("inputflinger"), im);
}
创建 InputManager
//=====> InputManager.cpp//这里传入的readerPolicy、dispatcherPolicy 都是 NativeInputManager
InputManager::InputManager(const sp<InputReaderPolicyInterface>& readerPolicy,const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {//创建 InputDispatchermDispatcher = createInputDispatcher(dispatcherPolicy);//对事件分类,事件分发前必须经过的阶段mClassifier = new InputClassifier(mDispatcher);//创建 InputReadermReader = createInputReader(readerPolicy, mClassifier);
}
创建 InputDispatcher
//=====> InputDispatcher.cppInputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy): mPolicy(policy),... ...mCompatService(getCompatService()) {mLooper = new Looper(false);mReporter = createInputReporter();mKeyRepeatState.lastKeyEntry = nullptr;policy->getDispatcherConfiguration(&mConfig);
}
创建 InputReader
//=====> InputReader.cppInputReader::InputReader(std::shared_ptr<EventHubInterface> eventHub,const sp<InputReaderPolicyInterface>& policy,const sp<InputListenerInterface>& listener): mContext(this),mEventHub(eventHub),mPolicy(policy),... ...mConfigurationChangesToRefresh(0) {mQueuedListener = new QueuedInputListener(listener);.... ...
}
start主线
start主线会启动两条线程 InputReader(读取事件)、InputDispatcher(分发事件),并且这两条线程会一直循环执行,不会终止。
Jni.nativeStart
//=====> com_android_server_input_InputManagerService.cpp//Jni原型 -> void nativeStart(long ptr),其 ptr 参数为 NativeInputManager 的句柄
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.");}
}
InputManager.start
在创建 InputManager 的时候创建了 mDispatcher、mReader
//=====> InputManager.cppstatus_t InputManager::start() {//开启 InputDispatcher Looperstatus_t result = mDispatcher->start();if (result) {return result;}//开启 InputReader 的 Looperresult = mReader->start();if (result) {mDispatcher->stop();return result;}return OK;
}
InputReader.start
创建一个InputThread线程,线程名为 InputReader
status_t InputReader::start() {if (mThread) {return ALREADY_EXISTS;}mThread = std::make_unique<InputThread>("InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); });return OK;
}
InputThread 会创建 InputThreadImpl ,InputThreadImpl 继承自 libutils 中的 Thread,其会一直运行threadLoop 函数,直到该函数返回 false 则会停止循环。结合上面的代码可以知道 InputReader 线程一直运行的是 loopOnce 方法,mEventHub->wake是在InputThread析构时候调用。
//=====> InputThread.cppclass InputThreadImpl : public Thread {
public:explicit InputThreadImpl(std::function<void()> loop): Thread(/* canCallJava */ true), mThreadLoop(loop) {}
private:std::function<void()> mThreadLoop;//返回true则会一直运行bool threadLoop() override {mThreadLoop();return true;}
};InputThread::InputThread(std::string name, std::function<void()> loop, std::function<void()> wake): mName(name), mThreadWake(wake) {mThread = new InputThreadImpl(loop);//开始运行ThreadmThread->run(mName.c_str(), ANDROID_PRIORITY_URGENT_DISPLAY);
}
InputDispatcher.start
同样 InputDispatcher 也会启动一个线程,线程名为 InputDispatcher,然后一直运行 dispatchOnce 方法。
//=====> InputDispatcher.cppstatus_t InputDispatcher::start() {if (mThread) {return ALREADY_EXISTS;}mThread = std::make_unique<InputThread>("InputDispatcher", [this]() { dispatchOnce(); }, [this]() { mLooper->wake(); });return OK;
}
参考
- Input系统 - 启动篇