Синхронизированы ли часы эмулятора с реальными системными часами? - PullRequest
1 голос
/ 25 апреля 2011

Я работаю над приложением, в котором запущен поток в реальном времени.

Мой компьютер работает медленно, и эмулятор работает на нем очень медленно.Когда я тестирую свое приложение, создается впечатление, что вызов SystemClock.uptimeMillis() возвращает значения в реальном времени от фактических часов компьютера, а это означает, что время в эмуляторе не работает медленно, даже если эмулятор работает.

Это предположение правильно?Что часы эмулятора привязаны к реальным системным часам компьютера (в отличие от того, чтобы самим эмулироваться и подвергаться колебаниям в зависимости от загрузки процессора хост-компьютера)?Кажется очевидным вопросом, но я не смог найти его в интернете.

Это имело бы смысл, если бы это было так.Мне нужно знать наверняка, потому что мне нужно знать, является ли мой поток неспособным поддерживать это просто признак медленной работы эмулятора или мне действительно нужно что-то изменить.(Не могу проверить на реальном телефоне, потому что у меня его еще нет).

1 Ответ

2 голосов
/ 26 апреля 2011

Я считаю, что определила, что моя догадка верна.

Я провел несколько простых тестов, например:

long start = SystemClock.uptimeMillis();
Log.d("blah", "start");
while (SystemClock.uptimeMillis() < start + 10000)
{
    // do some work-intensive stuff here
}
Log.d("blah", "finish");

... независимо от того, что я сделал за прошедшие 10 секунд (внутри цикла кода и / или намеренно используя мой компьютер для выполнения других операций по загрузке ЦП), поток всегда сообщает ровно через 10 секунд после своего запуска (+ 10 мс, я полагаю, что это накладные расходы, судя по меткам времени LogCat и секундомеру, который говорит мне, что загруженный центральный процессор вообще не расширяет ощущение времени в эмуляторе, как и следовало ожидать.

Чтобы изменить это поведение, я считаю, что я хочу передать опцию слою QEMU:

$ emulator -avd my_avd -qemu -clock vm

Но на самом деле это может быть связано с установкой времени при запуске виртуальной машины (что, очевидно, делает QEMU независимо от управления результатами currentTimeMillis (), uptimeMillis () и nanoTime ()). Не уверен (документация для QEMU довольно грубая.) Несмотря на это, в Android QEMU, похоже, отсутствуют часы "vm", поэтому вышеописанное не работает. Примечание:

$ emulator -avd my_avd -qemu -clock ?
Available alarm timers, in order of precedence:
unix

Но, по крайней мере, я собрал достаточно доказательств, чтобы заподозрить, что моя маленькая теория верна. :-) Я не вижу, как эмулированные приложения могут воспроизводить аудио или выполнять эффекты перехода пользовательского интерфейса или тому подобное без ссылки на реальные часы, поэтому это имеет смысл. Но было бы неплохо иметь возможность эмулировать часы.

...