首页 > 解决方案 > Android 8 handleReceiver/startService常见bug

问题描述

因为我们都喜欢它又短又脆:

我在商店中有一个应用程序导致崩溃,我无法重现(在 4 个不同的 android8 设备上)。根据 GPlay,它是Android 8.x 中唯一RuntimeException的一个。ActivityThread.handleReceiver

由于这只发生在具有 PlayStore 版本的“某些”设备上,我可能猜测这是因为 ProGuard 和/或签名。此外,我不在我的应用程序中使用任何服务/广播接收器,因为 Android 8 有一个 startForegroundService 而不是 startService。在我的应用程序中,我使用FusedLocationProviderClient最新的 GPlay 服务,但猜测它们应该可以完美运行。

堆栈跟踪:

java.lang.RuntimeException:在
android.app.ActivityThread.-wrap18 的 android.app.ActivityThread.handleReceiver (ActivityThread.java:3399)(未知来源)在 android.app.ActivityThread$H.handleMessage (ActivityThread.java:1780 ) 在 android.os.Handler.dispatchMessage (Handler.java:105) 在 android.os.Looper.loop (Looper.java:164) 在 android.app.ActivityThread.main (ActivityThread.java:6944) 在 java.lang .reflect.Method.invoke(本机方法)在 com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327) 在 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)

引起:java.lang.IllegalStateException:

在 android.app.ContextImpl.startServiceCommon (ContextImpl.java:1538) 在 android.app.ContextImpl.startService (ContextImpl.java:1484) 在 android.content.ContextWrapper.startService (ContextWrapper.java:663) 在 com.evernote。 android.job.WakeLockUtil.startWakefulService (WakeLockUtil.java:95) 在 com.evernote.android.job.JobRescheduleService.startService (JobRescheduleService.java:24) 在 com.evernote.android.job.JobManager。(JobManager.java:191) 在 com.evernote.android.job.JobManager.create (JobManager.java:114) 在 com.evernote.android.job.JobBootReceiver.onReceive (JobBootReceiver.java:49) 在 android.app。 ActivityThread.handleReceiver (ActivityThread.java:3392)

我已经在这里找到了一个相关的线程,它建议扩展 proGuardconfig,所以我做了 - 不幸的是 w/oa 修复:

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

标签: google-playproguardobfuscationcode-signing

解决方案


Android 的难点在于它是开源的,这意味着在很多不同的设备上有很多不同的版本。不过,它的伟大之处在于它是开源的!这意味着您可以阅读源代码以解决您的问题。

以下是我调试崩溃报告的方法,如下所示:

  • 我用谷歌找到源代码“ContextImpl.java startServiceCommon android source”
  • 有趣的是,在执行此操作时,我在这里发现了其他人的问题。看起来 evernote android-job 库有一个错误。从 Android O 开始,后台任务必须调用Context.startForegroundService而不是Context.startService. 您需要升级库吗?
  • 如果我没有找到这个,我会查看源代码
    • 如果您单击该页面顶部的 [blame],您可以看到此代码已添加到此处
    • 更改的描述告诉您,它与查找进程在不应该在后台运行的事情有关。
  • 这个 StackOverflow 问题似乎有一些更好的答案

推荐阅读