Как показать активность ДО того, как мое приложение удалено (Android)

Хотя это было невозможно, но я заметил, что NQ Mobile Security может показать сообщение после того, как я нажму "Удалить" и до вызова PackageUninstaller. Я хотел бы воспроизвести это поведение в своем приложении.

Я попробовал с Activity прослушивание намерения "android.intent.action.DELETE", как это предлагается здесь: Как узнать, что мое приложение удалено с устройства...?

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

Есть ли другой способ перехватить ваше приложение UNINSTALL? (прежде чем ответить, что это невозможно, попробуйте удалить NQ Mobile Security и посмотреть, что произойдет. На моем Android 2.3.4 он показывает хороший экран, в котором говорится, что без безопасного приложения небезопасно).

Ответ 1

Я заметил, что NQ Mobile Security может отображать сообщение после того, как я нажимаю "Удалить" и до того, как вызывается пакет PackageUninstaller

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

Спасибо, что указали это!

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

Я надеюсь, что нет.

Ответ 2

Opera Max - это приложение, которое делает что-то похожее - после его удаления открывается веб-страница.

Как они это делают?

Используя libevent, из собственного кода, они смотрят каталог /data/data/com.opera.max, который нужно удалить, а затем публикуют старые добрые action.VIEW, когда это происходит.

Установите свое приложение, запустите его и на корневом устройстве из оболочки adb удалите каталог /data/data/com.opera.max

UPDATE: я создал пример приложения, который показывает, как он работает. BTW не работает с последними версиями (KitKat +, я думаю): https://github.com/pelotasplus/ActionAfterUninstall

Ответ 3

Вероятно, они запрашивают очень критическое разрешение, которое пользователь предоставляет им неосознанно. Посмотрите вкладку "Разрешения" для этого приложения (по состоянию на 6/15/2012): https://play.google.com/store/apps/details?id=com.nqmobile.antivirus20&hl=en.

Список разрешений, получаемых этим приложением, совершенно пугает. Среди прочего:

СИСТЕМНЫЕ ИНСТРУМЕНТЫ RETRIEE RUNNING APPS Позволяет приложению получать информацию о текущих и недавно запущенных задачах. Вредоносные приложения может открыть личную информацию о других приложениях.

ИЗМЕНИТЬ/ПЕРЕКЛЮЧАТЬ СЕТЕВЫЕ НАСТРОЙКИ И ТРАНСПОРТНОЕ СРЕДСТВО Приложение сможет изменять настройки сети и для перехвата и проверки всего сетевого трафика, например измените прокси-сервер и порт любого APN. Вредоносные приложения могут отслеживать, перенаправить или изменить сетевые пакеты без вашего ведома.

ПРЕДУПРЕЖДАЙТЕ ТАБЛЕТКУ ОТ СПОСОБА ПРЕДОТВРАЩАЮТ ТЕЛЕФОН ОТ СПОСОБА Позволяет приложению не позволяйте планшету переходить в спящий режим. Приложение сможет предотвратить телефон от переулета.

ИЗМЕНИТЬ ВАШИ ПАРАМЕТРЫ UI Позволяет приложению изменить текущую конфигурацию, такую ​​как языковой стандарт или общий шрифт размер. ИЗМЕНИТЬ ГЛОБАЛЬНЫЕ НАСТРОЙКИ СИСТЕМЫ Приложение сможет изменять данные системных настроек. Вредоносные программы могут повредить вашу систему. конфигурации.

СИГНАЛ ДИСПЛЕЯ СИСТЕМЫ ДИСПЛЕЯ Позволяет программе показывать окна системных предупреждений. Вредоносные приложения могут использовать весь экран.

МОНИТОРИНГ И НЕОБХОДИМЫЕ ФАЙЛЫ Позволяет приложению монтировать и отключать файловые системы для съемного хранилища.

СООТВЕТСТВИЕ СЕТИ ПОДКЛЮЧЕНИЕ Позволяет приложение, чтобы изменить состояние сетевого подключения.

CHANGE WI-FI STATE Позволяет приложению подключаться к Wi-Fi и отключаться от него и внести изменения в настроенные сети Wi-Fi.

- Обновление -

Я также обнаружил, что Android Package Manager довольно просто удаляет пакет, если его просят сделать это. Единственная проверка, которую он выполняет перед тем, как это сделать, заключается в том, что в настоящий момент зарегистрированный пакет содержит администратор активного устройства:

    try {
        if (dpm != null && dpm.packageHasActiveAdmins(packageName)) {
            Slog.w(TAG, "Not removing package " + packageName + ": has active device admin");
            return PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER;
        }
    } catch (RemoteException e) {
    }

См. строку 6900 в PackageManagerService в источнике AOSP здесь.

Для этого приложение должно быть явно зарегистрировано пользователем устройства пользователем. См. Примечания по администрированию устройства здесь: http://developer.android.com/training/enterprise/device-management-policy.html.

Ответ 4

Я уверен, что они контролируют LogCat для перехвата, когда диспетчер активности вызывает PackageUninstaller. Я думаю, что они убивают задачу и начинают свою собственную деятельность. Это довольно умно, но он определенно использует дыру в безопасности в Android.

Ответ 5

Как fooobar.com/info/30095/..., вот пример кода, который делает это: https://github.com/zzljob/android-uninstall-feedback/blob/master/library/jni/feedback-uninstall.c. Это фактически не остановит деинсталляцию, но дает возможность поймать ее и предпринять некоторые действия. Я искренне удивлен, что это работает в Android, и команда, возможно, включила пробел в последние выпуски.