google-play - 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
- 任何提示和反馈表示赞赏!
解决方案
Android 的难点在于它是开源的,这意味着在很多不同的设备上有很多不同的版本。不过,它的伟大之处在于它是开源的!这意味着您可以阅读源代码以解决您的问题。
以下是我调试崩溃报告的方法,如下所示:
- 我用谷歌找到源代码“ContextImpl.java startServiceCommon android source”
- 有趣的是,在执行此操作时,我在这里发现了其他人的问题。看起来 evernote android-job 库有一个错误。从 Android O 开始,后台任务必须调用
Context.startForegroundService
而不是Context.startService
. 您需要升级库吗? - 如果我没有找到这个,我会查看源代码。
- 如果您单击该页面顶部的 [blame],您可以看到此代码已添加到此处
- 更改的描述告诉您,它与查找进程在不应该在后台运行的事情有关。
- 这个 StackOverflow 问题似乎有一些更好的答案
推荐阅读
- getstream-io - Getstream - 按自定义字段过滤活动
- django - `basename` 参数未指定,并且可以'\
- java - Elasticsearch:使用 Java 客户端查找给定索引的所有映射类型
- php - 如何在 composer 和 /vendor/autoload.php 之前加载文件?
- java - View、Viewgroup、onClick、getChildAt问题
- android - 如何创建一个可以在一段时间后自行卸载的应用程序
- python - 为什么我在使用 python fire 时总是打印类型信息?
- python - 基于if语句的for循环,错误信息= Series的真值不明确
- javascript - 加载/显示最后搜索值的页面
- nginx - “/usr/share/nginx/html/AppzillonServer”失败(2:没有这样的文件或目录)