Android input系統使用者空間流程

2021-10-02 17:47:18 字數 4493 閱讀 5597

inputmanager

|inputreader    --> inputdispatcher

|eventhub

|driver

一. 裝置的新增過程

對於/dev/input下的裝置結點,開機時會自動掃瞄一下,

同時也新增了監測,每當裝置結點有變化(usb滑鼠插入)時都會再掃瞄一下.

下面只分析開機掃瞄/dev/input/的過程,監測過程類似.

在./frameworks/base/services/input/eventhub.cpp中

size_t eventhub::getevents(int timeoutmillis, rawevent* buffer, size_t buffersize) 

}getevents

--> scandeviceslocked

void eventhub::scandeviceslocked() 

}getevents

--> scandeviceslocked

--> scandirlocked

status_t eventhub::scandirlocked(const char *dirname)

closedir(dir);

return 0;

}getevents

--> scandeviceslocked

--> scandirlocked

--> opendevicelocked

status_t eventhub::opendevicelocked(const char *devicepath) 

getevents

--> scandeviceslocked

--> scandirlocked

--> opendevicelocked

--> adddevicelocked

void eventhub::adddevicelocked(device* device) 

二. 裝置事件的處理

都是在./frameworks/base/services/input/inputreader.cpp中

bool inputreaderthread::threadloop() 

threadloop

--> looponce

void inputreader::looponce() 

threadloop

--> looponce

--> processeventslocked

processeventslocked(meventbuffer, count)

}2.1 特殊事件的處理

特殊事件包括: adddevice, removedevice, handleconfigurationchanged

threadloop

--> looponce

--> processeventslocked

--> adddevicelocked    ;;特殊事件的處理

注意:eventhub中新增的型別為device, 這兒把device轉為了inputdevice

即要篩選出非inputdevice,只將inputdevice新增到device列表中

void inputreader::adddevicelocked(nsecs_t when, int32_t deviceid) 

threadloop

--> looponce

--> processeventslocked

--> adddevicelocked         ;;特殊事件的處理

--> createdevicelocked   ;;對於add事件的處理

inputdevice* inputreader::createdevicelocked(int32_t deviceid,)  else if (classes & input_device_class_touch) 

return device;

}2.2 資料事件的處理(以觸控螢幕為例)

threadloop

--> looponce

--> processeventslocked

--> processeventsfordevicelocked    ;;資料事件的處理

void inputreader::processeventsfordevicelocked(int32_t deviceid, ...) 

threadloop

--> looponce

--> processeventslocked

--> inputreader::processeventsfordevicelocked    ;;資料事件的處理

--> inputdevice::process

void inputdevice::process(const rawevent* rawevents, size_t count)  

} else if (rawevent->type == ev_syn && rawevent->code == syn_dropped)  else }}

}if (rawevent->type == ev_syn && rawevent->code == syn_report) 

}cookpointerdata(); 

dispatchhoverexit(when, policyflags);

dispatchtouches(when, policyflags);

dispatchhoverenterandmove(when, policyflags); 

}dispatchmotion(...);

}notifymotionargs args(when, getdeviceid(), source, policyflags,

action, flags, metastate, buttonstate, edgeflags,

mviewport.displayid, pointercount, pointerproperties, pointercoords,

xprecision, yprecision, downtime);

getlistener()->notifymotion(&args);   //只是將args壓出棧中,在flush中統一處理

}inputdevice* inputreader::createdevicelocked(int32_t deviceid,)  else if (classes & input_device_class_touch) 

return device;

}其實質就是呼叫其成員變最mmppers.add過程}}

void inputdevice::process(const rawevent* rawevents, size_t count) 

}mmultitouchmotionaccumulator.process(rawevent);  multitouchmotionaccumulator::process

}mcursorbuttonaccumulator.process(rawevent);//只對ev_key(0x01)處理,即只對( 0001 014a 00000001)用,但實際上沒有case,

mcursorscrollaccumulator.process(rawevent);//只對ev_rel(0x02)處理,但touch只有(3 或 1),所以這兒mtouchbuttonaccumulator.process(rawevent);//只對ev_key(0x01)處理,但touch是即只對( 0001 014a 00000001)

//mbtntouch = rawevent->value;記錄了type=01value

if (rawevent->type == ev_syn && rawevent->code == syn_report) 

業務用例和系統用例

拋開前一篇文章談的總體思路,我們今天來談一下需求分析工作實質性的做些什麼。在這裡,我們,將主要關注於分析層面,也即 uml中的用例模型和邏輯模型。在這裡要申明的是邏輯模型並不能完全算需求分析階段的工作,因為它包含了設計模型的概念,但是我又把它歸納了一塊到需求分析階段,原因在於邏輯模型中存在了業務物件...

業務用例和系統用例

業務用例與系統用例具有同樣的特徵,因此編寫和評審用例的方法對兩者都適用。在業務用例中說明的東西,也會在系統用例中說明。這形成了系統用例和使用者用例之間的合作。但這樣帶來了兩個壞訊息。第乙個壞訊息 編寫者和讀者經常把二者弄混,可能把系統行為放入業務用例中,也可能把業務操作歸於系統用例。如果能夠商量著去...

用C 獲取系統時間

用c 獲取系統時間 datetime 數字型 system.datetime currenttime new system.datetime 1.1 取當前年月日時分秒 currenttime system.datetime.now 1.2 取當前年 int 年 currenttime.year 1...