Android省电的秘密(2)之adb解读JobSchedule
前言###
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 | 包名 |
class | job的类名,这个类继承于JobService |
uid | 应用uid |
constraints | job被调度的条件 |
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工具感受下吧!新年快乐!!