Input模块流程(基于AndroidT)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值