Эмулированное Android-устройство не синхронизирует время и дату после восстановления моментального снимка
Если я делаю новую загрузку на эмулированном устройстве, он получает правильное текущее время от ОС хоста; однако, если я перезагружаю устройство из моментального снимка, он получает время/дату с момента создания моментального снимка (например, когда я закрываю эмулятор). Время/дата не синхронизируются через какое-то время. Единственный способ, который я нашел, - это вручную обновить время после восстановления из моментального снимка.
Виртуальное устройство Android имеет свойства по умолчанию:
-
Target = Android 4.0.3 - Уровень API 15
-
CPU/ABI = ARM (armeabi-v7a)
-
Карта SD = N/A
-
Снимок = Включено
-
Абстрактная плотность LCD = 240
-
Максимальный размер кучи VM = 48
-
Размер оперативной памяти = 512
Я пробовал эмулятор на OS X Snow Leopard и Windows 7, обе показывают ту же проблему. Есть ли способ заставить эмулятор автоматически синхронизировать время после восстановления из моментального снимка?
Ответы
Ответ 1
Я столкнулся с той же проблемой, и, кажется, нет стандартного способа сделать это. Однако дату и время эмулятора можно обновить с помощью команды date
оболочки ADB, которую можно использовать вместе со стандартными командами для отображения даты и времени в вашей ОС, чтобы обновить дату и время эмулятора до текущих даты и времени.
Чтобы установить дату и время эмулятора, вам нужно выполнить следующую команду в вашей ОС:
adb shell date -s YYYYmmdd.HHMMSS
где ГГГГммдд - дата, а ЧЧММСС - время.
Linux
Установка даты и времени эмулятора на текущую дату и время относительно проста из оболочки в стиле UNIX, поэтому следующая команда будет работать в Linux:
adb shell date -s 'date +"%Y%m%d.%H%M%S"'
Macos
adb -e shell su root date 'date +"%m%d%H%M%y"'
Windows
В Windows (которую я использую) самый простой способ сделать это через Windows PowerShell:
adb shell date -s $(get-date -format yyyyMMdd.HHmmss)
В командной строке это немного сложнее, потому что нет способа указать пользовательский формат для отображения даты и времени. Лучший способ найти его в независимом от локали формате - использовать команду wmic os get LocalDateTime
(строка 2). Его формат даты и времени может быть проанализирован для адаптации к формату, необходимому оболочке ADB: символы :~
могут использоваться для печати подстроки содержимого переменной среды в формате %var:~<start-index>,<number-of-chars>%
. Мы также должны игнорировать все, кроме строки 2, поэтому полная команда, которую вам нужно запустить, выглядит следующим образом:
for /f "skip=1 delims=" %A in ('wmic os get localDateTime') do @for /f "delims=" %B in ("%A") do @cmd /v /c "set wmicdate=%B & adb shell date -s !wmicdate:~0,8!.!wmicdate:~8,6!"
Для любопытных: это сначала сохраняет дату-время в переменную %wmicdate%
а затем передает ее в ADB, анализируя ее соответствующим образом. !
используются вместо %
для чтения переменной на лету. Все это делается в дочернем процессе cmd
запущенном с параметром /v
который позволяет читать переменные "на лету".
РЕДАКТИРОВАТЬ: Исправлена команда для MacOS (спасибо @user836003).
Ответ 2
Я открыл отчет об ошибке .
У меня такие же проблемы, и я нашел трудный путь, потому что мое приложение, использующее SSL, продолжало давать очень странные ошибки. Это произошло из-за неправильной даты и времени.
По-видимому, он еще не сообщил.
Ответ 3
Я искал много раз для решения этого вопроса, и я снова искал, когда видел ваш вопрос, но я не мог найти кого-либо еще, даже жалующегося на это, кроме вас и меня, возможно, другие не создают приложения, критические или они проверяются на реальном устройстве.
Заключение: нет исправления, вы должны установить его вручную или не использовать моментальные снимки.
Ответ 4
В новом эмуляторе Android, работающем под версией 6 API 23, для меня работала следующая команда powershell.
Windows Powershell
adb shell date $(get-date -format MMddHHmmyyyy.ss)
В Android-эмуляторе версии 7 API 24:
adb shell su root date $(get-date -format MMddHHmmyyyy.ss)
Ответ 5
Проголосовал Артон ответить.
Кажется, что эмулятор освобождается, чтобы синхронизировать, когда хост-машина получает сон.
Я лично использую следующую программу для этого.
public class AdbShellDateNow {
public static void main(final String[] args)
throws java.io.IOException, InterruptedException {
final long now = System.currentTimeMillis() / 1000L;
final ProcessBuilder builder =
new ProcessBuilder("adb", "shell", "date", Long.toString(now));
builder.redirectErrorStream(true);
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
final Process process = builder.start();
process.waitFor();
}
}