其他分享
首页 > 其他分享> > JobService上关于jobfinish导致的概率性崩溃 的原因以及处理方法

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

根据堆栈猜测原因应该是:

  1. 我们代码中调用了jobfinish,在系统会执行mRunningJob的置空,已经释放掉了jobservice的任务。
  2. 系统在任务完成时会调用acknowledgeStopMessage,这时候会检查 Binder.getCallingUid() != mRunningJob.getUid()
  3. mRunningJob这个对象有概率被步骤1置空了,导致抛出了异常。

小结:

  1. 崩溃点出现在系统上。
  2. 看代码猜测应该是调用时序的问题,就这个问题来说,android5、6调用jobservice.jobFinish都需要开发者自行注意时序问题。

标签:java,com,job,JobService,崩溃,os,jobfinish,android
来源: https://blog.csdn.net/yeshennet/article/details/118540002