问题描述
它在几个月前突然发生了。 仅限 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>;
}