You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 7.1.2设置系统时间重启后不生效问题求助

Android 7.1.2系统时间设置重启后不持久的问题

问题现象

调用toybox date(或date)命令修改系统时间的逻辑在Android 8.1/9上可正常生效,重启后时间保持修改后的状态;但在Android 7.1.2设备上,重启后系统时间会恢复到修改前的状态。

复现步骤

  • 执行下方修改系统时间的代码片段(传入时间需与当前系统时间不同)
  • 重启设备
  • 查看系统时间,发现已恢复至修改前的时间

测试情况

  • Android 7.1.2:两台不同设备均出现设置的时间重启后不持久的问题
  • Android 8.1和9:设置的时间重启后可正常保留

相关代码

修改系统时间的函数

public static void changeSystemTime(String year, String month, String day, String hour, String minute, String second) {
    Process process = null;
    try {
        String command = "su 0 toybox date " + month + day + hour + minute + year + '.' + second + '\n';
        process = Runtime.getRuntime().exec(command);
        process.waitFor();
    } catch (Exception e) {
        MyLogger.add(Level.SEVERE, "UsefulTools, changeSystemTime: " + MyLogger.generateLogMessage(e));
    } finally {
        if (process != null)
            process.destroy();
    }
}

AndroidManifest.xml权限配置

<uses-permission android:name="android.permission.SET_TIME"
    android:protectionLevel="signature|system"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.SET_TIME_ZONE"
    android:protectionLevel="signature|system"
    tools:ignore="ProtectedPermissions" />

问题原因分析

Android 7.1.2及更早版本中,直接通过date或toybox date命令修改时间仅临时修改了系统运行时的时间,并未将修改后的时间同步到**硬件时钟(RTC)**中。而Android 8.0之后的系统,date命令内部已自动处理同步RTC的逻辑,因此重启后时间能保持修改后的状态。

硬件时钟是设备断电后仍能持续计时的硬件模块,系统启动时会优先读取RTC存储的时间初始化系统时间,若修改系统时间后未同步到RTC,重启后就会恢复到RTC之前存储的时间。

解决方案

要让时间设置持久化,在Android 7.1.2中需在修改系统时间后额外执行同步RTC的操作,或直接使用系统API修改时间:

方案1:添加同步RTC的shell命令

修改changeSystemTime函数,在设置系统时间后增加同步RTC的命令:

public static void changeSystemTime(String year, String month, String day, String hour, String minute, String second) {
    Process process = null;
    try {
        // 修改系统时间
        String dateCommand = "su 0 toybox date " + month + day + hour + minute + year + '.' + second + '\n';
        process = Runtime.getRuntime().exec(dateCommand);
        process.waitFor();
        
        // 同步系统时间到硬件RTC
        String syncCommand = "su 0 hwclock -w\n";
        process = Runtime.getRuntime().exec(syncCommand);
        process.waitFor();
    } catch (Exception e) {
        MyLogger.add(Level.SEVERE, "UsefulTools, changeSystemTime: " + MyLogger.generateLogMessage(e));
    } finally {
        if (process != null)
            process.destroy();
    }
}

方案2:使用系统API修改时间(推荐)

避免直接调用shell命令,使用Android系统提供的SystemClock.setCurrentTimeMillis()API,该API在Android 7.1.2及更高版本中会自动同步到RTC,前提是应用拥有SET_TIME权限且为系统签名应用:

public static void changeSystemTime(String year, String month, String day, String hour, String minute, String second) {
    try {
        // 将时间字符串转换为时间戳
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss.SSS", Locale.getDefault());
        String timeStr = year + month + day + hour + minute + second + ".000";
        Date date = sdf.parse(timeStr);
        long timestamp = date.getTime();
        
        // 使用系统API设置时间
        SystemClock.setCurrentTimeMillis(timestamp);
    } catch (Exception e) {
        MyLogger.add(Level.SEVERE, "UsefulTools, changeSystemTime: " + MyLogger.generateLogMessage(e));
    }
}

注意:使用SystemClock.setCurrentTimeMillis()需要应用具备系统签名或被放置在/system/app目录下,同时已声明SET_TIME权限。


内容的提问来源于stack exchange,提问作者Oriol Roma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:05:20