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