AAssetManager_open взаимоблокировки на Pixel / Pixel2 XL - PullRequest
0 голосов
/ 09 мая 2018

У меня есть в бета-тестах, которые получают ANR на Pixel, и Pixel 2 XL оба работают 8.1. Из журналов, которые я получаю, кажется, что вызов AAssetManager_open заблокирован, ожидая разблокировки мьютекса.

Из журнала нет заметных конфликтов потоков. На одном устройстве это происходит на третьем ресурсе, читаемом во время загрузки приложения. Все из которых являются отдельными (и очистить), но последовательно. Другое устройство тупик позже. Никакие темы не касаются связанного кода.

Мне еще не приходилось сталкиваться с этой проблемой на другом устройстве, поэтому я даже не могу поиграть с ним локально, чтобы понять дальше (у меня нет ни одного устройства). Из того, что я нашел в Android-источнике, заблокированный мьютекс не имеет ничего сложного в его использовании.

Вызовы происходят в главном потоке (отсюда и ANR), поэтому я могу исправить проблему, переместив их туда. В идеале, однако, я хочу исправить (или, по крайней мере, понять причину) основную проблему того, почему в первую очередь на этих устройствах происходит взаимоблокировка.

Итак, что меня интересует, есть ли какие-либо известные способы создания тупика с помощью AAssetManager_open?

Кстати, шкаф, который я нашел, - это отдельная статья, в которой упоминается прохождение людьми, получающими ANR на AAssetManager_open в предварительных сборках Oreo, но я не могу найти ничего другого по этому поводу.

Редактировать : Я знаю, что произошел сбой на другом устройстве 8.1 (OnePlus5), поэтому он не относится к пикселям, а к 8.1 вообще.

Я также перенес то, что AssetManager считывает в основном потоке, просто в случае, и, как и ожидалось, проблема все еще существует (просто не получайте ANR).

Редактировать # 2 : Это специфично для 8.1 с посредничеством AdMob.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Причиной тупика может быть неверный указатель на AAssetManager. Пожалуйста, убедитесь, что указатель, который вы получаете от AAssetManager_fromJava, все еще действителен (не был уничтожен GC).

ссылка на описание AAssetManager_fromJava

0 голосов
/ 09 мая 2018

Открытие актива может быть операцией блокировки. Некоторые активы хранятся без сжатия, и AAssetManager_open() может возвращать дескриптор для работы с «файлом» на месте. Другие ресурсы должны быть распакованы в локальный кеш, прежде чем их можно будет использовать. Некоторые из этих файлов уже будут распакованы на ваш диск, и AAssetManager_open() вернется почти мгновенно. Другие должны быть разархивированы, и это будет конкурировать за ЦП с другими потоками, создавая ANR, если вам не повезло.

Итог, сделайте все возможное, чтобы открывать ресурсы не из потока пользовательского интерфейса.

...