Android: может ли собственный код получать трансляцию из системы Android?

Недавно я увидел забавное приложение – Photo Wonder. Когда это приложение удаляется, на нем отображается страница веб-опроса с просьбой о причине удаления приложения. Теперь вот проблема. Насколько я знаю, после того, как приложение было удалено, система передает ACTION_PAKAGE_REMOVED намерение. Но это смешное приложение смогло показать мою веб-страницу, хотя официальный документ говорит: «Установленный пакет не получает этого намерения». Во всяком случае, я мог найти процесс проверки статуса какого-либо приложения.

Теперь вот вопрос. Может ли родное приложение уловить трансляцию из системы Android? Если это возможно, сообщите мне, как это сделать! 🙁

Solutions Collecting From Web of "Android: может ли собственный код получать трансляцию из системы Android?"

Я считаю, что у меня есть основная идея, как они это сделали. Вот кусочки головоломки.

  1. Любое приложение Android может запустить процесс, вызвав Runtime.exec() .

     Runtime.getRuntime().exec("chmod 755 '/data/data/my.app/files'/native_code"); 

    После выполнения этой строки кода происходит другой процесс. Этот процесс выполняется под тем же Linux-пользователем, что и само приложение.

  2. Когда пользователь открывает Настройки -> Приложения -> Мое приложение и нажимает кнопку «Принудительная остановка» , основной процесс приложения убивается, но процесс, на котором выполняется собственная программа (см. Выше), все еще выполняется . Я лично считаю, что это проблема безопасности, и я собираюсь сообщить об этом в AOSP.

  3. Такая родная программа может работать бесконечно и ничего не делать – просто спать. Но перед сном он регистрирует обработчик сигнала завершения, который будет вызываться, когда процесс вот-вот закончится системой.

     int main(void) { signal(SIGTERM, termination_handler); while(1) { sleep(10); } } void termination_handler(int sig) { // handle termination signal here } 
  4. Теперь вы уже должны знать, что такое последний кусок, не так ли? Мой родной term_handler должен иметь возможность запускать браузер. Я не пробовал это в коде, но я предполагаю, что это возможно, потому что я могу сделать это с помощью adb shell как adb shell ниже.

     adb shell am start -a android.intent.action.VIEW -d http://www.google.com 

Теперь вернемся к вопросу о том, как это делает браузер Dolphin. Установите приложение и запустите его хотя бы один раз. После запуска он регистрирует собственный наблюдатель удаления, используя принципы, описанные выше. Чтобы увидеть это, подключитесь к устройству и откройте adb shell . Затем вызовите ps чтобы просмотреть список процессов. Вы увидите два процесса, похожие на следующие

  u0_a109 315 ... mobi.mgeek.TunnyBrowser u0_a109 371 ... /data/data/mobi.mgeek.TunnyBrowser/files/watch_server 

Как вы можете видеть, она запускает собственную программу watch_server, которая является частью его apk-файла. Теперь откройте страницу App info о приложении браузера Dolphin и нажмите "Force Stop" . Вернитесь к терминалу и снова вызовите ps . Вы увидите, что процесс mobi.mgeek.TunnyBrowser больше отсутствует, но watch_server все еще работает.

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

Теперь, когда вы удаляете приложение, Android останавливает все процессы, принадлежащие этому приложению. Watcher получает сигнал о завершении и открывает браузер с предопределенным URL-адресом и затем выключается.

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

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

Вы можете проверить разрешение, используемое этим приложением, может содержать разрешения INSTALL и UNINSTALL.

КАК ЭТО РАБОТАЕТ:

  1. Вместо одного приложения, которое может иметь 2 приложения.

  2. Когда и когда вы его устанавливаете, это приложение также устанавливает некоторую услугу, которая следит за статусом вашего приложения

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

  4. Как только эта служба обнаружит, что ваш пакет отсутствует в списке, он вызывает намерение с представлением действий с URL-адресом сети, чтобы открыть бравир.