Почему «перезагрузка adb» выключает мой телефон намного быстрее, чем обычно, прежде чем он перезагрузится? Он пропускает важные шаги?

У меня есть Samsung Galaxy S Relay 4G под управлением Android 4.1.2. Также у меня на ПК установлен adb .

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

Когда я adb rebootвместо этого вхожу, телефон выключается намного быстрее: выключение занимает всего секунду или около того. Затем он перезагружается.

Мои вопросы:

  1. Почему adb rebootтак быстрее?

  2. Он просто пропускает анимацию выключения оператора мобильной связи или пропускает еще какие-то важные процедуры?

  3. Могу ли я использовать adb rebootкаждый раз, когда я хочу перезагрузить телефон, или в этом есть какой-то недостаток?

  4. (необязательно) Откуда вы знаете?


Дополнительная информация (вы можете пропустить это)

Я провел некоторое исследование, прежде чем опубликовать этот вопрос. Но я все еще непросветлен. Позвольте мне показать вам, что я действительно обнаружил.

Тецуюки Кобаяши из Kyoto Microcomputer Co. объясняет на слайде 8 этого слайд-шоу в формате PDF , что adb состоит из трех частей: клиента, сервера и демона. Клиент и сервер работают на ПК. Демон работает на телефоне. На слайде 11 он объясняет, что все три части созданы из одного исходного каталога. (Это этот каталог .)

Я попытался найти в этом исходном каталоге словоreboot и прочитать части services.cpp , но я до сих пор не смог понять, что adb rebootна самом деле делает, какие байты он отправляет по сети или какой код запускает телефон, когда он получает эти байты. Я тоже не нашел ответа ни на один из своих вопросов.


Связанный : «Какой лучший способ перезагрузить Android через командную строку (удаленно)?»

Очень похоже на то setprop sys.powerctl reboot, что сделал бы. Нечистое отключение с последующей инструкцией перезагрузиться обратно.

Ответы (2)

Основываясь на 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звонки.

+1. Большое спасибо! Безопасно ли мне делать это adb rebootкаждый день, даже если это не приведет к полной процедуре отключения?
Это не больно, но у вас может быть веская причина для этого. Если вы действительно хотите очистить некоторые кешированные данные, в любом случае есть другие решения.
Другие решения, такие как...?
@JohnyTex, если он вам все еще нужен, см.: android.stackexchange.com/a/138057/57668 . Мой любимый adb shell su -c "svc power shutdown".

Другие пользователи Stack Exchange уже ответили на этот вопрос в других сообщениях.

t0mm13b пишет , что при отображении анимации выключения вашего оператора:

  • Android безопасно отключает жизненно важные части среды выполнения.
  • ОС также сообщает о намерениях корректно закрыть приложения и службы. Они, в свою очередь, очищают свои кеши от всех данных и общих настроек, сохраняют все, что не нужно, в базу данных sqlite и так далее.

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

[Такие команды, как adb reboot] жестче. Они фактически обходят механизмы безопасности для плавного отключения.

В другом месте Юрий предлагает другое объяснение того, что делает Android во время корректного завершения работы:

  • Он закрывает ActivityManager. Я думаю, что закрытие ActivityManager означает, что все действия пройдут необходимый жизненный цикл и, таким образом, состояния действий будут сохранены. Но я не уверен. я не проверял.
  • Затем Android отключает сотовый радиоинтерфейс.
  • После этого он отключает Bluetooth.
  • Наконец, он пытается закрыть MountService.

adb rebootбыстрее, потому что он пропускает некоторые или все вышеперечисленные действия.