Який найкращий спосіб перезапустити Android за допомогою командного рядка (віддалено)?


29

Я шукаю найкращий / дружелюбний спосіб перезавантажити свій укорінений пристрій Android 4.1.1. Я знайшов ці рішення поки:

  • su -c "reboot" - Викликає проблеми з wifi після перезавантаження на моєму пристрої ... Я читав, що це може спричинити порушення файлової системи в деяких випадках ... Не працює через ssh для мене.
  • toolbox reboot - Тут же стосується, але працює через ssh.
  • reboot -d 8 -f - викликає проблеми після перезавантаження, наприклад, деякі програми не запускаються
  • busybox killall system_server - "Гаряча перезавантаження" (насправді не перезапуск системи)
  • start|stop - Запускає / зупиняє Android Runtime (насправді не перезапускає систему)

Що саме робить пристрій, коли я натискаю кнопку (апаратне) живлення? Я думаю, що це найдружніший спосіб.


su -c "reboot"запускає rebootкоманду, яка визначена в reboot.c. reboot.cне змінилося багато років. Він завжди викликав sync (), а потім перезавантажував пристрій. Також завдяки цьому зобов’язанням сучасні версії reboot.cтакож демонтують усі файлові системи. Android 4.1.1 включає в себе зобов’язання, про яке я згадав, і тому я не бачу, як su -c "reboot"на Android 4.1.1 може колись призвести до пошкодження файлової системи.
незабутнійід

Шановний Есі: Пізня відповідь Firelord ( su -c 'am start -a android.intent.action.REBOOT') працює для мене на Android 4.1.2, і мені здається найкращою з існуючих відповідей. Якщо це працює для вас на Android 4.1.1 або ви занадто зайняті, щоб спробувати, натисніть зелену галочку, щоб змусити її плисти вгорі розділу відповідей.
незабутнійід

Відповіді:


13

Просто, справді:

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

Іншими словами, додаткам та службам надається можливість систематично проводити очищення.

Команди, які ви спробували, суворіші. Вони фактично обходять безпечні механізми для витонченого відключення.

Android сам по собі не є Linux, в сенсі звичайної настільної версії Linux, де ці команди можуть бути видані для вимкнення середовища Linux.

Можливо, можливо створити такий скрипт для обгортки:

#!/system/bin/sh
am broadcast android.intent.action.ACTION_SHUTDOWN
sleep 5
reboot

Ви можете зберегти це як safe_shutdown.shз дозволами 0755. Ваш пробіг може змінюватися, залежно від телефонів та ПЗУ - тому жодних гарантій там немає.


дякую за це пояснення! чи можна це робити віддалено, наприклад, через ssh (не adb)?
acy

4
Я думаю, він хоче знати, як він може імітувати відключення кнопки за допомогою команди.
Потік

якщо це найдружніший / найбезпечніший / найкращий спосіб вимкнути пристрій, то так: :)
acy

@Flow adb reboot? Я не впевнений, чи це безпечно!?! Можливо сценарій обгортки навколо нього, щоб надіслати трансляцію, ACTION_SHUTDOWNа потім зателефонувати adb reboot?
t0mm13b

Не впевнений, що радіомовлення ACTION_SHUTDOWNбуде робити те, що ви хочете: "Програми зазвичай не потребують цього, оскільки активність переднього плану також буде призупинена". Тому здається, що більшість програм не справляється з цим. Чи достатня призупинення діяльності?
Метью читайте

12

Що саме робить пристрій, коли я натискаю кнопку (апаратне) живлення? Я думаю, що це найдружніший спосіб.

Ви можете побачити діалогове вікно з можливістю вимкнути пристрій (акція Android не пропонує перезавантаження). Здається, що ShutdownActivity викликається, коли ви довго натискаєте кнопку живлення.

Так чи інакше, ви можете спробувати, віддалено або локально, але лише з кореневим доступом:

su -c 'am start -a android.intent.action.REBOOT'

Це зробить витончене відключення з подальшим перезавантаженням. Я шукав наміри, коли помітив це тут .

Метод випробування на Android 4.2.1, 5.0.2 та 6.0.1 , і повинні працювати на Android 4.1.1 , а також

Оновлення

Тестовано на Android Android 5.0 та 6.0.1:

su -c 'svc power reboot'

Відповідно до вихідного коду тут , KitKat будує також повинен підтримувати команду.


1
Саме те, що мені було потрібно. Я все ще дивно, що він говорить "Вимкнення живлення ...", коли є значення для тексту перезавантаження.
Сирени

10
killall zygote

Це вб'є кореневий zygoteпроцес і призведе до оновлення системи Android.

Це не перезавантажує апаратне забезпечення вашого телефону, а лише обробляє Android.

За замовчуванням (в Linux) команди kill/ / killallдають процесам витончений спосіб вимкнутись, хоча від реалізації зиготи залежить, чи це в свою чергу витончено вимкне ваші запущені програми Android.

Примітка. Ви повинні запустити це як root, незалежно від того, використовуєте ви su -c, підключення через SSH або ADB або інший метод.

Інші назви для цієї дії:

  • м'яке перезавантаження
  • гаряча перезавантаження

Я помітив на деяких пристроях, після цієї команди Wi-Fi не підключиться належним чином (тому мені доведеться відключити Wi-Fi, почекати хвилину, а потім знову ввімкнути Wi-Fi).
palswim

2
Для читачів: У Lollipop стандартний спосіб перезапустити рамки Android am restart. Для цього потрібен кореневий доступ.
Firelord

Чи killall zygoteдає процесам витончений спосіб закриття? Цікаве запитання. Комусь доведеться подивитися на zygoteвихідний код, щоб знати.
незабутнійід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.