Итак, чтобы уточнить, я хотел бы знать, как системное приложение может воскресить себя (автоматический запуск) после того, как я выполню команду 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_
Я не мог понять этот код , но информация о приемниках, кажется, хранится только в памяти (нет индексного файла во внутренней памяти). Вы можете использовать следующую команду, чтобы узнать, какой приемник зарегистрирован для какого типа вещания.
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.
Тем не менее, я не проверял, работают ли указанные решения для динамически зарегистрированных приемников.
Повелитель огня
Гримуар
Эмиль
Эмиль
Эмиль
iBug