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
相关产品推荐
相关产品推荐

