我在beta版测试中获得了Pixel上的ANR,而Pixel 2 XL都在运行8.1。从我回来的日志中看来,对AAssetManager_open的调用被阻止,等待互斥锁解锁。
从日志中看不出可识别的线程冲突。在一台设备上,它会在应用程序加载时读取第三个资产。所有这些都是分开的(并且是清理的)但是顺序的。另一个设备死锁是后来的。没有线程触及相关代码。
我还没有在另一台设备上遇到这个问题,所以我甚至无法在本地玩它以进一步了解(我没有任何设备)。从我可以找到的Android源代码中锁定的互斥锁没有任何复杂的用法。
调用发生在主线程(因此是ANR)上,所以我可以通过将它们移到那里来修补问题。但理想情况下,我想首先修复(或至少了解原因)这些设备上发生死锁的根本问题。
所以,我想知道的是,是否有任何已知的方法可以使用AAssetManager_open创建死锁?
另一方面,我发现的壁橱是一篇文章,提到人们在奥利奥预发布版本中传递人们在AAssetManager_open上获得ANR,但我找不到任何其他内容。
编辑:我知道在其他8.1设备(OnePlus5)上发生了崩溃,因此它看起来并不是Pixel特有的,而是一般的8.1。
我也移动了AssetManager在主线程上读取的内容,正如预期的那样,问题仍然存在(只是没有得到ANR)。
编辑#2 :具有AdMob中介的8.1特定。
答案 0 :(得分:0)
打开资产可能是阻止操作。某些资产以未压缩的方式存储,AAssetManager_open()
可以返回处理文件'到位。必须先将其他资产解压缩到本地缓存,然后才能使用它们。其中一些文件已经解压缩到您的磁盘,AAssetManager_open()
几乎会立即返回。其他人必须解压缩,这将与其他线程争夺CPU,如果你运气不好就会产生ANR。
最重要的是,尽力打开不是来自UI线程的资产。
答案 1 :(得分:0)
死锁的原因可能是指向AAssetManager
的无效指针。请确保您从AAssetManager_fromJava
获得的指针仍然有效(未被GC销毁)。