修改Android系统默认时间

本文详细介绍了在Android系统中如何修改默认时间,通过调整SystemServer.java中的EARLIEST_SUPPORTED_TIME变量来设置时间,以及如何将时间转换为UNIX时间戳。同时,提供了Linux命令行下时间戳与日期相互转换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 : 修改Android系统默认时间

源码路径:frameworks/base/services/java/com/android/server/SystemServer.java
主要变量EARLIEST_SUPPORTED_TIME

    // The earliest supported time.  We pick one day into 1970, to
    // give any timezone code room without going into negative time.
    private static final long EARLIEST_SUPPORTED_TIME = 1514764800000L;//20180101 00:00:00
  •  

通过SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME)设置系统时间,只需要修改EARLIEST_SUPPORTED_TIME变量的值。

    private void run() {
        try {
            traceBeginAndSlog("InitBeforeStartServices");
            // If a device's clock is before 1970 (before 0), a lot of
            // APIs crash dealing with negative numbers, notably
            // java.io.File#setLastModified, so instead we fake it and
            // hope that time from cell towers or NTP fixes it shortly.
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                Slog.w(TAG, "System clock is before 1970; setting to 1970.");
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
            }
  •  

设置系统默认时间这段代码请放在startOtherServices()之后,否则无效(不同的平台代码略有差别,可以自己评价该放在什么位置)。

        // Start services.
        try {
            traceBeginAndSlog("StartServices");
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
            //add by jasun@180730 for default time start
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                Slog.w(TAG, "System clock is before 2018.; setting to 2018.");
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
            }
            //add by jasun@180730 for default time end
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }
  •  

二 : 时间转换为UNIX时间戳

EARLIEST_SUPPORTED_TIME变量值如何获取?
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 // Android默认EARLIEST_SUPPORTED_TIME值为86400×1000
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

--------------------- 作者:一莫言一 来源:优快云 原文:https://blog.youkuaiyun.com/ljx646566715/article/details/81189914?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

<think>嗯,用户想修改Android系统默认屏幕超时时间。首先,我需要回顾之前的问题和回答,确保一致性。之前提到过SCREEN_OFF_TIMEOUT的默认值是15秒,但代码里设置的是0,可能用户需要具体的修改步骤。用户现在提供了新的引用,比如引用[1]中的ScreenTimeoutSettings.java和screen_timeout_settings.xml,这可能涉及到设置应用的界面部分。引用[3]提到了PowerManagerService,可能需要修改系统服务来阻止休眠。引用[4]中的defaults.xml文件里设置了def_screen_off_timeout为2147483647,也就是永不超时,这可能是一个系统级别的默认配置。用户的需求是修改默认的屏幕超时时间,可能需要从应用层和系统层两方面考虑。应用层的话,可以通过Settings.System.putInt来修改,但可能需要系统权限。系统级的话,可能需要修改frameworks中的资源文件,比如defaults.xml,或者PowerManagerService的相关方法。 之前的回答里提到过,SCREEN_OFF_TIMEOUT的默认值通常是15秒,但代码中的默认参数是0。用户可能需要知道如何通过代码或者系统配置来改变这个值。另外,用户可能遇到权限问题,比如需要系统签名或者root权限才能修改系统设置。还要注意不同Android版本的差异,比如LOCK_SCREEN_LOCK_AFTER_TIMEOUT参数可能有变化。此外,引用[4]中的例子是设置永不超时,这可能涉及到将超时时间设为最大值。用户可能需要具体的代码示例,比如如何通过ContentResolver来更新设置值。另外,用户提到的“立即锁屏”失效的情况,可能涉及到其他参数或硬件差异,比如某些设备制造商可能修改默认行为。需要提醒用户检查设备的具体实现和是否有额外的电源管理策略。 总结步骤:应用层修改需要调用系统API并处理权限,系统修改需要调整资源文件或系统服务。可能需要区分是否有root权限或者是否为系统应用。同时,提供代码示例和修改文件的位置,比如defaults.xml中的def_screen_off_timeout。</think>### Android系统屏幕超时时间修改方法 #### 一、应用层修改(需用户权限) 1. **通过系统设置API** 使用`Settings.System.putInt()`接口修改`SCREEN_OFF_TIMEOUT`值(单位:毫秒): ```java ContentResolver resolver = context.getContentResolver(); Settings.System.putInt(resolver, Settings.System.SCREEN_OFF_TIMEOUT, 30000); // 设置为30秒 ``` 需声明权限:`<uses-permission android:name="android.permission.WRITE_SETTINGS"/>`[^1][^4]。 2. **动态权限处理** Android 6.0+需动态申请`WRITE_SETTINGS`权限: ```java if (!Settings.System.canWrite(context)) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + context.getPackageName())); startActivity(intent); } ``` #### 二、系统修改(需ROM权限) 1. **修改默认配置文件** 在系统覆盖层文件`defaults.xml`中定义初始值: ```xml <!-- 设置默认超时为5分钟 --> <integer name="def_screen_off_timeout">300000</integer> ``` 文件路径:`frameworks/base/packages/SettingsProvider/res/values/defaults.xml`[^4]。 2. **电源管理服务调整** 修改`PowerManagerService.java`中`updatePowerStateLocked()`方法,注释或调整休眠逻辑: ```java // 原代码:mScreenOffTimeoutSetting = ...; mScreenOffTimeoutSetting = Integer.MAX_VALUE; // 永不休眠 ``` 路径:`frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java`[^3]。 #### 三、特殊场景处理 | 场景 | 解决方案 | |------|----------| | 需要保持长亮 | 设置`SCREEN_OFF_TIMEOUT`为`2147483647`(int最大值)[^4] | | 充电时不休眠 | 设置`SCREEN_OFF_TIMEOUT`为`-1`[^1] | | 立即锁屏失效 | 检查`LOCK_SCREEN_LOCK_AFTER_TIMEOUT`参数是否生效 | #### 四、验证方法 1. 通过`adb`命令查看当前值: ```bash adb shell settings get system screen_off_timeout ``` 2. 检查系统日志: ```logcat D/PowerManagerService: Screen off timeout: 30000ms ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值