Android輸入系統(tǒng)采用生產(chǎn)者_(dá)消費(fèi)者模型,生產(chǎn)者(觸屏)負(fù)責(zé)制造事件,消費(fèi)者(視圖)負(fù)責(zé)事件派發(fā)。
InputManagerService服務(wù)
Android系統(tǒng)服務(wù)運(yùn)行于system_server進(jìn)程,核心服務(wù)如Ams、Wms,Pms等,其中包括Ims,SystemServer負(fù)責(zé)啟動系統(tǒng)服務(wù)。
SystemServer#startOtherServices方法。
private void startOtherServices() {
...
//創(chuàng)建Ims對象
InputManagerService inputManager = null;
inputManager = new InputManagerService(context);
//啟動
inputManager.start();
final InputManagerService inputManagerF = inputManager;
if (inputManagerF != null) inputManagerF.systemRunning();
...
}
輸入管理服務(wù)架構(gòu)如下圖所示。創(chuàng)建與初始化
由服務(wù)架構(gòu)圖可知,Java層有一個InputManagerService對象,在構(gòu)造方法中,創(chuàng)建底層NativeInputManager對象。
InputManagerService#構(gòu)造方法。
public InputManagerService(Context context) {
this.mContext = context;
this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper());
//DisplayThread線程消息隊列
mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
....
}
JNI#nativeInit方法。
static jlong nativeInit(JNIEnv* env, jclass /* clazz */,jobject serviceObj,
jobject contextObj, jobject messageQueueObj) {
sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env,
messageQueueObj);
//消息隊列為空異常返回0
...
NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
messageQueue->getLooper());
im->incStrong(0);
return reinterpret_cast<jlong>(im);
}
創(chuàng)建底層NativeInputManager,封裝真正服務(wù)InputManager,返回mPtr指針。MessageQueue是DisplayThread線程消息隊列。
NativeInputManager#構(gòu)造方法。
NativeInputManager::NativeInputManager(jobject contextObj,
jobject serviceObj, const sp<Looper>& looper) :
mLooper(looper), mInteractive(true) {
JNIEnv* env = jniEnv();
mContextObj = env->NewGlobalRef(contextObj);
mServiceObj = env->NewGlobalRef(serviceObj);
...
mInteractive = true;
sp<EventHub> eventHub = new EventHub();
mInputManager = new InputManager(eventHub, this, this);
}
創(chuàng)建EventHub與InputManager,mContextObj與mServiceObj分別是上層Context與Ims對象。
EventHub:通過Linux系統(tǒng)調(diào)用獲取底層設(shè)備事件,向InputReader傳遞。
InputManager:啟動事件讀取/分發(fā)線程,管理讀取/分發(fā)類。
InputManager#構(gòu)造方法。
InputManager::InputManager(const sp<EventHubInterface>& eventHub,
const sp<InputReaderPolicyInterface>& readerPolicy,
const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
mDispatcher = new InputDispatcher(dispatcherPolicy);
mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
initialize();
}
創(chuàng)建InputDispatcher與InputReader。InputDispatcher繼承QueuedInputListener,在InputReader內(nèi)部,QueuedInputListener作為事件監(jiān)聽。
InputManager#initialize方法。
void InputManager::initialize() {
mReaderThread = new InputReaderThread(mReader);
mDispatcherThread = new InputDispatcherThread(mDispatcher);
}
初始化讀取/分發(fā)線程,封裝讀取分發(fā)類。InputReaderThread是事件讀取線程,該線程利用threadLoop實現(xiàn)無限循環(huán),利用InputReader不斷獲取事件消息,從InputManager的構(gòu)造方法可知,InputReader創(chuàng)建時封裝了EventHub與InputDispatcher。
因此,在InputReader中,EventHub將讀取到的事件消息交給InputDispatcher。
Ims服務(wù)啟動
InputManagerService#start方法。
public void start() {
//native層啟動方法,調(diào)用native層InputManager的start方法
nativeStart(mPtr);
...
}
JNI#nativeStart方法。
static void nativeStart(JNIEnv* env, jclass /* clazz */, jlong ptr) {
NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
status_t result = im->getInputManager()->start();
}
底層InputManager#start方法。
status_t InputManager::start() {
status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
...
result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
...
return OK;
}
啟動讀取/分發(fā)線程,threadLoop循環(huán)。
讀取線程
bool InputReaderThread::threadLoop() {
mReader->loopOnce();
return true;
}
利用InputReader#loopOnce獲取事件。
分發(fā)線程
bool InputDispatcherThread::threadLoop() {
mDispatcher->dispatchOnce();
return true;
}
利用InputDispatcher#dispatchOnce實現(xiàn)一次分發(fā)。
InputManager服務(wù)啟動成功。
總結(jié):輸入管理架構(gòu)主要包括上層InputManagerService服務(wù),底層管理者NativeInputManager與InputManager,其中NativeInputManager與上層指針聯(lián)系,InputManager負(fù)責(zé)真正的底層管理,事件獲取者EventHub,讀取分發(fā)InputReader與InputDispatcher。
以上架構(gòu)建立后,從上層Ims調(diào)用start啟動,目的是讓底層兩個線程運(yùn)行起來,兩線程均是無限循環(huán)線程,不停的獲取事件消息進(jìn)行分發(fā)。
任重而道遠(yuǎn)