“android.app.ResourcesManager”中的Android ANR 示例 1:示例 2:示例 3:

问题描述

最近,我发现我的应用在 Google Play 管理中心中的 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:billing 从 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 的变通方法/解决方案?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)