我们在安卓6和7的小米手机上遇到了很多崩溃问题:
Fatal Exception: android.app.RemoteServiceException: Bad notification posted from package x.y.z: Couldn't create icon: StatusBarIcon(icon=Icon(typ=RESOURCE pkg=x.y.z id=0x7f0200ad) visible user=0 )
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1715)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6358)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
我在网上找到了很多类似的崩溃报告和文章。以下是其中的一些:
https://medium.com/@Miqubel/the-story-of-a-hard-to-fix-bug-ac6ed819cb49
但是不同的是,我们只在小米手机(Android 6和7)上遇到这些问题,可能不是在更新期间,因为同一用户在相同版本中多次遇到崩溃。有趣的是,我在网上找不到任何关于这个特定情况的信息,我们周围也没有小米手机。我设置通知类似于这样:NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, importance);
notificationChannel.enableLights(true);
notificationManager.createNotificationChannel(notificationChannel);
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentText(body == null ? "" : body)
.setAutoCancel(true)
.setContentIntent(PendingIntent.getActivity(
context,
0,
pendingIntent,
PendingIntent.FLAG_UPDATE_CURRENT
));
我们还有Facebook通知,需要以类似的方式设置,但是在不同的Notification类上。我不知道它是否相关。有人遇到过这个问题吗?除了包装setSmallIcon和/或setLargeIcon方法以进行制造商和Android版本检查之外,有什么建议如何修复它?
编辑:我找不到解决方案,但是这里有一些新想法:
- 我们发布了一个新版本,但是排除小米用户的通知并没有帮助!现在我认为问题是由ActivityThread.java中的自定义代码引起的。MIUI可能会在此处触发通知某个事件。在这里,原始Android中有几十个事件,但没有一个事件会触发通知。但是我们的图标有问题,所以它们会崩溃。
- 但是我们的图标有什么问题呢?我们有一个ic_notification,可能不用于此。另一方面,ic_launcher是一个mipmap。也许是这个原因?但是我在小米和mipmap方面找不到任何问题。
- 崩溃报告始终在几个应用程序版本中提到相同的资源ID:0x7f0200ad。这有特殊原因吗?我该如何反向工程我们的应用程序以获取此资源的名称?
编辑2:
- 我使用apktool反向工程了应用程序,但是资源ID不在public.xml中,这似乎是R.java的等效文件。我们的ic_notification和ic_launcher在列表中具有不同的ID。那么这是MIUI找不到的系统资源吗?
编辑3:
- 其他人遇到了同样的问题的第一个证据:
https://xiaomi.eu/community/threads/miui-9.47247/
在波兰论坛上找到了一个临时解决方案:https://pl.forum.elvenar.com/index.php?threads/problem-z-uruchomieniem-23566.3348/
最后一条评论的翻译是: “我们对于小米手机问题有一个临时解决方案,请尝试在手机设置中禁用来自Elvenar应用程序的强制通知。重启应用程序后,错误应该会消失。”编辑4: 我们正在使用ShortcutBadger(版本1.1.13)。这里说我们应该为小米徽章使用不同的方法:
https://github.com/leolin310148/ShortcutBadger/wiki/Xiaomi-Device-Support
在1.1.13版本之后,他们取消了对小米的默认支持,您必须使用上面链接中的通知。
还有其他受影响的人使用这个吗?