一. 问题:最近项目出现未联网的机器默认时间从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. 修改文件夹权限
  3. Android实现自定义的 时间日期 控件
  4. android粗略获得程序运行时间的方法
  5. android 开发 时间选择器TimePicker的使用
  6. Android如何获取APP启动时间

随机推荐

  1. android.util.Log常用的方法
  2. 在Android的Notification中显示进度条
  3. JS判断浏览器打开终端
  4. Android(安卓)IPC 机制【2】--- Messenge
  5. Android(安卓)获取当前语言的方法1
  6. android常用网址
  7. android 多张图片动画方式轮播(转载)
  8. androidannotations gradle Android(安卓
  9. GridView 实现水平拖拉效果
  10. Android应用程序获取ROOT权限的方法(andr