Как системное приложение Android перезапускается после его закрытия на устройствах с рутом?

Итак, чтобы уточнить, я хотел бы знать, как системное приложение может воскресить себя (автоматический запуск) после того, как я выполню команду kill. Есть способы удалить приложения, используя приложения для удаления приложений, а также напрямую используя команду rm для физического стирания apk/odex и папок. И ответов на этот счет множество. Мой вопрос связан с самим "механизмом" автозапуска. То есть есть ли какой-то xml-файл и запущен какой-то основной процесс, который его проверяет? Или что-то вроде того. Для справки: я использую Android 6.0.1 и MIUI 8.5.3 на устройстве с рут-правами.

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

Edit1:Так выглядит ответ на половину моего собственного вопроса (при условии, что не происходит никакой другой «черной магии», такой как статус проверки другого приложения...) - перезапуск, скорее всего, достигается через BroadcastReceiver .

Приложение может зарегистрировать широковещательный приемник для системных событий . Это работает следующим образом: когда в системе происходит событие (подключение USB, обнаружение Интернета и т. д.), широковещательная рассылка отправляется всем приложениям, которые зарегистрированы для прослушивания этого события. Приложение может зарегистрироваться через свой AndroidManifest.XML или прагматически. Но основная часть вопроса - где находится этот реестр и как его можно изменить ( конечно на рутированном устройстве)

Edit2:Еще немного информации. Если я делаю ps, процесс отображается как обычно:

finddevice [....] SyS_epoll_ 7f83b48c54 S com.xiaomi.finddevice

Но если я переименую папку этого системного процесса (чтобы отключить его), а затем уничтожу процесс, кажется, что это поток связывания ( binder_thr ), пытающийся вернуть его к жизни:

finddevice [....] binder_thr 7f83b48d44 S com.xiaomi.finddevice

И как только я переименовываю папку обратно в оригинал, она снова начинает отображаться как SyS_epoll_

Приложения регистрируются (если они в этом нуждаются) в системе для трансляций, таких как изменение сетевого подключения, изменение ориентации устройства и т. д. Когда такое изменение происходит, трансляция запускает приложение. Если у вас установлен Xposed Framework, попробуйте следующее: repo.xposed.info/module/de.defim.apk.receiverstop и посмотрите, пробуждается ли приложение само по себе.
@Firelord Если я прав, то это выполнимо даже из SD Maid для пользователей, не использующих Xposed.
@DeathMaskSalesman Пробовал SD Maid, это хороший инструмент, который работает с некоторыми системными приложениями, но не со всеми. Говорит «сбой», когда я пытаюсь отключить их слушателей в диспетчере приемника.
@Firelord У меня не установлен Xposed. Итак, когда одно из этих устойчивых системных приложений перезапускается, это их прослушиватель что-то делает? Или это может быть какое-то другое приложение, которое слушает, и когда оно видит, что вы убили его «приятеля», оно воскрешает его? Я имею в виду, что первый вариант - это тот, о котором я читал в нескольких местах, просто интересно, возможен ли и второй вариант. Есть ли общее место в реестре, где эти вещи хранятся (и могут быть отредактированы)?
@Firelord Я установил Xposed, чтобы проверить эту теорию, но модуль ReceiverStop предлагает контроль над системными приложениями только в платной версии. (и мне это нужно только для тестирования) Я нашел альтернативу в модуле Xposed: repo.xposed.info/module/cn.wq.myandroidtoolsxposed Но это приложение предлагает ограниченную документацию. Просто список приложений с одним флажком рядом с каждым. Когда я устанавливаю флажок этого системного приложения и нажимаю «Сохранить», я получаю тост: «Готово». Приложение по-прежнему перезагружается.
В качестве альтернативы вы можете использовать Lucky Patcher для отключения компонентов любого приложения.

Ответы (1)

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

adb shell dumpsys package

Что касается отключения конкретного ресивера, попробуйте Elixir 2 . Вы можете перейти в раздел «Приложения», выбрать свое приложение, а затем прокрутить вниз, чтобы найти приемники (статические). Рядом с ними будет возможность отключить этот компонент.

Другой вариант — использовать модуль ReceiverStop Xposed. Его бесплатная версия позволяет отключать приемники только для установленных пользователем приложений.

Что касается командной строки, если вы знаете имя получателя/компонента, вы можете сделать:

adb shell su -c 'pm disable PKG/COMP'         # where PKG is package name of the app and COMP is the component you intend to disable.

Тем не менее, я не проверял, работают ли указанные решения для динамически зарегистрированных приемников.

Само собой разумеется, что ответ действителен только для рутированных устройств Android.
Ну в том-то и дело, что pm disable не работает для этих "жестких" системных пакетов. (Тем не менее, работает для некоторых системных приложений) На данный момент я использую сценарий, который я написал для альтернативного отключения/включения. Скрипт 1) переименовывает файлы .apk и .odex и 2) убивает процесс. Это создает бесконечный цикл всплывающих окон с надписью «к сожалению...». Затем я снова включаю сценарий. И процесс перезапускается сам и ошибки уходят. Приложения, которые ведут себя таким образом, вызовут бутлуп при перезагрузке, что экономит время тестирования.
Спасибо за ссылку на Эликсир2, она дает дополнительную полезную информацию. Но, как и SD Maid, он не работает для этих приложений. Нажатие [отключить] рядом с действиями/получателями не дает никакого эффекта. ReceiveStop, как вы сказали, дает доступ к системным приложениям только в платной версии. Но мне это нужно только для проверки. То есть удалить приемники и посмотреть, стабильно ли ПЗУ. Если да, то проблема будет выявлена ​​и я попробую придумать скрипт-способ как-то это сделать.