解读JobScheduler的jobs.xml

一、jobs.xml

注册的job记录文件

  • 源码路径:/frameworks/base/services/core/java/com/android/server/job/JobStore.java

  • 系统中的job记录在文件jobs.xml,完整路径是/data/system/job/jobs.xml

    复制代码
      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);
      }

小米手机的jobs.xml

复制代码
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

复制代码
void dump(IndentingPrintWriter pw) {
    pw.println("Settings:");
    pw.increaseIndent();
    pw.print(KEY_MIN_READY_NON_ACTIVE_JOBS_COUNT,
            MIN_READY_NON_ACTIVE_JOBS_COUNT).println();
    pw.print(KEY_MAX_NON_ACTIVE_JOB_BATCH_DELAY_MS,
            MAX_NON_ACTIVE_JOB_BATCH_DELAY_MS).println();
    pw.print(KEY_HEAVY_USE_FACTOR, HEAVY_USE_FACTOR).println();
    pw.print(KEY_MODERATE_USE_FACTOR, MODERATE_USE_FACTOR).println();

    pw.print(KEY_MIN_LINEAR_BACKOFF_TIME_MS, MIN_LINEAR_BACKOFF_TIME_MS).println();
    pw.print(KEY_MIN_EXP_BACKOFF_TIME_MS, MIN_EXP_BACKOFF_TIME_MS).println();
    pw.print(KEY_CONN_CONGESTION_DELAY_FRAC, CONN_CONGESTION_DELAY_FRAC).println();
    pw.print(KEY_CONN_PREFETCH_RELAX_FRAC, CONN_PREFETCH_RELAX_FRAC).println();

    pw.print(KEY_ENABLE_API_QUOTAS, ENABLE_API_QUOTAS).println();
    pw.print(KEY_API_QUOTA_SCHEDULE_COUNT, API_QUOTA_SCHEDULE_COUNT).println();
    pw.print(KEY_API_QUOTA_SCHEDULE_WINDOW_MS, API_QUOTA_SCHEDULE_WINDOW_MS).println();
    pw.print(KEY_API_QUOTA_SCHEDULE_THROW_EXCEPTION,
            API_QUOTA_SCHEDULE_THROW_EXCEPTION).println();
    pw.print(KEY_API_QUOTA_SCHEDULE_RETURN_FAILURE_RESULT,
            API_QUOTA_SCHEDULE_RETURN_FAILURE_RESULT).println();

    pw.print(KEY_RUNTIME_MIN_GUARANTEE_MS, RUNTIME_MIN_GUARANTEE_MS).println();
    pw.print(KEY_RUNTIME_MIN_EJ_GUARANTEE_MS, RUNTIME_MIN_EJ_GUARANTEE_MS).println();
    pw.print(KEY_RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
            .println();

    pw.decreaseIndent();
}
相关推荐
SEO_juper5 小时前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
步行cgn9 小时前
Spring MVC 核心配置文件详解:springmvc.xml 每一行配置的意义
xml·spring·mvc
泡海椒2 天前
JQuick-SQL JQuickTable 模型:XML 动态 SQL 的表封装边界
xml·数据库·sql
supabc1232 天前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
zzu123zsw3 天前
当 GPU 加速渲染遇上无头组件:拆解 Yororen UI 在 GPUI 生态下的状态解耦与 XML 模板实践
xml·ui·rust·gui·gpui
麦序子3 天前
用 pdfplumber + 正则 解析工程量清单 PDF:提取项目编码、综合单价并导出 Excel
xml·pdf·python3.11
ha_lydms6 天前
Xml Functions(XML 函数)
xml·大数据·hadoop·spark·数据处理·dataworks·maxcompute
Eyfcom8 天前
〖实战〗跨境报关单证自动化:XML 报文生成、PDF 套打与单一窗口同步上传的工程实现
xml·pdf·自动化·报关单证·清关自动化
泡海椒9 天前
从 XML 到 Excel:JQuick-Excel 代理与解析器如何协作
xml·excel
流烟默10 天前
Spring Boot 异常响应被序列化为 XML 的排查与修复
xml·spring boot·后端