Android1 设置系统时间遇到的问题

问题

平台:RK3566
系统:Android11
问题:android11 系统时间一定要大于编译的时间才能有效,否者重启后,系统时间会自动变成编译时间。

现象

在内核加载的时候,可以看到硬件 RTC驱动打印的信息,证明驱动是已经成功加载上的了

[    1.667105] rtc-pcf8563 5-0051: rtc core: registered rtc-pcf8563 as rtc0
[    1.668300] rtc-pcf8563 5-0051: pcf8563_get_datetime: raw data is st1`=08, st2=00, sec=34, min=14, hr=20, mday=12, wday=31, mon=26, year=23
[    1.668316] rtc-pcf8563 5-0051: pcf8563_get_datetime: tm is secs=34, mins=14, hours=20, mday=12, mon=5, year=123, wday=1
[    1.668345] rtc-pcf8563 5-0051: setting system clock to 2023-06-12 20:14:34 UTC (1686600874)

通过在android系统的界面上设置时间我发现了个问题,如果往后设置时间就会出现重启后,时间不是上次设置的时间。
经过反复验证,发现如果时间设置有问题,系统时间就会变成编译时候时间点。如果把设置的时间点大于编译时间,重启后就是刚才设置的时间。

结论

Android 11 系统中确实有一个机制,会比较系统时间和编译时间的大小,如果系统时间小于等于编译时间,系统会将时间自动设置为编译时间。这个机制是为了避免一些时间相关的问题,例如应用程序的过期问题、证书验证问题等等。
不过需要注意的是,这个机制针对的是系统级别的时间,而不是应用程序级别的时间。即使系统时间被设置为编译时间,应用程序仍然可以通过系统提供的 API 获取当前的真实时间。

文件路径:android源码\frameworks\base\services\core\java\com\android\server\AlarmManagerService.java

final long systemBuildTime =  Long.max(
                    1000L * SystemProperties.getLong("ro.build.date.utc", -1L),
                    Long.max(Environment.getRootDirectory().lastModified(), Build.TIME));
            if (mInjector.getCurrentTimeMillis() < systemBuildTime) {
                Slog.i(TAG, "Current time only " + mInjector.getCurrentTimeMillis()
                        + ", advancing to build time " + systemBuildTime);
                mInjector.setKernelTime(systemBuildTime);
            }

你可能感兴趣的:(android)