Эмулированное устройство Android не выполняет повторную синхронизацию даты и времени после восстановления снимка - PullRequest
22 голосов
/ 19 января 2012

Если я делаю новую загрузку на эмулируемом устройстве, оно получает правильное текущее время от хост-ОС; однако, если я перезагружаю устройство из снимка, оно получает время / дату с момента создания снимка (например, когда я выключаю эмулятор). Время / дата не синхронизируются через какое-то время. Единственный способ обойти это - вручную обновить время после восстановления из снимка.

Виртуальное устройство Android имеет свойства по умолчанию:

  • Цель = Android 4.0.3 - Уровень API 15

  • CPU / ABI = ARM (armeabi-v7a)

  • SD-карта = N / A

  • Снимок = Включено

  • Абстрактная плотность ЖКД = 240

  • Макс. Размер кучи приложения VM = 48

  • Объем оперативной памяти устройства = 512

Я пробовал эмулятор на OS X Snow Leopard и Windows 7, обе показывают ту же проблему. Есть ли способ заставить эмулятор автоматически синхронизировать время после восстановления из снимка?

Ответы [ 5 ]

32 голосов
/ 30 апреля 2012

Я столкнулся с той же проблемой, и, кажется, нет стандартного способа сделать это. Однако дату и время эмулятора можно обновить с помощью команды 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, которая позволяет читать данные на лету.


EDIT : исправлена ​​команда для macOS (спасибо @ user836003).

3 голосов
/ 07 января 2013

Я открыл отчет об ошибке .

У меня такие же проблемы, и я нашел трудный путь, потому что мое приложение, использующее SSL, продолжало выдавать очень странные ошибки. Это было связано с неправильной датой и временем.

По-видимому, пока не сообщается.

1 голос
/ 21 декабря 2016

В более новом эмуляторе Android, работающем с API версии 6 23 , у меня работала следующая команда powershell.

Windows Powershell

adb shell date $(get-date -format MMddHHmmyyyy.ss)

В эмуляторе Android API версии 7 24 :

adb shell su root date $(get-date -format MMddHHmmyyyy.ss)

1 голос
/ 19 января 2012

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

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

0 голосов
/ 27 августа 2013

Проголосовал ответ Arthon.

Кажется, что эмулятор теряет синхронизацию, когда хост-машина засыпает.

Я лично использую следующую программу для этого.*

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...