android9.0 系统默认时间跳变

android9.0 系统默认时间跳变

0. 前言

  最近修改客户问题的时候发现系统默认时间和ntp网络时间之间出现了一次时间的跳变,虽然不是什么大问题,但是可以跟进了解一下。

1. 问题分析

  如图,系统时间从8:00跳变到0:00
在这里插入图片描述
  通过分析代码,frameworks\base\services\java\com\android\server\SystemServer.java

    // The earliest supported time.  We pick one day into 1970, to
    // give any timezone code room without going into negative time.
    private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000;

    private void run() {
        try {
            android.os.Process.setThreadPriority(-19);
            traceBeginAndSlog("InitBeforeStartServices");
            // If a device's clock is before 1970 (before 0), a lot of
            // APIs crash dealing with negative numbers, notably
            // java.io.File#setLastModified, so instead we fake it and
            // hope that time from cell towers or NTP fixes it shortly.
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                Slog.w(TAG, "System clock is before 1970; setting to 1970.");
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
            }

            //
            // Default the timezone property to GMT if not set.
            //
            String timezoneProperty =  SystemProperties.get("persist.sys.timezone");
            if (timezoneProperty == null || timezoneProperty.isEmpty()) {
                Slog.w(TAG, "Timezone not set; setting to GMT.");
                SystemProperties.set("persist.sys.timezone", "GMT");
            }
            ......
	}

  此处判断的是否早于1970年,若早于1970年则设为1970年1月1日8:00,此处符合log预期,那就要继续追踪log查看系统时间被修改的位置。

  此时跟踪系统修改时间的函数setCurrentTimeMillis,加打印排查发现没有修改系统时间的地方,此时追踪setCurrentTimeMillis函数流程,发现会调用setKernelTime追查此函数发现一处可疑的地方,但是log中无打印,因此通过关键字抓打印

在这里插入图片描述
  此时看到关键元凶AlarmManager,追查源码:

frameworks\base\services\core\java\com\android\server\AlarmManagerService.java

    @Override
    public void onStart() {
        mNativeData = init();
        mNextWakeup = mNextNonWakeup = 0;

        // We have to set current TimeZone info to kernel
        // because kernel doesn't keep this after reboot
        setTimeZoneImpl(SystemProperties.get(TIMEZONE_PROPERTY));

        // Also sure that we're booting with a halfway sensible current time
        if (mNativeData != 0) {
            final long systemBuildTime = Environment.getRootDirectory().lastModified();
            if (System.currentTimeMillis() < systemBuildTime) {
                Slog.i(TAG, "Current time only " + System.currentTimeMillis()
                        + ", advancing to build time " + systemBuildTime);
                setKernelTime(mNativeData, systemBuildTime);
            }
        }

  此处对比当前系统时间和system 文件夹时间,发现系统时间早于文件夹时间,将系统时间设置为文件夹时间。

drwxr-xr-x 14 root root 4096 2009-01-01 00:00 system
-rw-r–r-- 1 root root 5272 2009-01-01 00:00 ueventd.rc
drwxr-xr-x 13 root root 4096 2009-01-01 00:00 vendor

OK,至此真相大白,因为不影响功能,暂时也没有修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ʚ兔子的先森ɞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值