Android 升级后立即膨胀正在进行的通知布局时崩溃。仅限安卓10
这件事在几个月前突然发生了。 只有安卓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,
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中启动该项目是一项复杂的任务。我不想你把时间花在这上面。我希望我们能准时到达。