У меня есть Samsung Galaxy S Relay 4G под управлением Android 4.1.2. Также у меня на ПК установлен adb .
Когда я долго нажимаю кнопку питания, а затем нажимаю «Перезагрузить», мой телефон выключается примерно за десять секунд. Потом сам перезагружается.
Когда я adb reboot
вместо этого вхожу, телефон выключается намного быстрее: выключение занимает всего секунду или около того. Затем он перезагружается.
Мои вопросы:
Почему adb reboot
так быстрее?
Он просто пропускает анимацию выключения оператора мобильной связи или пропускает еще какие-то важные процедуры?
Могу ли я использовать adb reboot
каждый раз, когда я хочу перезагрузить телефон, или в этом есть какой-то недостаток?
(необязательно) Откуда вы знаете?
Дополнительная информация (вы можете пропустить это)
Я провел некоторое исследование, прежде чем опубликовать этот вопрос. Но я все еще непросветлен. Позвольте мне показать вам, что я действительно обнаружил.
Тецуюки Кобаяши из Kyoto Microcomputer Co. объясняет на слайде 8 этого слайд-шоу в формате PDF , что adb состоит из трех частей: клиента, сервера и демона. Клиент и сервер работают на ПК. Демон работает на телефоне. На слайде 11 он объясняет, что все три части созданы из одного исходного каталога. (Это этот каталог .)
Я попытался найти в этом исходном каталоге словоreboot
и прочитать части services.cpp , но я до сих пор не смог понять, что adb reboot
на самом деле делает, какие байты он отправляет по сети или какой код запускает телефон, когда он получает эти байты. Я тоже не нашел ответа ни на один из своих вопросов.
Связанный : «Какой лучший способ перезагрузить Android через командную строку (удаленно)?»
Основываясь на platform/system/core
репозитории, на который вы ссылались выше, я думаю, что ключ находится в формате libcutils/android_reboot.c
. И важные определения находятся в include/cutils/android_reboot.h
; а именно:
/* Commands */
#define ANDROID_RB_RESTART 0xDEAD0001
#define ANDROID_RB_POWEROFF 0xDEAD0002
#define ANDROID_RB_RESTART2 0xDEAD0003
Обычно в обычном режиме перезагрузки (с помощью кнопки устройства и т. д.) процесс длится дольше, потому что (я предполагаю) он размонтирует раздел, убивает все приложения, закрывает все узлы fopen, как в процессе выключения. Это adb reboot
можно сравнить с командой перезагрузки Linux (откуда она исходит): она просто очищает диск и входит в перезагрузку без предварительного уничтожения процессов или размонтирования файловых систем. Я также вижу команду быстрого перемонтирования, которая переводит диск (в нашем случае часть системы хранения устройства) в режим ro перед перезагрузкой.
Я также считаю, что выпущенная команда kernel_restart()
встроена в ядро. См., например , http://www.phonesdevelopers.com/1730094/ . Также проверьте machine_restart
звонки.
adb reboot
каждый день, даже если это не приведет к полной процедуре отключения?adb shell su -c "svc power shutdown"
.Другие пользователи Stack Exchange уже ответили на этот вопрос в других сообщениях.
t0mm13b пишет , что при отображении анимации выключения вашего оператора:
- Android безопасно отключает жизненно важные части среды выполнения.
- ОС также сообщает о намерениях корректно закрыть приложения и службы. Они, в свою очередь, очищают свои кеши от всех данных и общих настроек, сохраняют все, что не нужно, в базу данных sqlite и так далее.
Другими словами, приложениям и службам предоставляется возможность систематически выполнять свою очистку.
[Такие команды, как
adb reboot
] жестче. Они фактически обходят механизмы безопасности для плавного отключения.
В другом месте Юрий предлагает другое объяснение того, что делает Android во время корректного завершения работы:
- Он закрывает ActivityManager. Я думаю, что закрытие ActivityManager означает, что все действия пройдут необходимый жизненный цикл и, таким образом, состояния действий будут сохранены. Но я не уверен. я не проверял.
- Затем Android отключает сотовый радиоинтерфейс.
- После этого он отключает Bluetooth.
- Наконец, он пытается закрыть MountService.
adb reboot
быстрее, потому что он пропускает некоторые или все вышеперечисленные действия.
Повелитель огня
setprop sys.powerctl reboot
, что сделал бы. Нечистое отключение с последующей инструкцией перезагрузиться обратно.