Android省电的秘密(2)之adb解读JobScheduler

前言###

adb是查看系统状态一个很好的工具,本文使用adb来解读JobScheduler的状态。JobScheduler是google为了省电而设计的一种用于调度工作的机制,为了查看JobScheduler的运行效果,除了实际观察运行状态外,adb也是一种很不错的辅助调试工具。

目录###

一.系统服务JobSchedulerService
二.注册的job记录文件jobs.xml
三.job参数解释

一.系统服务JobSchedulerService#####

服务在SystemServer中注册,属于系统服务
源码路径:/frameworks/base/services/java/com/android/server/SystemServer.java

mSystemServiceManager.startService(JobSchedulerService.class);

执行 adb shell service list查看系统服务,在列出的所有系统服务中可以找到

jobscheduler: [android.app.job.IJobScheduler]
二.注册的job记录文件jobs.xml#####

源码路径:/frameworks/base/services/core/java/com/android/server/job/JobStore.java
系统中的job记录在文件jobs.xml,完整路径是/data/system/job/jobs.xml,查看该文件手机要先root

    private JobStore(Context context, File dataDir) {
        mContext = context;
        mDirtyOperations = 0;

        File systemDir = new File(dataDir, "system");
        File jobDir = new File(systemDir, "job");
        jobDir.mkdirs();
        mJobsFile = new AtomicFile(new File(jobDir, "jobs.xml"));

        mJobSet = new ArraySet<JobStatus>();

        readJobMapFromDisk(mJobSet);
    }

cat命令查看该文件,文件记录着系统中此刻所有被调度的job

root@Xiaomi:/data/system/job # cat jobs.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<job-info version="0">
    <job jobid="137303610" package="com.google.android.apps.maps" class="com.google.android.apps.gmm.offline.OfflineAutoUpdateJobService" uid="10099">
        <constraints connectivity="true" idle="true" charging="true" />
        <periodic period="86400000" delay="1485554596322" />
        <extras />
    </job>
    <job jobid="137303609" package="com.google.android.apps.maps" class="com.google.android.apps.gmm.offline.OfflineAutoUpdateJobService" uid="10099">
        <constraints connectivity="true" idle="true" charging="true" />
        <one-off delay="1485444550825" />
        <extras />
    </job>
    <job jobid="1" package="com.example.wfcvs" class="com.example.wfcvs.wenfengService" uid="10146">
        <constraints charging="true" />
        <one-off delay="1485348887275" />
        <extras />
    </job>
    <job jobid="20537" package="android" class="com.android.server.backup.KeyValueBackupJob" uid="1000">
        <constraints connectivity="true" charging="true" />
        <one-off deadline="1485591350955" delay="1485519812187" />
        <extras />
    </job>
    <job jobid="808" package="android" class="com.android.server.MountServiceIdler" uid="1000">
        <constraints idle="true" charging="true" />
        <one-off delay="1485417599095" />
        <extras />
    </job>
</job-info>
三.job参数解释#####
参数解释
jobid每个job的id,android.app.job.JobInfo.Builder.Builder(int jobId, ComponentName jobService) 指定
package包名
classjob的类名,这个类继承于JobService
uid应用uid
constraintsjob被调度的条件
one-off跟时间相关,记录job的deadline,和延时执行的时间,注意这个是时间点,由函数systemclock.elapsedrealtime()生成,即系统启动的时间,到这个时间点job会被触发

例如:
<constraints connectivity=”true” charging=”true” /> 代表网络连接并且在充电状态下,job会被调度
<one-off delay=”1485348887275″ /> 代表job在满足条件的情况下,必须要等到1485348887275这个时间点才会被执行

jobs.xml文件需要手机root情况下才能查看,没有root要怎么查看呢?当然有方法,执行adb shell dumpsys jobscheduler

 adb shell dumpsys jobscheduler
Started users: u0
Registered jobs:
  117..:[ComponentInfo{com.google.android.apps.maps/com.google.android.apps.gmm.offline.OfflineAutoUpdateJobService},jId=137303610,u0,R=(-172:44:27,none),N=1,C=true,I=true,F=1,P=true,ANI=true]
  148..:[ComponentInfo{com.google.android.apps.maps/com.google.android.apps.gmm.offline.OfflineAutoUpdateJobService},jId=137303609,u0,R=(-203:18:32,none),N=1,C=true,I=true,F=1,P=true,ANI=true]
  849..:[ComponentInfo{com.example.wfcvs/com.example.wfcvs.wenfengService},jId=1,u0,R=(56:07,none),N=0,C=true,I=false,F=8,P=true,ANI=true]
  246..:[ComponentInfo{android/com.android.server.MountServiceIdler},jId=808,u0,R=(-210:47:44,none),N=0,C=true,I=true,F=0,P=false,ANI=true]

Conn.
connected: true unmetered: true
148..: C=true, UM=false
117..: C=true, UM=false

Alarms (843148174)
Next delay alarm in 3367s
Next deadline alarm in 9223372036011627s
Tracking:
849..: (846515518, N/A)

Idle: false
3
  246..
  148..
  117..

Batt.
Stable power: true
246885848,14863036,11761044,84957259

AppIdle
Parole On: false
android:idle=false, com.google.android.apps.maps:idle=false, com.google.android.apps.maps:idle=false, com.example.wfcvs:idle=false,

Pending:

Active jobs:

mReadyToRock=true
mDeviceIdleMode=false

例如

849..:[ComponentInfo{com.example.wfcvs/com.example.wfcvs.wenfengService},jId=1,u0,R=(56:07,none),N=0,C=true,I=false,F=8,P=true,ANI=true]

849 代表这个job的hashcode的前三位
R 代表延时时间和deadline,(56:07,none)代表延时到56:07才能执行,deadline为none代表没有deadline。
N 代表网络
C 代表充电
I 代表idle
F 代表调度失败的次数
P 代表job是否Persist

好了,伙伴们,使用你们的adb工具感受下吧!新年快乐!!

    原文作者:九九叔
    原文地址: https://www.jianshu.com/p/10f9a26081be
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞