修改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