input各个模块初始化
牵扯到的模块:
InputReader:从硬件中获取输入,转换成为Event事件,并传递给InputDispatcher
InputDispatcher:负责讲Events分发给合适的窗口,并监控ANR
InputManagerService:负责InputReader 和InputDispatcher的创建,并提供policy用于events的预处理
WindowManagerService:管理InputManager和View(Window)以及同AMS之间的通信
View 和Activity:接收events并进行处理
AMS:ANR处理
相关进程及线程:
system_server 进程:InputReaderThread InputDispatcherThread
应用进程:UIThread
1.启动IMS WMS
Q:\workspace\SPRO_T\SPRDROID13_MAIN_W22.xx.x\idh.code\frameworks\base\services\java\com\android\server\SystemServer.java
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
...
t.traceBegin("StartInputManagerService");
inputManager = new InputManagerService(context);
t.traceEnd();
...
// WMS needs sensor service ready
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE);
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
/*Unisoc make PhoneWindowManager */
UniSystemServiceFactory.getInstance().makePhoneWindowManager(),
mActivityManagerService.mActivityTaskManager);
ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
...
t.traceBegin("StartInputManager");
inputManager.setWindowManagerCallbacks(wm.getInputManagerCallback());
inputManager.start();
t.traceEnd();
...
t.traceBegin("MakeDisplayReady");
try {
wm.displayReady();
} catch (Throwable e) {
reportWtf("making display ready", e);
}
t.traceEnd();
}
2.IMS的构造方法
获取Looper
调用nativeIMS
Q:\workspace\SPRO_T\SPRDROID13_MAIN_W22.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\input\InputManagerService.java
public InputManagerService(Context context) {
this(new Injector(context, DisplayThread.get().getLooper()));
//Unisoc add debug listener
UniSystemServiceFactory.getInstance().addDebugListenerForIms();
}
@VisibleForTesting
InputManagerService(Injector injector) {
mContext = injector.getContext();
mHandler = new InputManagerHandler(injector.getLooper());
mNative = injector.getNativeService(this);
...
injector.registerLocalService(new LocalService());
}
injector是静态内部类
NativeInputManagerService getNativeService(InputManagerService service) {
return new NativeInputManagerService.NativeImpl(service, mContext, mLooper.getQueue());
}
3.nativeIMS 创建InputManager,并获取IMS的Looper
Q:\workspace\SPRO_S\SPRDROID12_TRUNK_22B_W2x.xx.x\idh.code\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();
...
mInteractive = true;
InputManager* im = new InputManager(this, this);
mInputManager = im;
defaultServiceManager()->addService(String16("inputflinger"), im);
}
4.InputManager 创建InputReader 和InputDispatcher
Q:\workspace\SPRO_T\SPRDROID13_MAIN_W22.xx.x\idh.code\frameworks\native\services\inputflinger\InputManager.cpp
InputManager::InputManager(
const sp<InputReaderPolicyInterface>& readerPolicy,
const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
mDispatcher = createInputDispatcher(dispatcherPolicy);
mClassifier = std::make_unique<InputClassifier>(*mDispatcher);
mBlocker = std::make_unique<UnwantedInteractionBlocker>(*mClassifier);
mReader = createInputReader(readerPolicy, *mBlocker);
}
Q:\workspace\SPRO_T\SPRDROID13_MAIN_W22.xx.x\idh.code\frameworks\native\services\inputflinger\dispatcher\InputDispatcher.cpp
InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy)
: InputDispatcher(policy, STALE_EVENT_TIMEOUT) {}
InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy,
std::chrono::nanoseconds staleEventTimeout)
...
mLooper = new Looper(false);
mReporter = createInputReporter();
mWindowInfoListener = new DispatcherWindowListener(*this);
SurfaceComposerClient::getDefault()->addWindowInfosListener(mWindowInfoListener);
...
}
Q:\workspace\SPRO_T\SPRDROID13_MAIN_W22.xx.x\idh.code\frameworks\native\services\inputflinger\reader\InputReader.cpp
到此构造方法走完 下一步start方法
5.start方法流程
最终启动InputDispatcherThread 和 InputReaderThread
Q:\workspace\SPRO_T\SPRDROID13_MAIN_W22.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\input\InputManagerService.java
//调用native的start方法
//将IMS添加到watchdog监控中
public void start() {
Slog.i(TAG, "Starting input manager");
mNative.start();
// Add ourselves to the Watchdog monitors.
Watchdog.getInstance().addMonitor(this);
...
}
Q:\workspace\SPRO_S\SPRDROID12_TRUNK_22B_W2x.xx.x\idh.code\frameworks\base\services\core\jni\com_android_server_input_InputManagerService.cpp
//调用InputManager的start方法
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.");
}
}
Q:\workspace\SPRO_T\SPRDROID13_MAIN_W22.xx.x\idh.code\frameworks\native\services\inputflinger\InputManager.cpp
//调用InputDispatcher 和 InputReader的start方法
status_t InputManager::start() {
status_t result = mDispatcher->start();
if (result) {
ALOGE("Could not start InputDispatcher thread due to error %d.", result);
return result;
}
result = mReader->start();
if (result) {
ALOGE("Could not start InputReader due to error %d.", result);
mDispatcher->stop();
return result;
}
return OK;
}
Q:\workspace\SPRO_T\SPRDROID13_MAIN_W22.xx.x\idh.code\frameworks\native\services\inputflinger\dispatcher\InputDispatcher.cpp
status_t InputDispatcher::start() {
if (mThread) {
return ALREADY_EXISTS;
}
mThread = std::make_unique<InputThread>(
"InputDispatcher", [this]() { dispatchOnce(); }, [this]() { mLooper->wake(); });
return OK;
}
Q:\workspace\SPRO_T\SPRDROID13_MAIN_W22.xx.x\idh.code\frameworks\native\services\inputflinger\reader\InputReader.cpp
status_t InputReader::start() {
if (mThread) {
return ALREADY_EXISTS;
}
mThread = std::make_unique<InputThread>(
"InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); });
return OK;
}
//启动InputDispatcherThread 和 InputReaderThread
adb shell getevent/adb shell sendevent
adb shell sendevent /dev/input/event0 0001 0114 00000001
补充:设备的device id是会变化的,因此需要查看开机log的device id
Line 3496: 09-03 13:34:37.485755 909 1043 I EventHub: New device: id=1, fd=166, path='/dev/input/event1', name='fts_ts', classes=0x15, configuration='', keyLayout='/system/usr/keylayout/Generic.kl', keyCharacterMap='/system/usr/keychars/Generic.kcm', builtinKeyboard=false,
Line 3499: 09-03 13:34:37.486213 909 1043 I EventHub: New device: id=2, fd=167, path='/dev/input/event2', name='ft