У меня есть приложение VOIP на Android, которое использует фоновые службы (startService). Фоновые службы отвечают за создание стека C / C ++ и управление жизненным циклом. Начиная с Android O, при доступе к локальному хранилищу потока наблюдаются сбои:
#00 pc 000000000004bba8 /system/lib/libc.so (tgkill+12)
#01 pc 000000000001aa13 /system/lib/libc.so (abort+54)
#02 pc 000000000001f2f9 /system/lib/libc.so (__libc_fatal+24)
#03 pc 000000000001aedd /system/lib/libc.so (__assert2+16)
#04 pc 00000000000808ed /data/app/com.myapp.system-TqIMuM73wCvczia_yKDs4g==/lib/arm/libpjsip.so (pj_thread_this+36)
#05 pc 000000000007ffb3 /data/app/com.myapp.system-TqIMuM73wCvczia_yKDs4g==/lib/arm/libpjsip.so (pj_log+610)
#06 pc 0000000000080215 /data/app/com.myapp.system-TqIMuM73wCvczia_yKDs4g==/lib/arm/libpjsip.so (pj_log_5+24)
#07 pc 0000000000087941 /data/app/com.myapp.system-TqIMuM73wCvczia_yKDs4g==/lib/arm/libpjsip.so (pj_timer_heap_destroy+28)
#08 pc 000000000007ad89 /data/app/com.myapp.system-TqIMuM73wCvczia_yKDs4g==/lib/arm/libpjsip.so (pj_dns_resolver_destroy+232)
#09 pc 00000000000dd418 /data/app/com.myapp.system-TqIMuM73wCvczia_yKDs4g==/lib/arm/libMyApp.so
#10 pc 00000000000dd69c /data/app/com.myapp.system-TqIMuM73wCvczia_yKDs4g==/lib/arm/libMyApp.so
Я использую библиотеку PJSIP, и она требует, чтобы поток был зарегистрирован перед использованием, если нет, то это не удается с утверждением. Он внутренне использует локальное хранилище потоков для управления регистрациями (pthread_getspecific, pthread_setspecific).
Я зарегистрировал все возможные потоки, которые могли обращаться к API pjsip, особенно: pj_dns_resolver_destroy. Но все же локальное хранилище потока считает, что оно не зарегистрировано. Это происходит только на Android 8.0 +.
Это заставляет меня задуматься, есть ли изменения в Android O, которые могут вызвать такое поведение.
Больше контекста:
1) pj_dns_resolver_destroy может быть вызван в двух случаях: при изменениях сети и при закрытии приложения, т.е. при остановке фоновой службы.
2) Я использую мониторинг сети на основе BroadcastReceiver для передачи событий изменения сети, которые могут вызвать pj_dns_resolver_destroy.
Дополнительная информация:
Жизненный цикл обслуживания обрабатывается упорядоченно. PJSIP предоставляет pj_thread_is_registered для проверки, зарегистрирован ли поток, если нет, мы регистрируем и утверждаем. Есть несколько способов, которыми мое приложение может вызывать pj_dns_resolver_destroy.
1) при изменениях сети, когда приложение находится на переднем плане или в фоновом режиме. Мы уничтожаем текущий распознаватель и создаем новый. Деструктор вызывает pj_dns_resolver_destroy после проверки регистрации потока для PJSIP.
2) При завершении работы приложения (может быть на переднем или на заднем плане) мы уничтожаем стек C ++ из метода службы OnDestroy.
Вопрос:
Есть ли какие-либо изменения в Android O w.r.t. поток локального хранилища или управление памятью с фоновыми службами w.r.t и т. д., которые могут вызвать такое поведение?