升级后立即展开持续通知布局时崩溃。 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 优化的结果?
很遗憾,我们无法在本地重现崩溃。
您知道如何解决这些崩溃问题吗?
上下文
- 目标SDK:30
- 部署为 Android 应用程序包。
- minifyEnabled = true
- 这是一个 kotlin 多平台项目。
从您一直在解释的内容来看,资源引用似乎在应用启动时得到了更新。 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>;
}
它是几个月前突然发生的。 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 优化的结果?
很遗憾,我们无法在本地重现崩溃。
您知道如何解决这些崩溃问题吗?
上下文
- 目标SDK:30
- 部署为 Android 应用程序包。
- minifyEnabled = true
- 这是一个 kotlin 多平台项目。
从您一直在解释的内容来看,资源引用似乎在应用启动时得到了更新。 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>;
}