AAssetManager_open Pixel/Pixel2 XL 上的死锁

AAssetManager_open deadlocks on Pixel/Pixel2 XL

我在 Beta 测试中发现 Pixel 和 Pixel 2 XL 均出现 ANR 运行 8.1。从我回来的日志中可以看出,对 AAssetManager_open 的调用被阻止等待互斥体解锁。

从日志中看不到线程冲突。在一台设备上,它发生在应用程序加载时读取的第三个资产上。所有这些都是独立的(并清理)但顺序的。另一个设备死锁是后来的。没有线程涉及相关代码。

我还没有在其他设备上遇到过这个问题,所以我什至无法在本地玩它以进一步了解(我没有任何设备)。从什么 Android 来源我可以找到锁定的互斥量并没有任何复杂的用法。

调用发生在主线程上(因此出现 ANR),所以我可以通过将它们移到那里来修补问题。不过,理想情况下,我想首先解决(或至少了解原因)这些设备上发生死锁的根本问题。

所以,我想知道是否有任何已知的方法可以用 AAssetManager_open 创建死锁?

附带一提,我发现的壁橱是一篇文章,其中提到人们在 Oreo 预发布版本中的 AAssetManager_open 上遇到了 ANR,但我找不到关于它的任何其他内容。

编辑:我知道在不同的 8.1 设备 (OnePlus5) 上发生崩溃,所以它似乎不是特定于 Pixel,而是一般的 8.1。

我还移动了 AssetManager 在主线程上读取的内容,以防万一,正如预期的那样,问题仍然存在(只是没有收到 ANR)。

编辑 #2:它特定于 8.1 和 AdMob 中介。

打开资产可能是阻塞操作。一些资产未压缩存储,AAssetManager_open() 可以 return 处理以就地使用 'file'。其他资产必须先解压缩到本地缓存才能使用。其中一些文件已经解压缩到您的磁盘,AAssetManager_open() 几乎会立即 return。其他的必须解压,这会和其他线程竞争CPU,运气不好会产生ANR。

最重要的是,尽量不要从 UI 线程打开资产。

死锁的原因可能是指向 AAssetManager 的无效指针。请确保您从 AAssetManager_fromJava 获得的指针仍然有效(未被 GC 破坏)。

link to AAssetManager_fromJava description