这个错误导致 app 崩溃了,但是并没有执行我们的代码。 不知道怎么办了,而且不止一个用户有这个问题
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:1608) at android.os.Parcel.readException(Parcel.java:1555) at android.app.job.IJobCallback$Stub$Proxy.jobFinished(IJobCallback.java:167) at android.app.job.JobService$JobHandler.handleMessage(JobService.java:147) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:150) at android.app.ActivityThread.main(ActivityThread.java:5546) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
1
vjnjc 2017-01-18 14:59:32 +08:00
有报错设备信息么?
|
2
sighforever OP 包括什么样的设备信息呢?
我这里记录到的机型有, vivo X7Plus(5.1.1), HUAWEI RIO-AL00(6.0.1), HUAWEI P7-L07(5.1.1),HUAWEI RIO-CL00(6.0.1) |
3
mokechen 2017-01-18 15:27:09 +08:00
明显的空指针错误 这还看不到么
|
4
mokechen 2017-01-18 15:28:30 +08:00
发生了空对象引用 在 com.android.server.job.controllers.JobStatus.getUid()这个地方
|
5
yuyuyu 2017-01-18 15:31:07 +08:00
我想知道要怎么收集这种崩溃错误信息?
|
6
liu37130 2017-01-18 15:38:32 +08:00
这里有个和你的很像的 issue ,会不会有什么启发。。。
https://code.google.com/p/android/issues/detail?id=104302 |
7
sighforever OP @mokechen 看到了是空指针的
但是 com.android.server.job.controllers.JobStatus. 这个对象是 android 自己产生的,你看他的命名空间和整个的调用堆栈,根本没有我们写的代码啊。 现在的问题就是找不到到底是我们的代码什么地方会引起系统的这个错误。而且这个问题在我们测试机器上都复现不出来,很是郁闷 |
8
sighforever OP |
10
wanttofly 2017-01-18 16:04:16 +08:00
https://github.com/evernote/android-job/issues/92 看到这个 issue 里有提到华为 6.0 的机型,也许你可以试着联系下那个人 https://github.com/tobiasschuerg ,问下他解决了没?
|
11
wipen 2017-01-18 16:11:32 +08:00
感觉是系统的 bug ,一般以
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) |
12
wipen 2017-01-18 16:13:35 +08:00
感觉是系统的 bug ,一般以
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 这个开头的最后结论是系统问题。 如果是第三方库的原因,应该能够在错误路径中打出第三方库的包和调用。 你还可以试试在项目中搜索 JobStatus 和 JobService 的使用情况。 |
13
catror 2017-01-18 16:23:48 +08:00
看一下调用 jobFinished 的地方,感觉是被调用了两次。
|
15
zhibin 2017-01-18 18:11:29 +08:00 1
恭喜你 , 你可能发现了一个 Android 的 Bug 哦, 猜测是下面这个地方出的错误。这个发生概率多大?
http://androidxref.com/7.1.1_r6/xref/frameworks/base/services/core/java/com/android/server/job/JobServiceContext.java#352 这有一个类似问题: https://github.com/evernote/android-job/issues/92 |
17
AlisaDestiny 2017-01-18 21:19:14 +08:00 via iPhone
我今天用 Java 调用 mongodb 也有类似情况。我没有调用连接数据库代码,却给我报了个链接错误。死活找不到根源。
|
18
sighforever OP @zhibin 感觉也不像是 android 的 bug ,好像上一个版本都没有这个问题呢
唉!就是不知道这个错误到底会不会导致应用崩溃,现在还没有用户抱怨崩溃的问题,但也不好说啊 |
19
zhibin 2017-01-19 11:10:35 +08:00
@sighforever 应用是否使用了 JobService / JobScheduler 相关的东西?
从 log 来看应该会导致进程终止。 在我看来是并发导致的问题。 |
20
ranbin 2017-01-19 11:50:06 +08:00
Android 5.0(API 21)添加了可以在特定条件下执行后台任务的 JobScheduler 服务,该服务在系统启动过程由 SystemServer 启动,同 ActivityManager 等服务类似该服务在使用的时候貌似也需要通过 Binder 进行进程间通信,而从报错的堆栈信息上看应该是在通信过程中被调用侧也就是 service 处抛出了异常反馈到了调用侧 client 端,感觉如果你的应用中没有使用到该服务,貌似不会出现应用崩溃的问题吧~
|
21
hkllzh 2017-01-19 14:31:40 +08:00
一样,很多设备都出现了这个错误信息。 vivo 和 oppo 占了前 4 名
|
22
sighforever OP @hkllzh 嗯,确实 v 记和 o 记,很多,看来是不会导致应用崩溃的,先不管了
|
23
sighforever OP @ranbin 嗯,应该是 service 导致的,目前看来不会导致应用崩溃,就先不管了
|
24
LuckHard 2017-01-25 14:44:40 +08:00
@sighforever
我也遇到了这个问题,目前推测可能是集成环信造成,不知道你们是不是也是这个情况。 还是之前的这个 issue https://code.google.com/p/android/issues/detail?id=104302 问题的描述很明显,在某些 android 系统上有一个系统 bug ,就是如果在 JobService.onStartService 回调中调用 JobService.jobFinished 方法会出现一个随机 Crash 导致服务挂掉。 而环信代码中就是这么调用的。 具体可见 com.hyphenate.chat.EMJobService 类。 这个问题只在上线环信后出现,并且代码也与描述相符,所以推测应该是集成环信造成的。 目前正在想解决方案,有大神的话麻烦帮忙看看。 自己有三个,不知道可不可行,麻烦大家也看一下: 1 ,通过 android 的相同路径下代码覆盖的原则,重写 com.hyphenate.chat.EMJobService 类实现不调用 jobFinished 的逻辑。(不知道会不会有更大的坑) 2 ,找环信老版本的 SDK 看看,也许可以避免。(问题同上,这是一个降级操作,感觉坑更大) 3 ,去找环信沟通。(马上三十了,能解决的希望……有点渺茫……) |
25
guiping 2017-02-04 14:26:34 +08:00
@LuckHard 我们项目中也集成环信了,也出现这个问题,比较集中的是再三星的某款机子上,代码跟踪找了下,环信通过 JobService 实现聊天服务的唤醒, 但是 JobService 在获取 getUid 的时候未获取到,就报错了。。。。
|
26
LuckHard 2017-02-04 19:14:59 +08:00 1
@guiping
我这里已经解决了。 在 JobService.onStartService 中 return false 的情况下应该是不需要调用 jobFinished 的。 参考: https://code.tutsplus.com/tutorials/using-the-jobscheduler-api-on-android-lollipop--cms-23562 https://developer.android.com/reference/android/app/job/JobService.html 中文在这里: http://wiki.jikexueyuan.com/project/android-weekly/issue-146/using-jobscheduler.html http://mahong978.top/2016/08/19/android-job-scheduler/ 环信这里应该是个错误调用,目的是想在满足条件时唤起自己的服务,这是一个快速操作, return false 是对的,但不用调用 jobFinished ,把 jobFinished 的调用去掉后即可修复。 (因为你都没有 return true 把信息加进去,那你调用 jobFinished 时系统想 getUid 时当然是空指针) (讲道理,差点因为这个问题年都没法舒服过,改天应该和环信那边聊聊) |
27
sighforever OP |
28
sighforever OP @LuckHard
我们一起找环信提意见,让他们赶紧升级 |
29
hkllzh 2017-02-07 09:34:31 +08:00
|
30
gdky005 2017-08-30 12:17:23 +08:00
http://www.imgeek.org/question/10825
这个里面提到: 关于这个错误,我们这边分析了下,这个属于调用 Android 5.x 之后那个 jobFinished 的一个隐患,这个应该不属于本地 catch,属于在调用这个方法过程中的远程错误输出,一般这个错误是不会被用户感知到的,不会影响到当前 app,不过后边这边会把这个隐患给去掉, |