升级后立即膨胀正在进行的通知布局时崩溃仅限安卓 10

问题描述

它在几个月前突然发生了。 仅限 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) 显示温度(我们正在制作一个天气应用程序)。 由于在扩展其 RemoteViews 布局时发生崩溃,通知无法发布。

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

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

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

上下文

  • 目标 SDK:30
  • 部署为 Android 应用程序包。
  • minifyEnabled = true
  • 这是一个 kotlin 多平台项目。

解决方法

从您所解释的内容来看,资源引用似乎随着应用启动而更新。 This guy has the same problem

本质上,R 类是整个 Android Studio 构建系统自动生成的类,它会在您添加、删除和编辑资源文件时自动生成。在一天结束时,“最终”R 类(drawable、id、layout 等)的每个字段都包含一个 int 值。并且由于一些黑暗的未知原因,这些引用会在您在 Android 10 上更新后首次启动应用时更新,(很可能在 Android 11 或其他一些与供应商相关的 Android 实现中)

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

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

,

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

-keepattributes InnerClasses

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