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.
Das Ausführen dieses Befehls adb shell dumpsys input
gibt mir die folgende Ausgabe:
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:
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>
.
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.
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).
Tags und Links android