修改Android系统时间为默认编译时间

修改Android系统时间为默认编译时间

为了修改android的默认时间。 在网上查询一些资料,发现有介绍在SystemServer.java 里修改的。 但发现在此处修改,并没有达到预期效果,经查询在AlarmManagerService.java 中设置系统的默认时间更为妥当。
下面是Android 8.1 中
frameworks/base/services/core/java/com/android/server/AlarmManagerService.java
的代码块。其中setKernelTime 即为设置系统的时间。

    @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会取当前时间与system分区文件夹的时间进行比较。 如果时间小于文件夹时间,那么就会改成文件夹时间。
因为我们的目的是要将系统默认时间从1970修改到较近的一个时间。
为保证原先的逻辑。
增加一个逻辑,使时间为编译时间。
我们这里修改代码如下

    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) {
            long systemBuildTime = Environment.getRootDirectory().lastModified();
            String CurrentTimeMillis =  SystemProperties.get("ro.build.date.utc");
            
            long defaultBuildTime = Long.parseLong(CurrentTimeMillis) * 1000;
            Slog.i(TAG, "systemBuildTime  " + systemBuildTime + "defaultBuildTime  " + defaultBuildTime);
            if (systemBuildTime < defaultBuildTime)
            {
                systemBuildTime = defaultBuildTime;
                Slog.i(TAG, "Correct build time to  " + systemBuildTime);
            }
            if (System.currentTimeMillis() < systemBuildTime) {
                Slog.i(TAG, "Current time only " + System.currentTimeMillis()
                        + ", advancing to build time " + systemBuildTime);
                setKernelTime(mNativeData, systemBuildTime);
            }
        }
        ......
   }

date 命令使用

为方便使用,附上date 命令的简单使用方式

Linux命令转换时间戳,如下:


$ date +%s --date 19700101 --utc   // 1970-01-01 00:00 UTC
0
$ date +%s --date 20120101 --utc   // 2012-01-01 00:00 UTC
1325376000
$ date +%s --date 20160101 --utc   // 2016-01-01 00:00 UTC
1451606400

UNIX时间戳转换为具体日期

$ date --date=@86400 --utc 
1970年 01月 02日 星期五 00:00:00 UTC
$ date --date=@1451606400 --utc
2016年 01月 01日 星期五 00:00:00 UTC
$ date --date=@1451606400
2016年 01月 01日 星期五 08:00:00 CST

你可能感兴趣的:(Android)