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

Android 升级后立即膨胀正在进行的通知布局时崩溃。仅限安卓10,android,android-layout,crash,android-resources,android-10.0,Android,Android Layout,Crash,Android Resources,Android 10.0,这件事在几个月前突然发生了。 只有安卓10 用户升级到新版本的应用程序后,启动时会发生崩溃 对于给定的用户,只观察到一次崩溃。 所以我们认为崩溃发生在升级到新版本之后。 崩溃的是新版本(不是旧版本) 这是一个碰撞的例子 Fatal Exception: android.app.RemoteServiceException: Bad notification(tag=null, id=30) posted from package yo.app, crashing app(uid=10613,

这件事在几个月前突然发生了。 只有安卓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)显示温度(我们正在制作一个天气应用程序)。 通知无法发布,因为在扩展其RemoteView布局时发生崩溃

看起来原来的布局被另一个取代了, 完全不相关的布局(sky_橡皮擦_main用于我们应用程序的另一个地方)。 错误的布局因版本而异。 看起来似乎整数布局ID混淆了。 这可能是一些奇怪的R8优化的结果吗

不幸的是,我们无法在本地重现这次崩溃

你知道如何应对这些撞车事故吗

上下文

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

根据您的解释,资源引用似乎在应用程序启动时得到了更新

本质上,
R
类是整个androidstudio构建系统自动生成的类,无论何时添加、删除和编辑资源文件,该类都会自动生成。一天结束时,“final”
R
类(可绘制、id、布局等)的每个字段都保存一个int值。由于一些未知的原因,这些引用在Android 10更新后首次启动应用程序时被更新(很可能在Android 11或其他依赖于供应商的Android实现中)

根据他的回答中的评论部分(100票以上),投票似乎没有解决问题。我会尝试
try捕捉布局的膨胀,如果我成功捕捉到任何异常,我会中止通知


另一种方法是使用类似于
WorkManager
的方法延迟通知的启动,以确保在
NotifyWork
启动时更新引用。您可能希望明确保留整个类
yo.app.R

-keepattributes InnerClasses

-keep class yo.app.R
-keep class yo.app.R$* {
    <fields>;
}
-keepattributes innerClass
-保持类yo.app.R
-保持类yo.app.R$*{
;
}

嗨!抱歉耽搁了。非常感谢您的详细帖子。1.不幸的是,try/catch不起作用,因为崩溃发生在远程视图内部。不在RemoteViews()构造函数或notificationManager.notify()2内。通知在应用程序启动后大约1秒内发布。我想知道我们需要等待多久的参考完成更新。谢谢你至少让我朝着这些方向思考。除非有人找到更好的出路,否则这笔赏金将属于你。我很抱歉不能给你一个简洁的答案,所以不要犹豫,把赏金给其他更有用的人。这是一个肮脏的解决方法,但您可以尝试在创建通知之前膨胀布局,如果没有引发,则触发真正的通知。我建议您使用WorkManager或AlarmManager进一步安排通知。对不起,非常感谢您的帮助。在发送通知之前检查布局膨胀是个好主意。如果我们要设法修复崩溃,我会让你知道。这是一个开源项目吗?如果是的话,我可以尝试克隆它并检查一些其他的东西,因为这个答案绝对不是一个完整的答案。谢谢你,你太棒了:)这是YoWindow天气应用程序。这是一个商业项目。我不介意和你分享代码。现在,从零开始在Android Studio中启动该项目是一项复杂的任务。我不想你把时间花在这上面。我希望我们能准时到达。