.

Aktivitet , . Google Monkey MonkeyRunner PC, vanskelig .

getevent.

I Android-menyen, kan du sende en e-post, fa tilsendt det, og / eller / bin / , adb for a se siden. (Om Adb )

legg til enhet 1: / dev / input / event5.

navn: “msm8974-taiko-mtp-snd-kort hodesett jack”

legg til enhet 2: / dev / input / event4.

navn: “msm8974-taiko-mtp-snd-kort Button Jack”

legg til enhet 3: / dev / input / event3.

legg til enhet 4: / dev / input / event1.

legg til enhet 5: / dev / input / event0.

legg til enhet 6: / dev / input / event2.

, enhet , / dev / input / event [x] .

/ dev / input / event0: 0001 0074 00000001.

/ dev / input / event0: 0000 0000 00000000.

/ dev / input / event0: 0001 0074 00000000.

/ dev / input / event0: 0000 0000 00000000.

/ dev / input / event1: 0003 0039 00003c0f.

/ dev / input / event1: 0003 0035 00000303.

/ dev / input / event1: 0003 0036 000004df.

/ dev / input / event1: 0003 003a 00000030.

/ dev / input / event1: 0003 0030 00000004.

/ dev / input / event1: 0000 0000 00000000.

/ dev / input / event1: 0003 0039 ffffffff.

/ dev / input / event1: 0000 0000 00000000.

Utskriftsvennlig utgave, fremfor alt, tilbakemelding og informasjon om dette er ikke relevant.

/ dev / input / event0: EV_KEY KEY_POWER DOWN.

/ dev / input / event0: EV_SYN SYN_REPORT 00000000.

/ dev / input / event0: EV_KEY KEY_POWER UP.

/ dev / input / event0: EV_SYN SYN_REPORT 00000000.

/ dev / input / event1: EV_ABS ABS_MT_TRACKING_ID 00003c19.

/ dev / input / event1: EV_ABS ABS_MT_POSITION_X 00000333.

/ dev / input / event1: EV_ABS ABS_MT_POSITION_Y 000004d6.

/ dev / input / event1: EV_ABS ABS_MT_PRESSURE 00000033.

/ dev / input / event1: EV_ABS ABS_MT_TOUCH_MAJOR 00000005.

/ dev / input / event1: EV_SYN SYN_REPORT 00000000.

/ dev / input / event1: EV_ABS ABS_MT_TRACKING_ID ffffffff.

/ dev / input / event1: EV_SYN SYN_REPORT 00000000.

, 2,3 hendelse , 4,5 , 4,5 hendelse . EV_SYN , transaksjonen forplikte .

sendevent.

get get get,,,,,,,,,,,,,,, 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 ” :

, Beror enhetsdriverens krav , Multi-touch hendelse , Android , Nexus5 .

ABS_MT_POSITION_X: ( ) X . ABS_MT_POSITION_Y: ( ) Y . ABS_MT_PRESSURE: ( ) . ABS_MT_TOUCH_MAJOR: ( ) , . ABS_MT_TOUCH_MINOR: ( ) . ABS_MT_TOUCH_MAJOR , . ABS_MT_WIDTH_MAJOR: ( ) ABS-MT_WIDTH_MINOR: (Klarer) Innkjopssystemer. Utskriftsvennlig utgave. ABSOLUTT: IKKE ANVENDT. ABS_MT_ORIENTATION: ABS_MT_WIDTH_MINOR: ( ) . ABS-MITT_DISTANCE: (Rett opplysning). ABS_MT_TOOL_TYPE: (Rett opplysning) MT_TOOL_FINGER MT_TOOL_PEN. ABS_MT_TRACKING_ID: ( ) ID. ID , . For eksempel, , ID, , ID . ABS_MT_SLOT: ( ) slot ID Linnux .

Nexus5 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

hendelsen .

event, ABS_MT_PRESSURE, ABS_MT_TOUCH_MAJOR , og 2 event.

event :

event :

ABS_MT_SLOT , , , ABS_MT_SLOT. , ABS_MT_SLOT. , ABS_MT_SLOT 0. ABS_MT_SLOT 0, .

Ikke anbefalt, ABS_MT_SLOT ABS_MT_TRACKING_ID , , slot.

event :

event :

, …………………. ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ABS ), .

, 10 .

Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux Linux .

, Internett , , sendvent .

Jeg ma etterligne en sveipe opp og ned pa siden av skjermen min, i en enkelt beroring. Jeg prover a ga fra x = 1350 y = 1350 til x = 1350 y = 750 og tilbake ned til x = 1350 y = 1350.

inngangssving 1350 1350 1350 750.

inngangssvep 1350 750 1350 1350.

sendvent / dev / input / event1 3 57 0.

sendvent / dev / input / event1 3 53 1350.

sendvent / dev / input / event1 3 54 1350.

sendvent / dev / input / event1 0 2 0.

sendvent / dev / input / event1 0 0 0.

sendvent / dev / input / event1 3 57 0.

sendvent / dev / input / event1 3 53 1350.

sendvent / dev / input / event1 3 54 750.

sendvent / dev / input / event1 0 2 0.

sendvent / dev / input / event1 0 0 0.

sendvent / dev / input / event1 3 57 0.

sendvent / dev / input / event1 3 53 1350.

sendvent / dev / input / event1 3 54 1350.

sendvent / dev / input / event1 0 2 0.

sendvent / dev / input / event1 0 0 0.

Det vil avhenge av faktorene for kjernen i sporsmalet:

Hvis den har uinput aktivert sa er det bra. Beroringsskjermdrivere, noen initierer seg til a ligge hvor som helst innenfor / dev / input / event X Hvordan kjernen handterer inngangen, for maskinvareknappene.

Hvis dette passerer de tre kriteriene ovenfor, sa ved a lese bestemte hendelser fra / dev / input / event X hvor X er et nummer – vil dette bli bestemt ved oppstartstid, avhengig av bestilling av a laste de riktige driverne. Dette vil variere, men du kan prove det og se:

adb shell cat / dev / input / event X (hvor X er et nummer, ma du vite for hand!) Avhengig av hvilken hendelse det er sa kan du se morsomme ting som skjer pa skjermen basert pa riktig / dev / input / hendelse X blir utgitt.

Verdiene er i kodet form, basert pa kjernens inndata struktur – struct input_event som finnes i de fleste kjernekilder under inkluderer / linux / input.h.

V r forsiktig! Avhengig av hvilken beroringsskjermdriver som brukes, returnerer noen egentlig ikke de riktige koordinatene – det er igjen som en ovelse 🙂

Pa Samsung GT-i5500 kjorer Eclair, / dev / input / event2 er beroringsskjermen, og verdiene er i kodet form, dette skal ikke tas for gitt, da det vil avhenge av hvilken beroringsskjermdriver som brukes. Pa Sony ST15i, kjorer ICS, er det overraskende det samme! Men pa Zte Blade, sin / dev / input / event1.

Forresten jobbet jeg for et ar siden, pa a lage en beroringsskjerm for ClockWorkMod Recovery som kan bli funnet over pa.

Den virkelige smertefulle delen forsokte a avgjore hvilken hendelse som var beroringsskjermen og handle pa det tilsvarende, som ble overfort til Zte Skate, Zte Racer og Samsung GT-i5500.

Mens jeg fant ut maskinvareknapper for mitt NITDroid-prosjekt, fikk jeg muligheten til a utforske maten Linux og Android handterer innkommende hendelser internt for de overfores til brukerprogrammet. Dette innlegget sporer forplantningen av en inngangshendelse fra Linux-kjernen gjennom Android-brukeromradet sa langt jeg forstar det. Selv om prinsippene er sannsynligvis det samme for i hovedsak en inngangsenhet, vil jeg trekke pa undersokelsene mine av driverne for LM8323-maskinvare-tastaturet (drivere / input / keyboard / lm8323.c) og TSC2005 beroringsskjerm (drivere / input / touchscreen / tsc2005.c) som begge er funnet inne i Nokia N810.

For det forste eksponerer Linux eksternt et enhetlig inngangshendelsesgrensesnitt for hver enhet som / dev / input / eventX hvor X er et heltall. Dette betyr at disse “innretningene” kan polles pa samme mate og hendelsene de produserer er i samme ensartede format. For a oppna dette har Linux et standard sett med rutiner som hver enhetsdriver bruker til a registrere / avregistrere maskinvaren den administrerer og publisere innkommende hendelser den mottar.

Nar forermodulen til en inngangsenhet forst legges inn i kjernen, oppstiller initieringsrutinen vanligvis en slags probing for a oppdage tilstedev relsen av maskinvarestykkene den skal klare. Denne sonderingen er selvsagt enhetsspesifikk; men hvis det lykkes, vil modulen til slutt pakalle funksjonen input_register_device (& # x2026;) i include / linux / input.h som setter opp en fil som representerer den fysiske enheten som / dev / input / eventX hvor X er et heltall . Modulen registrerer ogsa en funksjon for a handtere IRQ-er som kommer fra maskinvaren den administrerer via request_irq (“#:”; inkludert / linux / interrupt.h), slik at modulen vil bli varslet nar brukeren samhandler med den fysiske enheten den administrerer .

Nar brukeren fysisk interagerer med maskinvaren (for eksempel ved a skyve / slippe ut en nokkel eller utove / lofte trykk pa beroringsskjermen), blir en IRQ avfyrt og Linux pakaller IRQ-handleren registrert av den tilhorende enhetsdriveren. Imidlertid ma IRQ-behandlere etter tilpasset returnere raskt, da de i det vesentlige blokkerer hele systemet nar de utfores og dermed ikke kan utfore langvarig behandling; vanligvis vil en IRQ-behandler bare 1) lagre dataene som b res av IRQ, 2) spor kjernen til a planlegge en metode som ville behandle hendelsen senere nar vi har avsluttet IRQ-modus, og 3) fortelle kjernen vi har handtert IRQ og avslutte. Dette kan v re veldig grei, da IRQ-handleren i driveren til LM8323-tastaturet inne i N810:

Det kan ogsa v re mer komplisert som den som er i driveren til TSC2005 beroringsskjermkontrolleren (tsc2005_ts_irq_handler (& # x2026;)) som den integrerer i SPI-rammene (som jeg aldri har sett pa “# x2026;).

Noen gang senere kjorer kjernen den planlagte metoden for a behandle den nylig lagrede hendelsen. Denne metoden vil alltid rapportere hendelsen i et standardformat ved a ringe en eller flere av input_ * -funksjonene i include / linux / input.h; Disse inkluderer input_event (& # x2026;) (generelt), input_report_key (& # x2026;) (for nokkel ned og tast opp hendelser), input_report_abs (& # x2026;) (for posisjonshendelser, for eksempel fra en beroringsskjerm) Merk at funksjonene input_report _ * (& # x2026;) er egentlig bare bekvemmelighetsfunksjoner som kaller input_event (& # x2026;) internt, som definert i inkluderer / linux / input.h. Det er sannsynlig at mye behandling skjer for hendelsen publiseres via disse metodene; LM8323-driveren for eksempel gjor et internt nokkelkartskartleggingstrinn, og TSC2005-driveren gar gjennom denne galte aritmetikken som involverer Ohms (for a beregne en trykkindeks fra motstandsdata?). Videre kan en fysisk IRQ korrespondere med flere publiserte inngangshendelser, og omvendt. Til slutt, nar all eventpublisering er ferdig, kalles hendelsesbehandlingsmetoden input_sync (& # x2026;) for a skylle hendelsen ut. Hendelsen er na klar til a bli apnet av userspace pa / dev / input / eventX.

Nar Android GUI starter opp, opprettes en forekomst av klassen WindowManagerService (rammer / base / services / java / com / android / server / WindowManagerservice.java). Denne klassen, nar den er konstruert, initialiserer medlemsfeltet.

hvor KeyQ, definert som en privat klasse i samme fil, utvider Android’s basale inngangshandterings klasse, den abstrakte klassen KeyInputQueue (rammer / base / services / java / com / android / server / KeyInputQueue.java og framework / base /services/jni/com_android_server_KeyInputQueue.cpp). Som mQueue er instantiated, kalles det selvfolgelig konstruktoren til KeyInputQueue; sistnevnte starter pa en anonym mate en anonym trad den eier som ligger i hjertet av hendelseshandteringssystemet i Android:

Jeg har fjernet det meste av dette.

350 lined funksjon som er irrelevant for var diskusjon og reformatted koden for enklere lesing. Nokkelideen er at denne uavhengige traden vil.

Kall preprosessen (& # x2026;) metoden i den avledede klassen, og tilbyr sistnevnte en sjanse til a forhindre at arrangementet blir videreformidlet.

3. Legg den til hendelseskoen eid av klassen.

Denne InputDeviceReader-traden startet av WindowManagerService (indirekte via KeyInputQueue’s constructor) er dermed THE event-sloyfen til Android-brukergrensesnittet.

Men vi mangler fortsatt lenken fra kjernen til denne InputDeviceReader. Hva er dette magiske readEvent (? # X2026;)? Det viser seg at dette faktisk er en innfodt metode implementert i C + + halvdelen av KeyInputQueue:

Ah, sa readEvent er egentlig bare en proxy for EventHub :: getEvent (& # x2026;). Hvis vi fortsetter a sla opp EventHub i rammer / base / libs / ui / EventHub.cpp, finner vi.

Igjen har de fleste detaljene blitt fjernet fra koden ovenfor, men vi ser na hvordan readEvent () i KeyInputQueue far disse hendelsene fra Linux: ved forste samtale, EventHub :: getEvent skanner katalogen / dev / input for inngangsenheter , apner dem og lagrer filbeskrivelsene i en gruppe som heter mFDs. Deretter forsoker den a lese fra hver av disse inngangsenhetene ved a ringe til Linux-systemanropet.

OK, na vet vi hvordan et arrangement forplanter seg gjennom EventHub :: getEvent (& # x2026;) til KeyInputQueue :: readEvent (& # x2026;) og deretter til InputDeviceReader.run (& # x2026;) der det kan komme i ko i WindowManagerService. mQueue (som, som en paminnelse, utvider den ellers abstrakte KeyInputQueue). Men hva skjer da? Hvordan kommer denne hendelsen til klientprogrammet?

Vel, det viser seg at WindowManagerService har enda en privat medlemsklasse som handterer nettopp det:

Som vi kan se, er denne traden startet av WindowManagerService veldig enkel; alt det gjor er.

Griper hendelser i ko i WindowManagerService.mQueue.

Kaller WindowManagerService.dispatchKey (& # x2026;) nar det passer.

Hvis vi etterpa inspiserer WindowManagerService.dispatchKey (& # x2026;), ser vi at den kontrollerer det nav rende fokuserte vinduet, og kaller android.view.IWindow.dispatchKey (& # x2026;) i det vinduet. Hendelsen er na i brukerplassen.

Jeg legger sammen noen fine diagrammer som illustrerer disse interaksjonene. Den konseptuelle modellen:

De gule boksene er Java-implementeringer, og de bla boksene er innfodte eller andre.


Hilsener! Ønsker du å spille i det beste kasinoet? Vi fant det for deg. Registrer deg nå!