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

8

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

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

Решения, требующие привилегий суперпользователя, являются приемлемыми.

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

RockPaperLizard
источник
Прямо рядом с кнопкой «Отключить» находится кнопка «Стоп». Нажмите на нее, и процесс должен завершиться и больше не начинаться.
GiantTree
@GiantTree Спасибо. После перезагрузки, не начнется ли снова?
RockPaperLizard
4
В вашем случае это так, потому что системное приложение явно вызвало экспортированную службу этого пакета, и единственный способ надежно убить этот процесс (и любой другой) - это активно убить его с помощью Greenify, Amplify (требуется Xposed) или аналогичных приложений. Обратите внимание: это не должно происходить и должно рассматриваться как ошибка, поскольку у PackageManager есть задача не допустить запуска отключенного приложения.
GiantTree
1
В этом отношении я отключил все службы, получатели, действия и поставщиков контента, а также отключил приложение SystemUI. Перезапустил устройство и угадаю, что приложение все еще загружено в память (это не относится к pm block/hide), что заставляет меня задуматься, что вызывает загрузку приложения сейчас. Другое дело, что пока он был загружен в память, вы можете наблюдать его поверхностное отсутствие по отсутствию фона, тем, строки состояния и многого другого. Возможно, из этого можно поднять новый вопрос.
Повелитель огня
1
@Firelord Я думаю, это то, на что я указал выше: если вы отключаете приложение, оно просто «помечается как отключенное» (и не отображается в панели запуска и т. Д.), Но оно все равно регистрируется в системе (диспетчере пакетов), поэтому другие приложения могут найти его и назовите его намерения. Похоже, что скрытие / блокирование довольно сравнимо с «удалением .apkи удалением данных» - поэтому приложение становится «полностью незарегистрированным и невидимым для всех, кроме файлового менеджера», поэтому другие приложения больше не могут вызывать его намерения, как они могут не найти их.
Иззи

Ответы:

7

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

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

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

Для Lollipop это было бы

pm скрыть [--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перед самой командой, чтобы выполнить их с ПК.

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

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

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

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

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

Я обсуждал некоторые различия между скрытием / блокировкой и отключением в моем вопросе « pm hide против PM pm» - кризис идентификации . Он предоставляет только дополнительную информацию к этому ответу, поэтому вы можете пропустить его.

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

Похоже, что эта техника не работает для всех приложений на 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, или лучше убедиться, что оно там не отключено?
RockPaperLizard
Нет необходимости отключать приложение, если вы выбираете, pm block/hideтак что оставьте его без изменений.
Повелитель огня
Если он уже отключен, лучше ли его снова включить?
RockPaperLizard
1
Это странно. Я протестировал блокировку systemui на моем Kitkat и, к моему удивлению, блокировка работает так же, как отключение, это приложение остается в памяти. Процесс SystemUI разветвился, даже если я его убил. Не знаю, это ошибка или желаемое поведение, но в любом случае, это в отличие от моих выводов, связанных с Lollipop, изложенных в ответе. Я думаю, что ответ сейчас довольно бесполезен.
Повелитель огня
1
@RockPaperLizard, я забыл сказать вам очень простой трюк. Отмените разрешения на чтение файла пакета (или базового каталога, в случае Lollipop), перезапустите и все будет сделано навсегда. Например, с правами суперпользователя вы можете остановить SystemUI следующим образом adb shell su -c "chmod 111 /system/app/SystemUI.apk". 111 означает установить только исполняемые разрешения для владельца, группы и других. Перезагрузитесь, и приложение будет отсутствовать в системе. Вы можете установить его 000также.
Повелитель огня