Android AlarmManagerService-设置系统时间无效的问题

news/2024/11/25 2:43:37/

现象


使用系统接口设置时间生效,查看rtc也设置成功。但是重启后时间为首次开机的时间.

分析


多次测试后发现,设置时间在第一次开机时系统显示的时间之后,重启后时间设置生效;设置在之前,则会还原成第一次系统开机时显示的时间。

所以怀疑时,系统在开机的时候做了时间有效检测.查看AlarmManagerService.java后发现系统会用当前时间和编译固件的时间做对比,如果早于编译时间则使用编译时间为当前时间。

frameworks/base/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java

@Overridepublic void onStart() {mInjector.init();mMetricsHelper = new MetricsHelper(getContext(), mLock);mListenerDeathRecipient = new IBinder.DeathRecipient() {@Overridepublic void binderDied() {}@Overridepublic void binderDied(IBinder who) {final IAlarmListener listener = IAlarmListener.Stub.asInterface(who);removeImpl(null, listener);}};synchronized (mLock) {mHandler = new AlarmHandler();mConstants = new Constants();mAlarmStore = mConstants.LAZY_BATCHING ? new LazyAlarmStore(): new BatchingAlarmStore();mAlarmStore.setAlarmClockRemovalListener(mAlarmClockUpdater);mAppWakeupHistory = new AppWakeupHistory(Constants.DEFAULT_APP_STANDBY_WINDOW);mAllowWhileIdleHistory = new AppWakeupHistory(INTERVAL_HOUR);mAllowWhileIdleCompatHistory = new AppWakeupHistory(INTERVAL_HOUR);mNextWakeup = mNextNonWakeup = 0;// We have to set current TimeZone info to kernel// because kernel doesn't keep this after rebootsetTimeZoneImpl(SystemProperties.get(TIMEZONE_PROPERTY));// Ensure that we're booting with a halfway sensible current time.  Use the// most recent of Build.TIME, the root file system's timestamp, and the// value of the ro.build.date.utc system property (which is in seconds).final long systemBuildTime = Long.max(1000L * SystemProperties.getLong("ro.build.date.utc", -1L),Long.max(Environment.getRootDirectory().lastModified(), Build.TIME));if (mInjector.getCurrentTimeMillis() < systemBuildTime) {Slog.i(TAG, "Current time only " + mInjector.getCurrentTimeMillis()+ ", advancing to build time " + systemBuildTime);mInjector.setKernelTime(systemBuildTime);}mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);......}

解决办法

屏蔽此处的时间检验即可或者向客户说明情况

    if (mInjector.getCurrentTimeMillis() < systemBuildTime) {Slog.i(TAG, "Current time only " + mInjector.getCurrentTimeMillis()+ ", advancing to build time " + systemBuildTime);mInjector.setKernelTime(systemBuildTime);}

http://www.ppmy.cn/news/1001351.html

相关文章

Shell脚本学习-MySQL单实例和多实例启动脚本

已知MySQL多实例启动命令为&#xff1a; mysqld_safe --defaults-file/data/3306/my.cnf & 停止命令为&#xff1a; mysqladmin -uroot -pchang123 -S /data/3306/mysql.sock shutdown 请完成mysql多实例的启动脚本的编写&#xff1a; 问题分析&#xff1a; 要想写出脚…

Unity实现物体上下漂浮旋转效果

效果展示 代码&#xff08;直接挂载在物体上就可以了&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;public class FloatingObject : MonoBehaviour {public float amplitude 0.5f; // 上下移动的幅度public float frequency …

windows上给oracle打补丁注意事项

打补丁的过程 1、升级opatch工具&#xff0c;检查剩余空间用于存放ORACLE_HOME的备份&#xff0c;设置oracle_home环境变量,通过readme中的先决条件来检查现有补丁是否和本次补丁冲突 2、opatch apply 升级数据库软件&#xff0c;这个必须数据库文件不要被进程调用 在windows上…

java+springboot+mysql个人日记管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的个人日记管理系统&#xff0c;系统包含超级管理员、管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff1b;反馈管理&#xff1b;系统公告&#xff1b;个人…

windows下mysql的下载与安装

文章目录 1 下载2 安装目录下新建data文件夹和my.ini3 安装4设置密码与远程连接5 配置环境变量6 navicate连接成功 1 下载 官网地址 https://www.mysql.com/点击下载 社区下载 社区服务 选择版本下载 2 安装目录下新建data文件夹和my.ini my.ini 内容如下 [mysql] # 设置my…

【Android】使用 CameraX 实现基础图像分析功能

1. 基础开发环境 JDK&#xff1a;JDK17 Android Studio&#xff1a;Android Studio Giraffe | 2022.3.1 Android SDK&#xff1a;Android API 34 Gradle: gradle-8.0-bin.zip CameraX Version: 1.1.0-alpha05 2. 添加相关依赖 在 build.gradle 中添加 CameraX 的相关依赖 // *…

如何优雅的使用后端接口

优雅的后端接口 一个后端接口大致分为四个部分:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响 应数据(response)。 一、URL & Method Rest 设计风格 ===》 Restful API 简单理解: URI 是用来唯一标志一个互联网资源;Method 是用来标识当前请求对该…

快速部署外卖系统:利用现代工具简化开发流程

在竞争激烈的外卖市场中&#xff0c;快速部署高效稳定的外卖系统是餐饮企业成功的关键之一。本文将介绍如何利用现代工具简化外卖系统的开发流程&#xff0c;并附带代码示例&#xff0c;帮助开发者快速搭建功能完备、用户友好的外卖平台。 1. 简介 在外卖业务快速增长的背景…