JobService上关于jobfinish导致的概率性崩溃 的原因以及处理方法
作者:互联网
java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.android.server.job.controllers.JobStatus.getUid()' on a null object reference
at android.app.job.JobService$JobHandler.handleMessage(JobService.java:139)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5401)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:919)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:714)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.android.server.job.controllers.JobStatus.getUid()' on a null object reference
at android.os.Parcel.readException(Parcel.java:1552)
at android.os.Parcel.readException(Parcel.java:1499)
at android.app.job.IJobCallback$Stub$Proxy.acknowledgeStopMessage(IJobCallback.java:144)
at android.app.job.JobService$JobHandler.ackStopMessage(JobService.java:183)
at android.app.job.JobService$JobHandler.handleMessage(JobService.java:136)
... 7 more
java.lang.NullPointerException: Attempt to invoke virtual method 'int com.android.server.job.controllers.JobStatus.getUid()' on a null object reference
at android.os.Parcel.readException(Parcel.java:1552)
at android.os.Parcel.readException(Parcel.java:1499)
at android.app.job.IJobCallback$Stub$Proxy.acknowledgeStopMessage(IJobCallback.java:144)
at android.app.job.JobService$JobHandler.ackStopMessage(JobService.java:183)
at android.app.job.JobService$JobHandler.handleMessage(JobService.java:136)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5401)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:919)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:714)
说起来是六月底的bug了,背景是有个版本上了之后,线上出了如上一个高频的崩溃。
出现范围:
android5、android6
android7+未见此崩溃。
相关代码:
http://androidxref.com/5.1.1_r6/xref/frameworks/base/services/core/java/com/android/server/job/JobServiceContext.java#279
http://androidxref.com/5.1.1_r6/xref/frameworks/base/services/core/java/com/android/server/job/JobServiceContext.java#170
根据堆栈猜测原因应该是:
- 我们代码中调用了jobfinish,在系统会执行mRunningJob的置空,已经释放掉了jobservice的任务。
- 系统在任务完成时会调用acknowledgeStopMessage,这时候会检查 Binder.getCallingUid() != mRunningJob.getUid()
- mRunningJob这个对象有概率被步骤1置空了,导致抛出了异常。
小结:
- 崩溃点出现在系统上。
- 看代码猜测应该是调用时序的问题,就这个问题来说,android5、6调用jobservice.jobFinish都需要开发者自行注意时序问题。
标签:java,com,job,JobService,崩溃,os,jobfinish,android 来源: https://blog.csdn.net/yeshennet/article/details/118540002