Android Input (1) -- InputManagerService启动

Link:

Android Input (1) -- InputManagerService启动

Android Input (2) -- inputReader

Android Input (3) -- inputDispatcher

Android Input (4) -- inputDispatcher到ViewRootImpl

Android Input (5) -- ViewRootImpl 的事件分发(Activity ViewGroup View )

Android Input (6) -- PhoneWindowManager中Power,BACK等按键处理流程

Android Input (7) -- 模块的锁检测

Android Input (8) -- ANR input event原理


目录

启动内容:

涉及类:

启动流程图

1.1 SystemServer startOtherServices

2.1 InputManagerService初始化

2.1.1 android_server.so nativeInit

2.1.2 eventHub初始化介绍

2.1.3 InputManager构建InputDispatcher InputReader

2.2  inputManager.start()

2.2.1 nativeStart

2.2.2 InputDispatcher InputReader线程threadLoop


 

启动内容:

0.startOtherServices启动InputManagerService

1.inputManagerService启动初始化

2.eventhub初始化

3.InputDispatcherThread初始化和启动

4.inputReaderThread启动

 

涉及类:

frameworks/native/services/inputflinger/
  - InputDispatcher.cpp
  - InputReader.cpp
  - InputManager.cpp
  - EventHub.cpp
  - InputListener.cpp

frameworks/native/libs/input/
  - InputTransport.cpp
  - Input.cpp
  - InputDevice.cpp
  - Keyboard.cpp
  - KeyCharacterMap.cpp
  - IInputFlinger.cpp

frameworks/base/services/core/
  - java/com/android/server/input/InputManagerService.java
  - jni/com_android_server_input_InputManagerService.cpp

启动流程图

 

Android Input (1) -- InputManagerService启动_第1张图片

 

 

 

1.1 SystemServer startOtherServices

 

SystemServer创建InputManagerService,并且调用start启动inputdispatcher和inputReader线程

@SystemServer.java
private void startOtherServices() {
    traceBeginAndSlog("StartInputManagerService");
    inputManager = new InputManagerService(context);   //初始化InputManagerService

    wm = WindowManagerService.main(context, inputManager,
            mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
            !mFirstBoot, mOnlyCore, new PhoneWindowManager());
    ServiceManager.addService(Context.INPUT_SERVICE, inputManager);  //可以通过IInputManager来binder调用InputManagerService方法

    traceBeginAndSlog("StartInputManager");
    inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
    inputManager.start();  //start inputmanager
}

 

2.1 InputManagerService初始化

@frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
 public InputManagerService(Context context) {
     this.mContext = context;
     // 运行在线程"android.display"
     this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper());
     mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
 }

 public void setWindowManagerCallbacks(WindowManagerCallbacks callbacks) {
     mWindowManagerCallbacks = callbacks;
 }
 
//native方法都要加native开头
private static native long nativeInit(InputManagerService service,
        Context context, MessageQueue messageQueue);

2.1.1 android_server.so nativeInit

//搜索其他native方法就可以确认是那个native文件,这里应该是SystemServer加载的android_server.so,因为都是Systemserver进程,就不需要再加载

@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 = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);   //java传入的messageQueue, mHandler.getLooper().getQueue()

    NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
            messageQueue->getLooper());
    im->incStrong(0);  //智能指针增加引用
    return reinterpret_cast(im);   //类型转换为jlong返回
}


NativeInputManager::NativeInputManager(jobject contextObj,
        jobject serviceObj, const sp& looper) :
        mLooper(looper), mInteractive(true) {
    JNIEnv* env = jniEnv();
    mContextObj = env->NewGlobalRef(contextObj);
    mServiceObj = env->NewGlobalRef(serviceObj);
...
    sp eventHub = new EventHub();   //create EventHub
    mInputManager = new InputManager(eventHub, this, this);
}


2.1.2 eventHub初始化介绍

@frameworks/native/services/inputflinger/EventHub.cpp
EventHub::EventHub(void) :
        mBuiltInKeyboardId(NO_BUILT_IN_KEYBOARD), mNextDeviceId(1), mControllerNumbers(),
        mOpeningDevices(0), mClosingDevices(0),
        mNeedToSendFinishedDeviceScan(false),
        mNeedToReopenDevices(false), mNeedToScanDevices(true),
        mPendingEventCount(0), mPendingEventIndex(0), mPendingINotify(false) {
    acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_ID);

    mEpollFd = epoll_create(EPOLL_SIZE_HINT);   //创建epoll

    mINotifyFd = inotify_init();   //int mINotifyFd;
    //man inotify_add_watch: add a watch to an initialized inotify instance监听/dev/input目录,create和删除事件,然后通知mINotifyFd
    int result = inotify_add_watch(mINotifyFd, DEVICE_PATH, IN_DELETE | IN_CREATE);   //char *DEVICE_PATH = "/dev/input";

    struct epoll_event eventItem;
    memset(&eventItem, 0, sizeof(eventItem));
    eventItem.events = EPOLLIN;
    eventItem.data.u32 = EPOLL_ID_INOTIFY;
    result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mINotifyFd, &eventItem);

    int wakeFds[2];
    result = pipe(wakeFds);

    mWakeReadPipeFd = wakeFds[0];
    mWakeWritePipeFd = wakeFds[1];

    result = fcntl(mWakeReadPipeFd, F_SETFL, O_NONBLOCK);
    result = fcntl(mWakeWritePipeFd, F_SETFL, O_NONBLOCK);
    eventItem.data.u32 = EPOLL_ID_WAKE;
    result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, &eventItem);

    int major, minor;
    getLinuxRelease(&major, &minor);
    // EPOLLWAKEUP was introduced in kernel 3.5
    mUsingEpollWakeup = major > 3 || (major == 3 && minor >= 5);
}


2.1.3 InputManager构建InputDispatcher InputReader

InputManager初始化inputDispatcher和reader,然后调用initialize创建两个线程

@frameworks/native/services/inputflinger/InputManager.cpp
InputManager::InputManager(
        const sp& eventHub,
        const sp& readerPolicy,
        const sp& dispatcherPolicy) {
    mDispatcher = new InputDispatcher(dispatcherPolicy);   //初始化InputDispatcher
    mReader = new InputReader(eventHub, readerPolicy, mDispatcher);   //初始化InputReader
    initialize();
}

//初始化 InputReaderThread  InputDispatcherThread两个线程
void InputManager::initialize() {
    mReaderThread = new InputReaderThread(mReader);
    mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

InputReaderThread::InputReaderThread(const sp& reader) :
        Thread(/*canCallJava*/ true), mReader(reader) {
}


2.2  inputManager.start()

@InputManagerService.java
public void start() {
    Slog.i(TAG, "Starting input manager");
    nativeStart(mPtr);

    // Add ourself to the Watchdog monitors.
    Watchdog.getInstance().addMonitor(this);
    ...
}

2.2.1 nativeStart

nativestart把jlong类型转为NativeInputManager×,调用InputManager的start(0方法来运行线程

@services/core/jni/com_android_server_input_InputManagerService.cpp
static void nativeStart(JNIEnv* env, jclass /* clazz */, jlong ptr) {
    NativeInputManager* im = reinterpret_cast(ptr);
    status_t result = im->getInputManager()->start();
    ...
}

inline sp getInputManager() const { return mInputManager; }    //mInputManager = new InputManager(eventHub, this, this);

//启动运行 InputDispatcher(InputDispatcherThread)  InputReader(InputReaderThread)线程
@frameworks/native/services/inputflinger/InputManager.cpp
status_t InputManager::start() {
    status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
    if (result) {
        ALOGE("Could not start InputDispatcher thread due to error %d.", result);
        return result;
    }

    result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
    ...
    return OK;
}

2.2.2 InputDispatcher InputReader线程threadLoop

//return true就会一直调用threadLoop方法,这里表示线程会一直调用dispatchOnce和loopOnce

 

@frameworks/native/services/inputflinger/InputDispatcher.cpp
bool InputDispatcherThread::threadLoop() {
    mDispatcher->dispatchOnce();
    return true;
}

@frameworks/native/services/inputflinger/InputReader.cpp
bool InputReaderThread::threadLoop() {
    mReader->loopOnce();
    return true;
}

 

 

你可能感兴趣的:(Input)