Подтвердить что ты не робот

Эмулированное 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, обе показывают ту же проблему. Есть ли способ заставить эмулятор автоматически синхронизировать время после восстановления из моментального снимка?

4b9b3361

Ответ 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();
    }
}