一. 问题:最近项目出现未联网的机器默认时间从2009-01-01 00:00 开始计时,桌面显示2009-01-01 03:00,需求是2019-01-01 8:00 开始计时

二.问题分析:

1. 通过分析代码,frameworks\base\services\java\com\android\server\SystemServer.java 

  private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000;

 private void run()中

// 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);
        }

        // Here we go!
        Slog.i(TAG, "Entered the Android system server!");
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis());

此处判断的是1970年

2. 抓取log:

01-01 08:04:37.768  3524  3524 D SystemServerTiming: StartConsumerIrService took to complete: 3ms
01-01 08:04:37.769  3524  3524 I SystemServer: StartAlarmManagerService
01-01 08:04:37.769  3524  3524 I SystemServiceManager: Starting com.android.server.AlarmManagerService
01-01 08:04:37.773  3524  3524 I AlarmManager: Current time only 277773, advancing to build time 1230739200000
01-01 00:00:00.008  3524  3524 D SystemServerTiming: StartAlarmManagerService took to complete: 13ms
01-01 00:00:00.008  3524  3524 I SystemServer: InitWatchdog
01-01 00:00:00.009  3524  3524 D SystemServerTiming: InitWatchdog took to complete: 0ms
01-01 00:00:00.009  3524  3524 I SystemServer: StartInputManagerService
01-01 00:00:00.010  3524  3524 I InputManager: Initializing input manager, mUseDevInputEventForAudioJack=false
01-01 00:00:00.011  3524  3524 D SystemServerTiming: StartInputManagerService took to complete: 2ms
01-01 00:00:00.011  3524  3524 I SystemServer: StartWindowManagerService

追查源码:frameworks\base\services\core\java\com\android\server\AlarmManagerService.java

发现以下设置,对比当前系统时间和system 文件夹时间

// 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);
            }
        }

发现系统时间早于文件夹时间,将系统时间设置为文件夹时间

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

三.解决方案:

修改默认时间

方法1, 在原有的时间设置 frameworks\base\services\java\com\android\server\SystemServer.java

if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
            Slog.w(TAG, "System clock is before 1970; setting to 1970.");
            SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
        }

设置:EARLIEST_SUPPORTED_TIME=1546300800000L,发现不起作用,需要在以下代码出设置:

private static final long EARLIEST_SUPPORTED_TIME_DH= 1546300800000L;

// Start services.
        try {
            traceBeginAndSlog("StartServices");
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
            //begin 201901010800
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME_DH) {
                Slog.w(TAG, "Start services System clock is before 201901010800; setting to 201901010800.");
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME_HR);
            }
            //end
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }

方法二 frameworks\base\services\core\java\com\android\server\AlarmManagerService.java

private static final long DEFAULT_SUPPORTED_TIME_DH= 1546300800000L;

public void onStart() 方法中:

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

//begin 201901010800

if (mNativeData != 0) {

  if (System.currentTimeMillis() < DEFAULT_SUPPORTED_TIME_DH) {
                Slog.i(TAG, "Current time only " + System.currentTimeMillis()
                        + ", advancing to time " + DEFAULT_SUPPORTED_TIME_DH);
                setKernelTime(mNativeData, DEFAULT_SUPPORTED_TIME_DH);
            }

}

 

//end 201901010800

        // 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);
            }
        }

更多相关文章

  1. Android(安卓)双屏异显
  2. Android(安卓)办公自动化(Office Automation)
  3. Android之系统自带的文字外观设置及实际显示效果图 android:text
  4. android image 压缩和解压 unyaffs与mkyaffs2image
  5. Android中EditText属性
  6. Android(安卓)SearchView详细使用
  7. Android(安卓)各种音量的获取和设置
  8. View类xml属性、方法
  9. Android打开系统设置界面

随机推荐

  1. android的互联网开发 上
  2. Android的用GreenDao操作数据库
  3. Android中关于数据库SQLite的insert插入
  4. Android(安卓)异步获取网络图片Bitmap资
  5. GitHub 上受欢迎的 Android(安卓)UI Libr
  6. ListView的两种使用方法1.继承ListActivi
  7. Android(安卓)系统app集成Bugly收集错误
  8. BLCR 基本环境搭建
  9. android显示意图激活另一个Activity
  10. Android(安卓)Studio下添加assets目录