Android输入系统(二)——IMS启动过程(基于Android 13)

1 IMS启动过程

IMS的启动还是从SystemServer的startOtherServices方法中启动的。
frameworks/native/services/inputflinger/reader/InputReader.cpp

private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
   
   
	...
	t.traceBegin("StartInputManager");
	inputManager.setWindowManagerCallbacks(wm.getInputManagerCallback());
	inputManager.start();
	t.traceEnd();
	...
}

这里调用InputManagerService的start方法。
frameworks/native/services/inputflinger/reader/InputReader.cpp

public void start() {
   
   
    Slog.i(TAG, "Starting input manager");
    mNative.start(); //1

    // Add ourselves to the Watchdog monitors.
    Watchdog.getInstance().addMonitor(this); //2

    registerPointerSpeedSettingObserver();
    registerShowTouchesSettingObserver();
    registerAccessibilityLargePointerSettingObserver();
    registerLongPressTimeoutObserver();
    registerMaximumObscuringOpacityForTouchSettingObserver();
    registerBlockUntrustedTouchesModeSettingObserver();

    mContext.registerReceiver(new BroadcastReceiver() {
   
   
        @Override
        public void onReceive(Context context, Intent intent) {
   
   
            updatePointerSpeedFromSettings();
            updateShowTouchesFromSettings();
            updateAccessibilityLargePointerFromSettings();
            updateDeepPressStatusFromSettings("user switched");
        }
    }, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler);

    updatePointerSpeedFromSettings();
    updateShowTouchesFromSettings();
    updateAccessibilityLargePointerFromSettings();
    updateDeepPressStatusFromSettings("just booted");
    updateMaximumObscuringOpacityForTouchFromSettings();
    updateBlockUntrustedTouchesModeFromSettings();
}

注释1处调用native的start方法,注释2处将自身添加到watchdog中进行监测。
frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp

static void nativeStart(JNIEnv* env, jobject nativeImplObj) {
   
   
    NativeInputManager* im = getNativeInputManager(env, nativeImplObj);

    status_t result = im->getInputManager()->start();
    if (result) {
   
   
        jniThrowRuntimeException(env, "Input manager could not be started.");
    }
}

这里获取native中的InputManager对象,并调用其中的start方法。
frameworks/native/services/inputflinger/InputManager.cpp

status_t InputManager::start() {
   
   
    status_t result = mDispatcher->start(); //1
    if (result) {
   
   
        ALOGE("Could not start InputDispatcher thread due to error %d.", result);
        return result;
    }

    result = mReader->start(); //2
    if (result) {
   
   
        ALOGE("Could not start InputReader due to error %d.", result);

        mDispatcher->stop();
        return result;
    }

    return OK;
}

注释1处调用了InputDispatcher的start函数,注释2处调用了InputReader的start函数。

2 InputDispatcher的启动

由上面的InputManager的start方法中调用了InputDispatcher的start函数。
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
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值