1

我有在 Pixel 和 Pixel 2 XL 上都运行 8.1 的 beta 测试。从我回来的日志来看,对 AAssetManager_open 的调用似乎被阻止等待互斥锁解锁。

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

我还没有在另一台设备上遇到这个问题,所以我什至无法在本地玩它以进一步了解(我没有任何设备)。从 Android 源代码中,我发现互斥锁的使用没有任何复杂性。

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

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

在旁注中,我发现的壁橱是一篇文章,其中提到在奥利奥预发布版本中,人们在 AAssetManager_open 上获得 ANR,但我找不到其他任何内容。

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

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

编辑#2:它特定于带有 AdMob 中介的 8.1。

4

2 回答 2

0

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

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

于 2018-05-09T14:11:31.987 回答
0

The reason of deadlock can be invalid pointer to AAssetManager. Please make sure, that pointer which you get from AAssetManager_fromJava is still valid (was not destroyed by GC).

link to AAssetManager_fromJava description

于 2018-06-08T15:14:05.677 回答