Определить, какое приложение рисует поверх других приложений?

21

Есть ли способ определить, какое приложение рисует поверх других приложений?

Например, приложение Facebook Messenger может рисовать пузыри чата поверх всего, но как мне узнать, какое приложение это делает?

Моя проблема:

У меня есть приложение, которое рисует рекламу поверх всего, и я хочу знать, какое приложение делает это. Не просто удалить его, но предупредить всех, кто использует это приложение. (Я недавно не устанавливал никаких приложений и уже проверил последние обновления.)

Я пытался использовать Dump View Hierarchy для UI Automator из Android Studio, но кажется, что приложения, которые рисуются сверху, не могут быть выбраны таким образом.

(Нажмите на изображение, чтобы увеличить)

Android Studio Экран

andreroggeri
источник
Просто чтобы добавить к вопросам, отмеченным в ответах ниже (чтобы попытаться сохранить его завершенным). В TouchWiz (Samsung Galaxy, у меня Note 4) отключение боковой клавиатуры решило эту проблему для меня.
0xc0de
Для не-разработчиков, просто проверьте здесь список приложений: android.stackexchange.com/questions/154274/…
Джонатан

Ответы:

24

Замечания:

  • уже должен быть настроен на ПК.
  • Для Android более ранней, чем версия 4.4.x, может потребоваться доступ с правами root.
  • Некоторые команды не будут работать на Android ранее, чем версия 5.1.
  • Перейдите к заголовку « Приложения для приложений », если вы незнакомы или не знакомы с командной строкой, и / или командная строка не может решить вашу проблему.

Редактировать: сократить погоню в более раннем решении и следовать только этому отредактированному разделу.

Настройте и выполните эту команду:

adb shell "dumpsys window windows | toybox grep -i system_alert_window"

Вы получите вывод всех активных наложений на экране. Пример вывода с DU Screen Recorder, Tasker и AZ Screen Recorder, показывающий активные наложения на экране:

bash-4.3 # adb shell "окна окон dumpsys | toybox grep -i system_alert_window"
    mOwnerUid = 10087 mShowToOwnerOnly = true пакет = net.dinglisch.android.tasker appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10604 mShowToOwnerOnly = true пакет = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10604 mShowToOwnerOnly = true пакет = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10649 mShowToOwnerOnly = true пакет = com.duapps.recorder appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10649 mShowToOwnerOnly = true пакет = com.duapps.recorder appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10604 mShowToOwnerOnly = true пакет = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10604 mShowToOwnerOnly = true пакет = com.hecorat.screenrecorder.free appop = SYSTEM_ALERT_WINDOW
    mOwnerUid = 10638 mShowToOwnerOnly = true пакет = ninja.sesame.app.edge appop = SYSTEM_ALERT_WINDOW

Выделенный текст рядом с package = и перед appop - это название пакета (ов) приложений, которые в настоящее время рисуют наложение на экране. В вашем случае выходные данные, включая имена пакетов, будут отличаться.

Запишите имена пакетов (далее как PKG) и выполните эту команду:

adb shell am force-stop PKG

Замените PKG на имя пакета, которое вы записали. Если у вас было несколько имен пакетов, повторите команду с одним именем пакета за раз.

Команда принудительно остановит приложение и тем самым откажется от наложения. Это должно работать. В качестве альтернативы вы можете лишить приложения разрешения «Рисовать поверх других приложений» (кратко наложение экрана) с помощью этой команды:

adb shell appops set PKG SYSTEM_ALERT_WINDOW ignore

Снова замените PKG на имя пакета при необходимости. Кроме того, вам может потребоваться повторить команду принудительной остановки для PKG. Если вы решили отменить изменения, замените ignore на allow в указанной выше команде.

В качестве альтернативы вы можете использовать App Ops для управления разрешениями из графического интерфейса.

Чтобы узнать, какое имя пакета соответствует какому приложению, вы можете попробовать приложение с открытым исходным кодом, такое как « Информация о приложениях» . Поиск по имени пакета, и вы получите имя приложения.

Редактирование завершено

Вам действительно не нужно больше читать сейчас . Я оставляю предыдущее решение (т.е. следующий раздел) без изменений, потому что 21 человек, проголосовавший за него, нашел это полезным, и я не хочу больше портить.


Простой способ - найти все приложения, имеющие разрешение «рисовать поверх других приложений», а затем выделить их из тех, которые в данный момент активны на экране. После этого включите принудительную остановку этих распространенных приложений, пока не определите приложение, ответственное за активное наложение.

Перечислять приложения, имеющие разрешение для наложения

Разрешение, требуемое приложением для создания наложения: android.permission.SYSTEM_ALERT_WINDOW(рисовать поверх других приложений).

Нам нужно выяснить все установленные приложения, имеющие указанное разрешение. Это зависит от вас, чтобы найти метод для этого. Мой ответ здесь может помочь вам.

Обратите внимание, что нам нужны имена пакетов приложений, а не их ярлыки.

Вишня из активных окон

Выполнить команду

adb shell dumpsys window windows 

Это даст вам подробную информацию о том, что вызывает появление чего-либо на экране, включая имя компонента приложения, вызывающего это.

Как вы могли бы извлечь имя, зависит от вас. Вы можете попробовать эту команду, однако

adb shell 'dumpsys window windows | grep "Window #"'

Если вы получили сообщение об ошибке: «grep» не распознается как внутренняя или внешняя команда , в Windows попробуйте эту альтернативную команду:

adb shell "dumpsys window windows | grep 'Window #'"

Демо выход

Окно № 4 Окно {42065d50 u0 com.android.phone/com.mediatek.phone.UssdAlertActivity}:
Окно №5 Окно {42197468 u0 ginlemon.flowerpro / ginlemon.flower.HomeScreen}:
Окно № 6 Окно {420fdb58 u0 com.android.systemui.ImageWallpaper}:
Окно №7 Окно {421e3b88 u0 com.android.contacts / com.android.contacts.activities.DialtactsActivity}:

В приведенном выше выводе все последующее u0 и предшествующее /является именем пакета приложения. Приложение может иметь несколько компонентов, отображающих что-то на экране.

Вы должны создать список этих имен пакетов. Если у вас установлен BusyBox , вы можете сделать

adb shell 'dumpsys window windows | grep "Window #" | sed -e "s/.*u0 //g" -e "s/\/.*//g" -e "s/}://g"'

Во всяком случае, теперь у вас будет два списка:

  • Первый список содержит все приложения, имеющие разрешение android.permission.SYSTEM_ALERT_WINDOW.
  • Второй список содержит все приложения, активно отображающие что-то на экране.

Сравните эти два списка и отдельные приложения, которые являются общими в обоих списках. Этот третий список будет состоять из приложений, имеющих разрешение на рисование наложения, и в настоящее время на экране отображает активное наложение.

Время убивать

Убейте каждое из приложений из третьего списка одно за другим и обратите внимание на состояние наложения. Вы можете использовать am force-stop PACKAGE_NAME --user 0или любой другой способ, который вам подходит. PACKAGE_NAMEэто имя пакета приложения.

РЕДАКТИРОВАТЬ : нет необходимости убивать приложение. Вы можете отказать приложению в разрешении рисовать поверх других приложений. Используйте эту команду:

adb shell 'appops set PACKAGE SYSTEM_ALERT_WINDOW deny'   # replace PACKAGE with package name of the app

Чтобы отменить изменения, замените команду deny на allow в указанной команде и выполните ее.

Если вы используете Android Marshmallow, этот ответ Эндрю Т. может быть использован.

Примечание . Вышеуказанная команда успешно протестирована на Android 5.1.1 и 6.0.1 (сборки CM). Также возможно, что команда работает на Android 5.0.x, но я не могу гарантировать . Выполнение этой команды в версии Android, выпущенной до Lollipop, может привести к сбою.

Поскольку наложение часто воспринимается, оно мгновенно исчезает в тот момент, когда приложение, вызывающее его уничтожение, следовательно, вы будете знать, какое приложение вызывало это наложение.

Приложения для приложений

Первоначально предложенный Izzy, вы можете использовать приложение, которое имеет функции перечисления разрешений, предоставленных установленным приложениям, чтобы выделить приложения, имеющие разрешение «рисовать поверх других приложений». Вы можете либо выполнить поиск такого приложения самостоятельно, либо воспользоваться списком проверки прав доступа, который ведет Иззи на своем веб-сайте.

Вам также понадобится менеджер процессов / приложений, чтобы принудительно остановить / убить некоторые процессы. Я рекомендую OS Monitor, но вы можете использовать любое компетентное приложение. См. Связанные приложения в разделе Информация о системе .

Только для демонстрационных целей

Я попробовал Advanced Permission Manager, чтобы вывести список приложений с разрешением «рисовать поверх других приложений». После этого я переключился на OS Monitor, чтобы увидеть приложения, работающие на переднем и заднем плане. Я сопоставил выходные данные обоих приложений и по отдельности принудительно остановил приложения, общие для обоих приложений. Вы можете убить процесс изнутри монитора ОС, поэтому не нужно переключаться в настройки приложения.

(Нажмите на изображение, чтобы увеличить)

IMG: IMG: IMG:

Повелитель огня
источник
1
Большое спасибо Firelord. Я многому научился с вашим постом!
andreroggeri
1
Спасибо, список окон спас мне жизнь, когда я пытался найти рекламное приложение, которое могло бы рисовать поверх всего ... без разрешения «рисовать другие приложения».
Крейг Рингер
3

Если вы используете Android 6.0 Marshmallow, вы можете использовать его собственный менеджер разрешений.

Из статьи о BGR ,

В Android 6.0 Marshmallow есть много ожидаемых новых функций, и одна из них - это то, что пользователи iPhone имели в течение многих лет: гранулярные разрешения приложений. Phone Arena установила последнюю версию предварительного просмотра Marshmallow для разработчиков и опубликовала несколько потрясающих советов, которые помогут пользователям Android убедиться, что они обмениваются данными только с приложениями, которыми они специально хотят поделиться.

Чтобы получить доступ к функции управления разрешениями Marshmallow, вам нужно открыть меню «Настройки», а затем щелкнуть раздел «Приложения». Оттуда нажмите на значок шестеренки, который затем даст вам возможность перейти к диспетчеру разрешений приложений.

Чтобы просмотреть список приложений, которые могут рисовать поверх других приложений, перейдите в « Настройки» - «Приложения» - «Дополнительно» (меню со значком шестеренки) - «Рисовать поверх других приложений» .

Вы также можете временно включить / отключить эту функцию, коснувшись приложения и переключив «Разрешить рисование поверх других приложений».

Android M менеджер разрешений

Изображение предоставлено Себастьяно Готтардо на Medium

Андрей Т.
источник
1
Для меня, Advanced (меню со значком шестеренки) отсутствовал, но вместо этого он находится в верхней / правой точке, затем; конфигурации приложения.
AnneTheAgile
3

Спасибо большое @Firelord! Я наконец нашел приложение, которое мешало мне устанавливать apk и выполнять резервное копирование adb.

Для меня я обнаружил, что это приложение под названием Battery MixЧитать дальше, чтобы увидеть, что я сделал и как я это сделал.

https://play.google.com/store/apps/details?id=jp.smapho.battery_mix

У многих людей были проблемы с установкой apk и невозможностью нажать «Install». Все ответы, которые я мог найти, в основном сводились к отображению диммирующих, тонирующих и энергосберегающих приложений. Поскольку я не использовал ни одного или удалил все подобные приложения, я изо всех сил пытался выяснить, что происходит, и какое приложение было виновником. И наконец! После одной простой команды и быстрого поиска она была решена: D

Неприятное приложение Battery Mix- это простое приложение для мониторинга заряда батареи, в котором была функция, которую я использовал для отображения тонкой линии в верхней части экрана, чтобы показать состояние уровня заряда батареи (отличное небольшое приложение).

Поэтому для диагностики я использовал команду из Firelord(выше), чтобы создать дамп текстового файла, а затем найти приложение, которое заставляло систему Android препятствовать тому, чтобы я нажимал эту кнопку Установить.

Выполнить команду с ПК

adb shell dumpsys window windows > dumpsys-windows.txt

Искать

SYSTEM_ALERT_WINDOW

Чтобы найти какие-либо оскорбительные приложения, я искал вышеуказанную строку

Который дал мне строку:

mOwnerUid=10129 mShowToOwnerOnly=true package=jp.smapho.battery_mix appop=SYSTEM_ALERT_WINDOW

(Смотрите загрузку изображений для раздела текстового файла) введите описание изображения здесь

я сразу же узнал, к какому приложению оно относится: jp.smapho. battery_mix

Так что теперь я знаю, чтобы убить это приложение всякий раз, когда я планирую загружать или создавать резервные копии adb.

mitchbw
источник
-1

Для Android Marshmallow и Oxygen 3.0.2: отключение всплывающего окна

Перейдите в Приложения и настройте Приложения и выберите Рисовать поверх других приложений.

Перейдите и выберите приложение, чтобы отключить его, чтобы оно разблокировалось с разрешения макета экрана. и приложение может напрямую получать разрешения

Перейдите в соответствующее приложение и Разрешения и включите необходимые разрешения.

наслаждаться

Радж

ДИЛЛИРАЙ П.Д.
источник
2
Вся эта информация уже есть в ответе Эндрю Т. Вам не нужно размещать новый ответ, чтобы повторить те же инструкции. Сохраните свои усилия для вопросов, на которые еще нет ответа :-)
Дэн Халм