Почему отключенные приложения все еще работают?

Я заметил, что приложения (такие как Google Contacts Sync), которые были отключены с помощью стандартного диспетчера приложений Android (KitKat), по-прежнему отображаются как работающие при использовании инструментов наблюдения за процессами. Это верно даже после перезагрузки устройства.

Почему отключенные приложения все еще работают? Есть ли эффективный (и безопасный) способ отключить их?

Допустимы решения, требующие привилегий root.

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

Рядом с кнопкой «Отключить» находится кнопка «Принудительная остановка». Нажмите ее, и процесс должен завершиться и больше не запускаться.
@GiantTree Спасибо. После перезагрузки не запустится снова?
В вашем случае это так, потому что системное приложение явно вызвало экспортированную службу этого пакета, и единственный способ надежно убить этот процесс (и любой другой) — это активно убить его с помощью Greenify, Amplify (требуется Xposed) или аналогичные приложения. Примечание: этого не должно происходить и это должно считаться ошибкой, потому что у PackageManager есть задача не допустить запуска отключенного приложения.
Спасибо! Это отличная информация. Я обновил вопрос, чтобы отразить, что корневые решения приемлемы. Могу ли я использовать такой инструмент, как MyAndroidTools, чтобы вручную отключить все службы для отключенных приложений?
@Firelord Спасибо. Работает ли скрытие в KitKat или оно появилось в Lollipop? Можно ли выполнить команду скрытия непосредственно с устройства или для этого требуется внешнее подключение adb? После выполнения этой команды, какова команда, чтобы отменить ее, если это необходимо?
@Firelord не могли бы собрать ваши комментарии в ответ? Хотя вопрос спрашивает «почему», я думаю, что «как предотвратить» был настоящим вопросом (почему: отключенные приложения все еще могут вызывать свои намерения — что довольно часто происходит с центральными приложениями Google. Согласно вашему (связанному) исследованию , это больше не должно применяться после того, как приложение было заблокировано/скрыто).
Если вам удастся использовать мой ответ, дайте мне знать, так как я тестировал свое решение только на ПЗУ Lollipop.
@Izzy и Firelord Задайте этот вопрос, чтобы узнать больше: будет ли использование такого инструмента, как MyAndroidTools, для отключения всех служб и приемников для приложения еще одним эффективным решением?
Что ж, в связи с этим я отключил все службы, приемники, действия и поставщиков контента, а также отключил приложение SystemUI. Перезагрузил устройство и угадал, какое приложение все еще загружается в память (это не относится к pm block/hide), что заставляет меня задаться вопросом, что вызывает загрузку приложения сейчас. Другое дело, что пока он загружался в память можно наблюдать его внешнее отсутствие по отсутствию фона, тем, строки состояния и прочего. Возможно, из этого можно выковать новый вопрос.
@Firelord Я думаю, это то, что я указал выше: если вы отключите приложение, оно просто «помечено как отключенное» (и не отображается в программе запуска и т. Д.), Но оно все еще зарегистрировано в системе (диспетчер пакетов), поэтому другие приложения могут найти его и назвать его намерения. Кажется, что скрытие/блокировка довольно сравнима с «удалением, оставляющим .apkданные позади» — поэтому приложение становится «полностью незарегистрированным и невидимым для всего, кроме файлового менеджера», поэтому другие приложения больше не могут вызывать его намерения, как они могут не найти их.
@Izzy За исключением того, что блокировка, по-видимому, не работает должным образом в KitKat. :-(
@RockPaperLizard … и спрятаться там вообще не получится. Судя по всему, судьба KK не ограничивается работой с вашей SD-картой. Простите за это. Но я говорил "в общем" ;)

Ответы (1)

Вашему Android не нужно иметь root-доступ для действительного отключения приложения, если у вас версия 4.4.x или выше. Все, что вам нужно, это настроить на ПК и включить отладку по USB на устройстве без рута или приложение эмулятора терминала для рутированного устройства (вы также можете использовать adb).

Если вы проверите использование диспетчера пакетов ( pm), вы увидите

pm block [--user USER_ID] PACKAGE_OR_COMPONENT")
pm разблокировать [--user USER_ID] PACKAGE_OR_COMPONENT")

Для Lollipop это будет

pm hide [--user USER_ID] PACKAGE_OR_COMPONENT")
pm показать [--user USER_ID] PACKAGE_OR_COMPONENT")

Чтобы заблокировать или скрыть пакет (это безопасно), просто выполните

pm block PACKAGE # for KitKat
pm hide PACKAGE  # for Lollipop

Чтобы разблокировать или показать пакет, выполните

pm unblock PACKAGE #for KitKat 
pm unhide PACKAGE  # for Lollipop

PACKAGE→ имя пакета приложения. Чтобы узнать имя пакета приложения:

Добавьте adb shellперед самой командой, чтобы выполнить их с ПК.

Функция hide имеет следующий комментарий внутри исходного кода

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

Аналогичное комментирование сделано для блока здесь .

Чтобы проверить утверждение, вы можете использовать некоторые системные службы, такие как meminfo, procstatsи activityиспользовать инструмент dumpsys или даже перечислить все процессы, использующие ps. Вы не найдете активного присутствия заблокированного/скрытого приложения.

То же самое относится ко многим системным приложениям, отключенным с помощью графического интерфейса, или pm disable, но не ко всем приложениям, поскольку даже отключенное приложение может получать трансляции , на которые оно зарегистрировано, что можно сделать только в том случае, если оно загружено в память 1 . Тем не менее, отключенное приложение не может работать само по себе и не может выполняться никаким другим приложением.

Я приводил некоторые различия между hide / block и disabled по моему вопросу pm hide VS pm disabled — кризис идентичности . Он предоставляет только дополнительную информацию к этому ответу, поэтому вы можете его пропустить.

РЕДАКТИРОВАТЬ:

Похоже, что этот метод работает не для всех приложений на Android KitKat. В этом случае просто отзовите разрешение на чтение из APK приложения или удалите расширение .APK из имени файла приложения (последнее однажды было предложено Jaskaranbir), после чего выполните программную/полную перезагрузку. Это то же самое, что удалить приложение из системы, с той лишь разницей, что все файлы останутся на своих местах.

Оба шага можно выполнить с помощью любого корневого файлового менеджера. Способ командной строки:

adb shell su -c 'chmod 000 /data/app/PACKAGE*'             # 000 means no read-write-executable permission to user,group and others. 
adb shell su -c 'mv /data/app/PACKAGE* /data/app/PACKAGE'  # doing renaming by moving the file
adb reboot

1: Отсутствие технических доказательств, подтверждающих факт

Отличный ответ! Спасибо! Лучше сначала отключить приложение с помощью стандартного диспетчера приложений Android или лучше убедиться, что оно не отключено там?
Нет необходимости отключать приложение, если вы выберете его, pm block/hideпоэтому оставьте его нетронутым.
Если он уже отключен, не лучше ли снова включить его?
В этом нет необходимости. Атрибут скрытия будет установлен рядом с атрибутом отключения для этого пакета (вы можете проверить его внутри /data/system/users/0/package-restrictions.xml, найдите <pkg name="YOUR_PACKAGE"). Короче говоря, независимо от того, применяете ли вы команду блокировки/скрытия к отключенному приложению или нет, это безопасно.
Я пробовал. Вот ответ, полученный в эмуляторе терминала (дословно): «ВНИМАНИЕ: компоновщик: app_process имеет перемещение текста. Это тратит память и представляет угрозу безопасности. Пожалуйста, исправьте. Убито»
Хм... Кажется, это не работает. Пробовал на 3 упаковках. Они продолжают загружаться и работать.
" ПРЕДУПРЕЖДЕНИЕ: компоновщик: app_process имеет перемещение текста. Это тратит память и представляет угрозу безопасности. Пожалуйста, исправьте. Убито " -- у вас установлен Xposed? Раньше у меня было это предупреждение из-за этого. Что касается того, работают они или нет, я не могу точно подтвердить, потому что в своем комментарии к вашему вопросу я сказал, что мои находки основаны на Lollipop, но блок должен работать независимо. Я посмотрю, что еще я могу найти, чтобы помочь здесь.
Это странно. Я протестировал блокировку systemui на своем Kitkat и, к моему удивлению, блокировка работает так же, как и отключение, это приложение остается в памяти. Процесс SystemUI разветвился, даже если я его убил. Не знаю, это ошибка или желаемое поведение, но в любом случае это противоречит моим выводам, связанным с Lollipop, изложенным в ответе. Я думаю, что ответ довольно бесполезен сейчас.
@Izzy Пингую вам, чтобы вы знали о чате, так как вам это может быть интересно.
@RockPaperLizard, я забыл рассказать тебе очень простой трюк. Отзовите права на чтение файла пакета (или базового каталога, в случае Lollipop), перезапустите и готово. Например, с правами суперпользователя вы можете остановить SystemUI таким образом, adb shell su -c "chmod 111 /system/app/SystemUI.apk". 111 означает установку только прав на исполняемый файл для владельца, группы и других. Перезагрузитесь, и приложение будет отсутствовать в системе. Вы также можете установить его 000.
Отличная идея. Ссылка на чат выше для продолжения...
Я провел еще немного тестирования, и сообщение «ВНИМАНИЕ: компоновщик: app_process имеет текстовые перемещения. Это тратит память и представляет собой угрозу безопасности. Пожалуйста, исправьте. Убито» появляется независимо от того, используется ли pm для блокировки или разблокировки. Он также появляется при использовании вымышленного имени пакета. Интересно, в KitKat, делает ли он что-нибудь.
Возможно, вы захотите обновить свой ответ, чтобы было ясно, что этот метод, по-видимому, не работает в KitKat. Кроме того, только широковещательные приемники могут загружать отключенное приложение, или службы также загрузят его? См.: android.stackexchange.com/questions/131499/…