首页
论坛
课程
招聘
[系统相关] [源码分析] 玩转Android10源码开发定制(14)修改安卓源码手机永不休眠
2021-1-13 14:57 3259

[系统相关] [源码分析] 玩转Android10源码开发定制(14)修改安卓源码手机永不休眠

2021-1-13 14:57
3259

一、设置永不休眠简单分析

安卓手机中"设置"应用里面可以设置手机屏幕超时时间。如下图所示:

通过选项可以看到最多能设置30分钟,那如果需要永不休眠,只要把屏幕超时时间设置的足够大就可以达到目的,比如Int的最大值。接下来源码中追踪一下"设置"应用中如何实现的。
源码中"设置"应用的源码路径如下:

1
packages/apps/Settings

通过对该目录关键字搜索和分析,找到设置屏幕超时的源码文件如下:

1
packages/apps/Settings/src/com/android/settings/display/TimeoutPreferenceController.java

"TimeoutPreferenceController.java"中修改屏幕超时的关键函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
@Override
   public boolean onPreferenceChange(Preference preference, Object newValue) {
       try {
           int value = Integer.parseInt((String) newValue);
           //最终是调用这个函数实现的
           Settings.System.putInt(mContext.getContentResolver(), SCREEN_OFF_TIMEOUT, value);
           updateTimeoutPreferenceDescription((TimeoutListPreference) preference, value);
       } catch (NumberFormatException e) {
           Log.e(TAG, "could not persist screen timeout setting", e);
       }
       return true;
   }

从代码中可以看到通过以下代码修改屏幕超时时间:

1
Settings.System.putInt(getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT, 6000);

以下将在设置应用中的屏幕超时中添加一个"永不休眠"的功能。

二、涉及修改的文件

1
2
3
4
5
6
7
//添加永不休眠以及时间选项
packages/apps/Settings/res/values/arrays.xml
 
//添加中文展示的永不休眠选项
packages/apps/Settings/res/values/values-zh-rCN/arrays.xml
//Settings.System.putInt方法的实现类,根据传入的特殊值-1修改为一个很大的休眠时间
/frameworks/base/core/java/android/provider/Settings.java

三、修改实战

1.设置应用中添加永不休眠选项

packages/apps/Settings/res/values/arrays.xml添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<string-array name="screen_timeout_entries">
    <item>15 seconds</item>
    <item>30 seconds</item>
    <item>1 minute</item>
    <item>2 minutes</item>
    <item>5 minutes</item>
    <item>10 minutes</item>
    <item>30 minutes</item>
    <!-- ///ADD START 此处新增的英文语言下Never展示项-->
    <item>Never</item>
    <!-- ///ADD END -->
 
</string-array>
 
<!-- Do not translate. -->
<string-array name="screen_timeout_values" translatable="false">
    <!-- Do not translate. -->
    <item>15000</item>
    <!-- Do not translate. -->
    <item>30000</item>
    <!-- Do not translate. -->
    <item>60000</item>
    <!-- Do not translate. -->
    <item>120000</item>
    <!-- Do not translate. -->
    <item>300000</item>
    <!-- Do not translate. -->
    <item>600000</item>
    <!-- Do not translate. -->
    <item>1800000</item>
    <!-- ///ADD START 此处新增的休眠时间-1-->
    <item>-1</item>
    <!-- ///ADD END -->
</string-array>

packages/apps/Settings/res/values/values-zh-rCN/arrays.xml添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
<string-array name="screen_timeout_entries">
  <item msgid="8386012403457852396">"15 秒"</item>
  <item msgid="4572123773028439079">"30 秒"</item>
  <item msgid="7016081293774377048">"1 分钟"</item>
  <item msgid="838575533670111144">"2 分钟"</item>
  <item msgid="2693197579676214668">"5 分钟"</item>
  <item msgid="1955784331962974678">"10 分钟"</item>
  <item msgid="5578717731965793584">"30 分钟"</item>
  <!-- ///ADD START 此处新增的中文语言展示选择项-->
  <item>永不睡觉</item>
  <!-- ///ADD END -->
</string-array>

2.Settings.java文件中修改休设置的休眠时间

在该文件中找到Settings.System.putInt方法,修改关联的方法代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  //putInt最终调用的是putIntForUser
   public static boolean putInt(ContentResolver cr, String name, int value) {
            return putIntForUser(cr, name, value, cr.getUserId());
        }
 
//putIntForUser中根据传入的name和value特殊值-1进行修改设置
/** @hide */
@UnsupportedAppUsage
public static boolean putIntForUser(ContentResolver cr, String name, int value,int userHandle) {
///ADD START
if(name.equals(SCREEN_OFF_TIMEOUT))               
{
      //-1说明是我们在设置中添加的永不休眠的值
            if(value==-1)
            {
                          //
                          Log.d("Settings","change screen timeout for:"+Integer.toString(Integer.MAX_VALUE-1000));
                          return putStringForUser(cr, name, Integer.toString(Integer.MAX_VALUE-1000), userHandle);
                }
}
                ///ADD END
            return putStringForUser(cr, name, Integer.toString(value), userHandle);
        }

四、效果展示

修改之后编译刷机,我本机测试了挂了一天都没休眠。

 

原文链接:
玩转Android10源码开发定制(14)修改安卓源码手机永不休眠


第五届安全开发者峰会(SDC 2021)议题征集正式开启!

最后于 2021-4-12 22:03 被蟑螂一号编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (4)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Rssss 活跃值 2021-1-13 19:02
2
0
太棒了, 刚好我也在做Android定制相关工作~作者加油!!
雪    币: 5939
活跃值: 活跃值 (2697)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 活跃值 3 2021-1-14 23:02
3
0
这个很有用 哈哈 不然每次都刷完都要去设置里面调
雪    币: 3323
活跃值: 活跃值 (273)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Papaya. 活跃值 2021-4-12 17:08
4
0
大佬,你干脆加个站发文章吧。公众号文章全都挂了啊
雪    币: 187
活跃值: 活跃值 (1546)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
蟑螂一号 活跃值 1 2021-4-12 22:04
5
0
Papaya. 大佬,你干脆加个站发文章吧。公众号文章全都挂了啊[em_50]
已经迁移到新号了
游客
登录 | 注册 方可回帖
返回