“android.app.ResourcesManager”中的 Android ANR

问题描述 投票:0回答:1

最近我发现我的应用程序的 Google Play Console 中的 ANR 显着增加。有针对不同类型原因的报告,但它们有一个共同点:
主线程和我的工作线程都被阻止,并且在访问“android.app.ResourcesManager”中的方法时,至少其中一个始终被阻止

示例1:

“main”prio=5 tid=1 已阻止

at android.app.ResourcesManager.getAdjustedDisplay (ResourcesManager.java:353)
at android.app.ContextImpl.getDisplayNoVerify (ContextImpl.java:2559)
at android.view.WindowManagerImpl.getDefaultDisplay (WindowManagerImpl.java:164)
at org.n277.lynxlauncher.helper.DeviceUtilities.updateSystemHelper (DeviceUtilities.java:225)
at org.n277.lynxlauncher.views.DragContainerFrameLayout.onApplyWindowInsets (DragContainerFrameLayout.java:231)
at android.view.View.dispatchApplyWindowInsets (View.java:11399)
at android.view.ViewGroup.dispatchApplyWindowInsets (ViewGroup.java:7393)
at android.view.ViewGroup.newDispatchApplyWindowInsets (ViewGroup.java:7418)
at android.view.ViewGroup.dispatchApplyWindowInsets (ViewGroup.java:7400)
at android.view.ViewGroup.newDispatchApplyWindowInsets (ViewGroup.java:7418)
...

“Lynx-Worker”prio=5 tid=17 已被阻止

at android.app.ResourcesManager.getOrCreateResources (ResourcesManager.java:865)
at android.app.ResourcesManager.getResources (ResourcesManager.java:982)
at android.app.ActivityThread.getTopLevelResources (ActivityThread.java:2411)
at android.app.ApplicationPackageManager.getResourcesForApplication (ApplicationPackageManager.java:1527)
at android.app.ApplicationPackageManager.getDrawable (ApplicationPackageManager.java:1277)
at android.app.ApplicationPackageManager.loadUnbadgedItemIcon (ApplicationPackageManager.java:2684)
at android.app.ApplicationPackageManager.loadItemIcon (ApplicationPackageManager.java:2655)
at android.content.pm.PackageItemInfo.loadIcon (PackageItemInfo.java:516)
at android.content.pm.ComponentInfo.loadDefaultIcon (ComponentInfo.java:256)
at android.app.ApplicationPackageManager.loadUnbadgedItemIcon (ApplicationPackageManager.java:2687)
at android.app.ApplicationPackageManager.loadItemIcon (ApplicationPackageManager.java:2655)
at android.content.pm.PackageItemInfo.loadIcon (PackageItemInfo.java:516)
at android.content.pm.LauncherActivityInfo.getIcon (LauncherActivityInfo.java:117)
at org.n277.lynxlauncher.visual.c.d.v (SourceFile:1)
at org.n277.lynxlauncher.visual.c.d.u (SourceFile:3)
...

主线程尝试使用“windowManager.getDefaultDisplay().getSize()”方法(适用于 Pre Android R 设备)获取用于测量的显示尺寸。工作线程尝试使用 LauncherActivityInfo 获取应用程序的图标。

示例2:

“main”prio=5 tid=1 已阻止

at android.view.WindowManagerImpl.getCurrentBounds (WindowManagerImpl.java:241)
at android.view.WindowManagerImpl.getCurrentWindowMetrics (WindowManagerImpl.java:235)
at org.n277.lynxlauncher.helper.DeviceUtilities.getUsableHeight (DeviceUtilities.java:190)
at org.n277.lynxlauncher.views.FullScreenFrameLayout.onMeasure (FullScreenFrameLayout.java:114)
at android.view.View.measure (View.java:25532)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure (FrameLayout.java:194)
at android.view.View.measure (View.java:25532)
at android.widget.RelativeLayout.measureChildHorizontal (RelativeLayout.java:735)
...

“Lynx-Worker”prio=5 tid=17 已被阻止

at android.app.ResourcesManager.createResources (ResourcesManager.java:846)
at android.app.ResourcesManager.getResources (ResourcesManager.java:947)
at android.app.ActivityThread.getTopLevelResources (ActivityThread.java:2296)
at android.app.ApplicationPackageManager.getResourcesForApplication (ApplicationPackageManager.java:1672)
at android.app.ApplicationPackageManager.getDrawable (ApplicationPackageManager.java:1437)
at android.app.ApplicationPackageManager.loadUnbadgedItemIcon (ApplicationPackageManager.java:2950)
at android.app.ApplicationPackageManager.loadUnbadgedItemIcon (ApplicationPackageManager.java:2953)
at android.app.ApplicationPackageManager.loadItemIcon (ApplicationPackageManager.java:2929)
at android.content.pm.PackageItemInfo.loadIcon (PackageItemInfo.java:271)
at android.content.pm.LauncherActivityInfo.getIcon (LauncherActivityInfo.java:119)
at org.n277.lynxlauncher.visual.c.d.v (SourceFile:1)
at org.n277.lynxlauncher.visual.c.d.u (SourceFile:3)
...

主线程再次尝试获取用于测量的显示尺寸,但这次使用 windowManager.getCurrentWindowMetrics()。工作线程再次尝试使用 LauncherActivityInfo 获取应用程序的图标。

示例3:

与示例 2 完全相同,但还有另一个通用线程与工作线程具有完全相同的跟踪。

对我来说,从多线程访问“android.app.ResourcesManager”类时,看起来确实存在某种死锁。 我怀疑“WindowManagerImpl.getCurrentBounds”也正在访问ResourcesManager,尽管它没有明确显示。但是,这在上次更新之前没有发生,并且我没有更改有关线程的任何内容。我唯一想到的是我更新了几个依赖项:

buildToolsVersion从30.0.0到30.0.2
com.android.billingclient:计费从 3.0.3 到 4.0.0
androidx.appcompat:appcompat从1.2.0到1.3.0
androidx.recyclerview:recyclerview从1.1.0到1.2.1

我怀疑的是,当同时从多个线程访问资源时,它现在会导致问题。然而,将应用程序图标加载移动到主线程中对我来说似乎并不明智,因为这会很容易阻塞该线程。对于“LauncherActivityInfo.getIcon”方法,很明显它必须访问资源才能获取应用程序的图标(尽管不是调用该方法的应用程序的资源,而是从应加载图标的应用程序) 。然而,许多其他任务也在工作线程中执行,并且许多调用的 API 方法也可以在内部访问资源,尽管这并不明显。

还有其他人遇到过此类问题吗? (更新上述依赖项之一后)。 或者有人找到了针对此特定 ANR 的解决方法/解决方案吗?

android multithreading android-anr-dialog
1个回答
0
投票

Android 11 在我的应用程序的 GooglePlay Console 中看起来更加严肃

© www.soinside.com 2019 - 2024. All rights reserved.