升级后立即展开持续通知布局时崩溃。 Android 10只

Crash while inflating ongoing-notification layout right after upgrade. Android 10 only

它是几个月前突然发生的。 Android 仅 10 个。

用户升级到我们应用的新版本后,启动时发生崩溃。

对于给定用户,崩溃只发生一次。 所以我们认为崩溃是在升级到新版本后立即发生的。 崩溃的是新版本(不是旧版本)。

这是一个崩溃的例子。

Fatal Exception: android.app.RemoteServiceException: Bad notification(tag=null, id=30) posted from package yo.app, 
crashing app(uid=10613, pid=16365): 
Couldn't inflate contentViewsandroid.view.InflateException: Binary XML file line #19 in yo.app:layout/sky_eraser_main: 
Binary XML file line #19 in yo.app:layout/sky_eraser_main: Error inflating class androidx.appcompat.widget.Toolbar
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2052)
       at android.os.Handler.dispatchMessage(Handler.java:107)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7710)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

崩溃看起来因构建而异。 但是模式是一样的。

让我转录一下我们认为正在发生的事情。

有一个正在进行的通知 (id=30) 显示温度(我们正在制作一个天气应用程序)。 通知无法 post 因为在扩展其 RemoteViews 布局时发生崩溃。

原来的版式好像换了一个, 完全不相关的布局(sky_eraser_main 在我们应用的另一个地方使用)。 错误的布局因构建而异。 看起来好像整数布局 ID 混淆了。 会不会是一些奇怪的 R8 优化的结果?

很遗憾,我们无法在本地重现崩溃。

您知道如何解决这些崩溃问题吗?

上下文

从您一直在解释的内容来看,资源引用似乎在应用启动时得到了更新。 This guy has the same problem

本质上,R class 是整个 Android Studio 构建系统自动生成的 class,只要您添加、删除和编辑资源文件,它就会自动生成。在一天结束时,“最终”R classes(drawable、id、layout 等)的每个字段都包含一个 int 值。由于一些不为人知的不明原因,在 Android 10 更新后首次启动应用程序时,这些引用正在更新,(很可能在 Android 11 或 [的其他一些供应商相关实现中=24=])

根据他的回答(100+)中的评论部分,投票似乎没有解决办法。如果我设法捕获任何异常,我会尝试 try-catch 布局的 inflation 并中止通知。

另一种方法是使用 WorkManager 之类的方法来延迟通知的启动,以确保在 NotifyWork 启动时引用已更新

您可能希望明确保留整个 class yo.app.R:

-keepattributes InnerClasses

-keep class yo.app.R
-keep class yo.app.R$* {
    <fields>;
}