แก้ไขข้อบกพร่องของ WorkManager

หากคุณสังเกตเห็นว่าผู้ปฏิบัติงานของคุณทำงานบ่อยเกินไปหรือไม่ทำงานเลย ลองดูด้านล่าง ขั้นตอนการแก้ไขข้อบกพร่องที่ช่วยให้คุณทราบสิ่งที่เกิดขึ้น

เปิดใช้งานการทำบันทึก

ในการตรวจสอบสาเหตุที่คนทำงานของคุณทำงานไม่ปกติ การ ให้ดูบันทึก WorkManager verbose หากต้องการเปิดใช้งานการบันทึก ให้ใช้ custom การเริ่มต้น

ขั้นแรก ให้ปิดใช้ WorkManagerInitializer เริ่มต้นใน AndroidManifest.xml โดยการสร้างผู้ให้บริการ WorkManager ใหม่ด้วยพารามิเตอร์ ใช้กฎการผสานไฟล์ Manifest remove แล้ว:

<provider
   
android:name="androidx.work.impl.WorkManagerInitializer"
   
android:authorities="${applicationId}.workmanager-init"
   
tools:node="remove"/>

เมื่อปิดใช้งานตัวกำหนดค่าเริ่มต้นของ WorkManager ตามค่าเริ่มต้นแล้ว คุณก็สามารถใช้งานตามคำขอได้ การเริ่มต้น โดยชั้นเรียน android.app.Application จะต้องติดตั้งใช้งาน สำหรับ androidx.work.Configuration.Provider:

KotlinJava
class MyApplication() : Application(), Configuration.Provider {
   
override fun getWorkManagerConfiguration() =
       
Configuration.Builder()
           
.setMinimumLoggingLevel(android.util.Log.DEBUG)
           
.build()
}
public class MyApplication extends Application implements Configuration.Provider {
   
@NonNull
   
@Override
   
public Configuration getWorkManagerConfiguration() {
       
return new Configuration.Builder()
               
.setMinimumLoggingLevel(android.util.Log.DEBUG)
               
.build();
   
}
}

เมื่อคุณกำหนดการกำหนดค่า WorkManager ที่กำหนดเอง WorkManager ของคุณจะเป็น เริ่มต้นเมื่อคุณโทรติดต่อ WorkManager.getInstance(Context) แทนการเปิดโดยอัตโนมัติเมื่อเริ่มต้นแอปพลิเคชัน โปรดดู WorkManager ที่กำหนดเอง การกำหนดค่าและ การเริ่มต้น สำหรับข้อมูลเพิ่มเติม รวมถึงการสนับสนุนสำหรับ WorkManager เวอร์ชันก่อน 2.1.0

เมื่อเปิดใช้การบันทึก DEBUG แล้ว จะเห็นบันทึกจำนวนมากที่มีคำนำหน้าแท็กบันทึก WM-

ใช้ adb shell dumpsys workscheduler

คุณสามารถใช้ adb เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดเวลางานใน Android 6.0 (API ระดับ 23) ขึ้นไป หากคุณเพิ่งเริ่มใช้ adb โปรดดูที่บรรทัดคำสั่ง เครื่องมือเพื่อดูรายละเอียดเพิ่มเติม

เมื่อคุณติดตั้ง adb แล้ว ให้เรียกใช้คำสั่งต่อไปนี้เพื่อดูรายการ งานที่มาจากแพ็กเกจของคุณ

adb shell dumpsys jobscheduler

ผลลัพธ์จะมีลักษณะดังนี้

JOB #u0a172/4: 6412553 com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService
  u0a172 tag
=*job*/com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService
 
Source: uid=u0a172 user=0 pkg=com.google.android.youtube
 
JobInfo:
   
Service: com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService
   
Requires: charging=false batteryNotLow=false deviceIdle=false
   
Extras: mParcelledData.dataSize=180
   
Network type: NetworkRequest [ NONE id=0, [ Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&VALIDATED Uid: 10172] ]
   
Minimum latency: +1h29m59s687ms
   
Backoff: policy=1 initial=+30s0ms
   
Has early constraint
 
Required constraints: TIMING_DELAY CONNECTIVITY [0x90000000]
 
Satisfied constraints: DEVICE_NOT_DOZING BACKGROUND_NOT_RESTRICTED WITHIN_QUOTA [0x3400000]
 
Unsatisfied constraints: TIMING_DELAY CONNECTIVITY [0x90000000]
 
Tracking: CONNECTIVITY TIME QUOTA
 
Implicit constraints:
    readyNotDozing
: true
    readyNotRestrictedInBg
: true
 
Standby bucket: RARE
 
Base heartbeat: 0
 
Enqueue time: -51m29s853ms
 
Run time: earliest=+38m29s834ms, latest=none, original latest=none
 
Last run heartbeat: 0
 
Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)

เมื่อใช้ WorkManager คอมโพเนนต์ที่ทำหน้าที่จัดการการดำเนินการของผู้ปฏิบัติงาน คือ SystemJobService ใน API ระดับ 23 ขึ้นไป มองหาอินสแตนซ์ของงาน ที่มาจากชื่อแพ็กเกจและ androidx.work.impl.background.systemjob.SystemJobService

สำหรับทุกงาน เอาต์พุตจากคำสั่งจะแสดงข้อความ required, sทำการยืนยัน, และข้อจำกัดที่ไม่เป็นไปตาม ตรวจสอบว่าข้อจำกัดของผู้ปฏิบัติงาน พอใจมากที่สุด

ผลลัพธ์นี้ยังรวมถึงประวัติงานสำหรับงานที่ดำเนินการล่าสุด เพื่อให้คุณสามารถใช้ เพื่อตรวจสอบว่ามีการเรียก SystemJobService เมื่อเร็วๆ นี้หรือไม่

Job history:
     
-1h35m26s440ms   START: #u0a107/9008 com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService
     
-1h35m26s362ms  STOP-P: #u0a107/9008 com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService app called jobFinished

ขอข้อมูลการวินิจฉัยจาก WorkManager 2.4.0 ขึ้นไป

ในแก้ไขข้อบกพร่องของบิลด์ของแอป คุณสามารถขอข้อมูลการวินิจฉัยได้จาก WorkManager 2.4.0 ขึ้นไปโดยใช้คำสั่งต่อไปนี้

adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "<your_app_package_name>"

ซึ่งให้ข้อมูลเกี่ยวกับสิ่งต่อไปนี้

  • คำขอทำงานที่เสร็จสมบูรณ์ใน 24 ชั่วโมงที่ผ่านมา
  • คำของานที่ทำงานอยู่
  • คำขอทำงานที่กำหนดเวลาแล้ว

อาจมีหน้าตาดังนี้ (เอาต์พุตจะแสดงผ่าน logcat)

adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "androidx.work.integration.testapp"

adb logcat
...
2020-02-13 14:21:37.990 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Recently completed work:
2020-02-13 14:21:38.083 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Id  Class Name   State  Unique Name Tags
   
08be261c-2def-4bd6-a716-1e4410968dc4     androidx.work.impl.workers.DiagnosticsWorker    SUCCEEDED  null    androidx.work.impl.workers.DiagnosticsWorker
   
48ce04f1-8df9-450b-96ec-6eceabb9c690     androidx.work.impl.workers.DiagnosticsWorker    SUCCEEDED  null    androidx.work.impl.workers.DiagnosticsWorker
    c46f4699
-c384-440c-a10e-26d56ce02963     androidx.work.impl.workers.DiagnosticsWorker    SUCCEEDED  null    androidx.work.impl.workers.DiagnosticsWorker
    ce125372
-046e-484e-949f-9abb35ce62c3     androidx.work.impl.workers.DiagnosticsWorker    SUCCEEDED  null    androidx.work.impl.workers.DiagnosticsWorker
   
72887ddd-8ed1-4018-b798-fac218e95e16     androidx.work.impl.workers.DiagnosticsWorker    SUCCEEDED  null    androidx.work.impl.workers.DiagnosticsWorker
    dcff3d61
-320d-4996-8644-5d97944bd09c     androidx.work.impl.workers.DiagnosticsWorker    SUCCEEDED  null    androidx.work.impl.workers.DiagnosticsWorker
    acab0bf7
-6087-43ad-bdb5-be0df9195acb     androidx.work.impl.workers.DiagnosticsWorker    SUCCEEDED  null    androidx.work.impl.workers.DiagnosticsWorker
   
23136bcd-01dd-46eb-b910-0fe8a140c2a4     androidx.work.integration.testapp.ToastWorker   SUCCEEDED  null    androidx.work.integration.testapp.ToastWorker
   
245f4879-c6d2-4997-8130-e4e90e1cab4c     androidx.work.integration.testapp.ToastWorker   SUCCEEDED  null    androidx.work.integration.testapp.ToastWorker
   
17d05835-bb61-429a-ad11-fe43fc320a54     androidx.work.integration.testapp.ToastWorker   SUCCEEDED  null    androidx.work.integration.testapp.ToastWorker
    e95f12be
-4b0c-4e64-88da-8ee07a31e42f     androidx.work.integration.testapp.ToastWorker   SUCCEEDED  null    androidx.work.integration.testapp.ToastWorker
   
431c3ec2-4a55-469b-b50b-4072d35f1232     androidx.work.integration.testapp.ToastWorker   SUCCEEDED  null    androidx.work.integration.testapp.ToastWorker
   
883a388f-f911-4098-9143-37bd8fbc098a     androidx.work.integration.testapp.ToastWorker   SUCCEEDED  null    androidx.work.integration.testapp.ToastWorker
    b904163c
-6822-4299-8d5a-78df49b7e53d     androidx.work.integration.testapp.ToastWorker   SUCCEEDED  null    androidx.work.integration.testapp.ToastWorker
   
453fd7b9-2b16-45b9-abc5-3d2ce7b6a4ba     androidx.work.integration.testapp.ToastWorker   SUCCEEDED  null    androidx.work.integration.testapp.ToastWorker
2020-02-13 14:21:38.083 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Running work:
2020-02-13 14:21:38.089 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Id  Class Name   State  Unique Name Tags
    b87c8a4f
-4ac6-4e25-ba3e-4cea53ce468a     androidx.work.impl.workers.DiagnosticsWorker    RUNNING    null    androidx.work.impl.workers.DiagnosticsWorker
...