Wie identifizieren wir den Besitzer eines Fensters?

Angenommen, wir haben ein Android-Gerät, und auf diesem Gerät sind 1 + Apps in der Lage, ihre eigenen schwebenden Fenster zu erstellen (zB halten die SYSTEM_ALERT_WINDOW Berechtigung). Plus, natürlich gibt es auch andere Fenster, die nicht unbedingt unabhängig schwimmen ( Spinner , Dialog , etc. alle ihre eigenen Fenster über WindowManager , nur für die Anzeige über eine bestehende Aktivität).

Angesichts der Tatsache, dass ich aus Entwickler-Tools eine Pixel-Koordinate in einem Fenster weiß, wie kann ich den Prozess oder App, die das Fenster mit diesem Pixel erstellt zu bestimmen? Wie kann ich herausfinden, wer für die Existenz eines gegebenen Fensters verantwortlich ist?

Ich dachte, dass vielleicht adb shell dumpsys window würde diese Informationen haben, aber wenn es tut, ich sehe es nicht.

Beachten Sie, dass ich mich für eine Lösung mit Entwicklungswerkzeugen freuen kann. Ich würde hoffen, dass die Bestimmung dieser Informationen zur Laufzeit schwierig oder unmöglich ohne besondere Privilegien wäre.

4 Solutions collect form web for “Wie identifizieren wir den Besitzer eines Fensters?”

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 jeden: mOwnerUid , package , mFrame , mShownPosition , mIsFloatingLayer , etc.

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

 [...bunch of stuff...] 6: name='Window{5e9310c u0 com.example.overlayservice/com.example.overlayservice.MainActivity}', displayId=0, paused=false, hasFocus=true, hasWallpaper=false, visible=true, canReceiveKeys=true, flags=0x81810120, type=0x00000001, layer=21010, frame=[0,0][1440,2560], scale=1.000000, touchableRegion=[0,0][1440,2560], inputFeatures=0x00000000, ownerPid=4086, ownerUid=10083, dispatchingTimeout=5000.000ms [...bunch more stuff..] 

Da ich da drücke, weiß ich, dass die App "Overlay Service" ist, die einfach ein Systemfenster zeigt. Die "Frame" -Information würde das Pixel gebunden und "ownerUid" würde mehr Info über den Besitzer geben. (Ich denke, dass dieser Befehl mehr ist als ein verkleideter dumpsys window Befehl, der nicht für Sie arbeitet.)

Obwohl es nicht genau ein "dieses Pixel zu dieser App" Mapping ist, vorausgesetzt, dass Sie die gleichen Informationen auf Ihrem Gerät sehen, kann diese Technik helfen, die Ziele zu verkleinern.


Wechseln

Das folgende ist ein direkterer Ansatz, wenn Sie Zugang zum Gerät haben oder auf einem Emulator sind.

Nach der Dokumentation für dumpsys unter der Kategorie Input Dispatcher State ,

Input Dispatcher Zustand

Der InputDispatcher ist verantwortlich für das Senden von Eingabeereignissen für Anwendungen. Wie in der unten aufgeführten Beispielausgabe gezeigt, zeigt der Zustands-Dump Informationen darüber an, welches Fenster berührt wird, der Zustand der Eingangswarteschlange, ob ein ANR im Gange ist, und so weiter.

Lesen weiter:

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

Genauer gesagt, die Zeichenfolge "TouchStates: …" identifiziert das Fenster, das wir berühren, wenn wir dumpsys laufen.

So sollten wir in der Lage sein, dumpsys input zu betreiben und nach den String TouchStates und die folgenden paar Zeilen auszudrucken, um das Fenster zu identifizieren. Hier ist meine Windows-Befehlszeile:

 timeout 3 & adb shell dumpsys input | grep TouchStates -A 5 

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

TouchStatesByDisplay: 0: down = true, split = true, deviceId = 0, source = 0x00001002 Windows: 0: name = 'Fenster {e3cd95d u0 com.example.overlayservice / com.example.overlayservice.MainActivity}', pointerIds = 0x80000000, TargetFlags = 0x107 Windows: 0: name = 'Fenster {ef28ce5 u0 NavigationBar}', displayId = 0, pausiert = false, hasFocus = false, hasWallpaper = false, visible = true, canReceiveKeys = false, flags = 0x21840068, type = 0x000007e3, Schicht = 231000, Rahmen = [0,1794] [1080,1920], Skala = 1.000000, touchableRegion = [0,1794] [1080,1920], inputFeatures = 0x00000000, ownerPid = 1632, ownerUid = 10027, dispatchingTimeout = 5000.000ms

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

Von adb shell dumpsys window :

Fenster # 3 Fenster {41b85d98 u10 com.example.app}: mDisplayId = 0 mSession = Session {41bc2e38 10536: u10a10030} mClient=android.os.BinderProxy@41b064c0 mOwnerUid = 1010030 mShowToOwnerOnly = true package = com.example.app appop = SYSTEM_ALERT_WINDOW mAttrs = WM.LayoutParams {(0,0) (395×110) gr = # 55 sim = # 20 ty = 2003 fl = # 20008 fmt = -3} Angefragt w = 395 h = 110 mLayoutSeq = 1200 mHasSurface = true mShownFrame = [885.0,642.0] [1280.0,752.0] isReadyForDisplay () = true WindowStateAnimator {41d4d2a8}: Oberfläche: gezeigt = true layer = 91000 alpha = 1.0 rect = (885.0,642.0) 395.0 x 110.0


Es sieht mir an, dass die mShownFrame-Variable die Daten enthält, die Sie benötigen, um festzustellen, ob ein Pixel in einem Fenster enthalten ist.

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

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

Sogar zu wissen, welche anderen Prozesse über das /proc Dateisystem laufen, ist nun eingeschränkt, also scheint es unwahrscheinlich, dass du in der Lage bist, Pixel-Besitz zu kennen, ohne die Plattform zu verwurzeln (das wäre eine Hintertür, um die gleiche Information zu bekommen, wie /proc aussetzen würde Über den aktuellen Vordergrundprozess).

Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.