Подтвердить что ты не робот

"computeValuesWithHarfbuzz - нужно принудительно запустить один" в Android 4: что это значит?

мое приложение Android 4 генерирует длинные просмотры, добавляя несколько textviews к linearlayout. Это хорошо работает для всех моих элементов списка, кроме одного. Проблема состоит в том, что список textviews прерывается после добавления первого textview, но исключение не генерируется!

Я просто вижу это предупреждение в своем LogCat:

TextLayoutCache | computeValuesWithHarfbuzz - нужно принудительно пробег

Кто-нибудь знает, что это значит?

4b9b3361

Ответ 1

HarfBuzz - это механизм компоновки/форматирования шрифтов OpenType. Его цель - стандартизировать раскладку текста в проектах с открытым исходным кодом. Это предупреждение можно проследить до android/graphics/TextLayoutCache.cpp.

Соответствующий блок кода:

ubidi_setPara(bidi, chars, contextCount, bidiReq, NULL, &status); //runs the algorithm
int paraDir = ubidi_getParaLevel(bidi) & kDirection_Mask; // 0 if ltr, 1 if rtl

     if (U_SUCCESS(status) && rc == 1) {
           // Normal case: one run, status is ok
           isRTL = (paraDir == 1);
           useSingleRun = true;
      } else if (!U_SUCCESS(status) || rc < 1) {
           LOGW("computeValuesWithHarfbuzz -- need to force to single run");
           isRTL = (paraDir == 1);
           useSingleRun = true;
      } else {...}

Эта часть кода является частью алгоритма BiDi (uBiDi), который обозначает Unicode двунаправленный, как описано ниже здесь.

Данные на арабском, иврите или других языках RTL нуждаются в обработке двунаправленного текста. Поскольку эти скрипты справа налево используют цифры, написанные слева направо, текст фактически двунаправлен: смесь текста справа налево и слева направо.

rc в приведенном выше алгоритме runcount. Каждому символу юникода присваивается уровень. (Даже неназначенные)

Текст сначала разделяется на разные уровни (Уровень 0 - это простой текст на английском языке, Уровень 1 - простой арабский текст, возможно встроенный в текст на английском языке 0 и т.д.)

Выполнения теперь выполняются следующим образом.

 Levels:  0   0   0   1   1   1   2

 Runs:   <--- 1 ---> <--- 2 ---> <3>

Счет запуска в приведенном выше примере равен 3. Предупреждение выдается, если алгоритм BiDi не смог запустить хотя бы один раз. Существует много ошибок, которые могут привести к успешному запуску алгоритма. Любой из них мог вызвать предупреждение.

Однако, независимо от того, происходит ли предупреждение или нет, поведение кода точно идентично, за исключением предупреждения, зарегистрированного. Таким образом, это не должно влиять на работу приложения.