恢复快照后,仿真的Android设备不会重新同步时间/日期

时间:2012-01-18 20:01:32

标签: android android-emulator

如果我在仿真设备上进行全新启动,它会从主机操作系统获得正确的当前时间;但是,如果我从快照重新加载设备,它将从创建快照的那一刻起获取时间/日期(例如,当我关闭模拟器时)。时间/日期在任何时间后都不会重新同步。我发现的唯一方法是从快照恢复后手动更新时间。

Android虚拟设备具有默认属性:

  • 目标= Android 4.0.3 - API等级15

  • CPU / ABI = ARM(armeabi-v7a)

  • SD卡= N / A

  • Snapshot = Enabled

  • 抽象LCD密度= 240

  • 最大VM应用程序堆大小= 48

  • 设备RAM大小= 512

我在OS X Snow Leopard和Windows 7上尝试过模拟器,两者都表现出同样的问题。有没有办法让模拟器在从快照恢复后自动同步时间?

5 个答案:

答案 0 :(得分:32)

我遇到了同样的问题,似乎没有一种标准的方法可以做到这一点。但是,可以使用ADB shell的date命令更新仿真器的日期和时间,该命令可以与标准命令一起使用,以在操作系统上显示日期和时间,以将仿真器日期和时间更新为当前日期和时间。

要设置模拟器的日期和时间,您需要在操作系统中执行以下命令:

adb shell date -s YYYYmmdd.HHMMSS

其中YYYYmmdd是日期,HHMMSS是时间。

的Linux

从UNIX样式的shell中将仿真器日期和时间设置为当前日期和时间相对简单,因此以下命令可在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 PowerShell:

adb shell date -s $(get-date -format yyyyMMdd.HHmmss)

在命令提示符中,它有点棘手,因为无法指定自定义格式来显示日期和时间。我发现以区域设置独立格式获取它的最佳方法是使用命令wmic os get LocalDateTime(第2行)。可以解析其日期时间格式以适应ADB shell所需的格式:符号:~可用于打印环境变量内容的子字符串,格式为%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。使用!代替%read the variable on-the-fly。这一切都在使用cmd选项启动的子/v进程中完成,该选项启用了即时变量读取。


编辑:修正了macOS命令(感谢@ user836003)。

答案 1 :(得分:3)

我打开了bug report

我遇到了同样的问题,并且发现了困难,因为我的应用程序使用SSL,一直给出非常奇怪的错误。这是由于错误的日期和时间。

显然还没有报道。

答案 2 :(得分:1)

我之前已经多次搜索过这个问题的解决方案,当我看到你的问题时我再次搜索但我找不到其他人甚至抱怨这个除了你和我,也许其他人不创建应用程序的时间是关键或他们在真实设备上进行测试。

结论:没有修复,您必须手动设置或不使用快照。

答案 3 :(得分:1)

在运行版本6 API 23 的较新Android模拟器上,以下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)

答案 4 :(得分:0)

投过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();
    }
}