Wie identifizieren wir den Eigentümer eines Fensters?

8

Angenommen, wir haben ein Android-Gerät und auf diesem Gerät können mehr als 1 Apps eigene Floating-Fenster erstellen (z. B. die Berechtigung SYSTEM_ALERT_WINDOW ). Natürlich kann es auch andere Fenster geben, die nicht unbedingt unabhängig voneinander floaten ( Spinner , Dialog , etc. erstellen alle ihr eigenes Fenster über WindowManager , nur für die Anzeige über eine bestehende Aktivität).

Wenn ich von Entwicklertools eine Pixelkoordinate in einem Fenster kenne, wie kann ich den Prozess oder die App bestimmen, die das Fenster mit diesem Pixel erstellt haben? IOW, wie kann ich herausfinden, wer für die Existenz eines bestimmten Fensters verantwortlich ist?

Ich dachte, dass adb shell dumpsys window vielleicht diese Information hätte, aber wenn es so ist, sehe ich es nicht.

Beachten Sie, dass ich mich mit einer Lösung für Entwicklungstools zufrieden geben werde. Ich würde hoffen, dass das Bestimmen dieser Informationen zur Laufzeit ohne besondere Privilegien schwierig oder unmöglich wäre.

    
CommonsWare 05.07.2017, 14:51
quelle

4 Antworten

1

Wie wäre es mit dieser Option: adb shell dumpsys window windows visible-apps ?

Es druckt die Liste der sichtbaren Fenster mit den folgenden Feldern für jedes: mOwnerUid , package , mFrame , mShownPosition , mIsFloatingLayer usw.

    
dev.bmax 10.07.2017, 13:54
quelle
2

Das Ausführen dieses Befehls adb shell dumpsys input gibt mir die folgende Ausgabe:

%Vor%

Da ich darauf vertraue, weiß ich, dass die App "Overlay Service" ist, der einfach ein Systemfenster anzeigt. Die "Rahmen" -Information würde das Pixel binden und "ownerUid" würde mehr Informationen über den Besitzer geben. (Ich denke, dass dieser Befehl mehr als ein verkleideter Befehl dumpsys window ist, der nicht für Sie arbeitet.)

Obwohl es sich nicht genau um ein "dieses Pixel für diese App" -Mapping handelt, kann diese Technik helfen, die Ziele zu verkleinern, vorausgesetzt, Sie sehen dieselben Informationen auf Ihrem Gerät.

Alternativ

Der folgende Ansatz ist direkter, wenn Sie Zugriff auf das Gerät haben oder sich auf einem Emulator befinden.

Gemäß der Dokumentation für dumpsys in der Kategorie Dispatcherstatus eingeben ,

  

Eingabe-Dispatcher-Status

     

Der InputDispatcher ist verantwortlich für das Senden von Eingabeereignissen an Anwendungen. Wie in der folgenden Beispielausgabe gezeigt, zeigt sein Statusspeicherauszug Informationen darüber, welches Fenster berührt wird, den Status der Eingabewarteschlange, ob ein ANR gerade ausgeführt wird usw.

Lesen Sie weiter:

  

Nachdem Sie den Touchscreen berührt und gleichzeitig Dumpsys ausgeführt haben, identifiziert die TouchStates-Zeile das Fenster, das Sie berühren, richtig.

Insbesondere die Zeichenfolge "TouchStates: ..." identifiziert das Fenster, das wir gerade berühren, wenn wir dumpsys ausführen.

Also sollten wir in der Lage sein, dumpsys input auszuführen und nach der Zeichenfolge TouchStates zu suchen und die folgenden Zeilen auszudrucken, um das Fenster zu identifizieren. Hier ist meine Windows-Befehlszeile:

%Vor%

Und hier ist die Ausgabe, die Window{e3cd95d u0 com.example.overlayservice/com.example.overlayservice.MainActivity}' als das berührte Fenster identifiziert.

  

TouchStatesByDisplay:       0: down = wahr, split = true, deviceId = 0, source = 0x00001002         Windows:           0: name = 'Fenster {e3cd95d u0 com.beispiel.überlagerungsdienst / com.beispiel.überlagerungsdienst.MainAktivität}', pointerIds = 0x80000000, targetFlags = 0x107     Windows:       0: name = 'Fenster {ef28ce5 u0 Navigationsleiste}', displayId = 0, pausiert = falsch, hasFocus = falsch, hasWallpaper = false, visible = true, canReceiveKeys = false, flags = 0x21840068   , type = 0x000007e3, Ebene = 231000, frame = [0,1794] [1080,1920], Skalierung = 1,000000, touchableRegion = [0,1794] [1080,1920], inputFeatures = 0x00000000, ownerPid = 1632, ownerUid =   10027, dispatchingTimeout = 5000.000ms

Wenn kein Fenster berührt wird, sehen Sie TouchStates: <no displays touched> .

    
Cheticamp 10.07.2017 12:30
quelle
1

Von adb shell dumpsys window :

Fenster # 3 Fenster {41b85d98 u10 com.example.app}:     mDisplayId = 0 mSession = Sitzung {41bc2e38 10536: u10a10030} mClient = android.os.BinderProxy@41b064c0     mOwnerUid = 1010030 mShowToOwnerOnly = true Paket = com.beispiel.app appop = SYSTEM_ALERT_WINDOW     mAtrs = WM.LayoutParams {(0,0) (395x110) gr = # 55 sim = # 20 ty = 2003 fl = # 20008 fmt = -3}     Angeforderte w = 395 h = 110 mLayoutSeq = 1200     mHasSurface = true mShownFrame = [885.0.642.0] [1280.0,752.0] isReadyForDisplay () = true     WindowStateAnimator {41d4d2a8}:       Oberfläche: gezeigt = wahre Schicht = 91000 Alpha = 1,0 Rect = (885,0,642,0) 395,0 x 110,0

Es sieht so aus, als ob die Variable mShownFrame die Daten enthält, die Sie benötigen, um festzustellen, ob ein Pixel in einem Fenster enthalten ist.

    
Daniel Chiriac 07.07.2017 15:50
quelle
0
  

Ich würde hoffen, dass das Bestimmen dieser Informationen zur Laufzeit wäre   schwierig oder unmöglich ohne besondere Privilegien

Die neueste Android-Version ist stark gesperrt, um zu verhindern, dass Malware "vertrauenswürdige" Anwendungen wie Online-Banking-Anwendungen verfälscht.

Auch wenn Sie wissen, welche anderen Prozesse über das /proc Dateisystem laufen, ist dies jetzt eingeschränkt. Es ist daher unwahrscheinlich, dass Sie die Besitzer von Pixeln kennen, ohne die Plattform zu rooten (das wäre eine Hintertür, um die gleichen Informationen zu erhalten /proc würde über den aktuellen Vordergrundprozess offen legen).

    
solidpixel 07.07.2017 15:55
quelle

Tags und Links