美文网首页android基础知识Android知识Android开发
Android省电的秘密(2)之adb解读JobSchedule

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

作者: 我在等你回复可你没回 | 来源:发表于2017-02-04 10:56 被阅读737次

    前言###

    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工具感受下吧!新年快乐!!

    相关文章

      网友评论

        本文标题:Android省电的秘密(2)之adb解读JobSchedule

        本文链接:https://www.haomeiwen.com/subject/ejjjittx.html