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

13

Я владею 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 через командную строку (удаленно)?»

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

Ответы:

7

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

user3344236
источник
1
+1. Большое спасибо! Безопасно ли для меня это делать adb rebootкаждый день, несмотря на то, что процедура полного выключения не выполняется?
незабываемыйПоддержкаMonica
Это не больно, но у вас может быть на то веская причина. Если вы действительно хотите очистить некоторые кэшированные данные, в любом случае есть и другие решения.
user3344236
Другие решения, такие как ...?
JohnyTex
2

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

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

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

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

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

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

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

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

незабываемых
источник