Вопрос или проблема
Я получаю отчеты ANR в Crashlytics, когда приложение работает в фоновом режиме, но это происходит только на версии Android >=14. К сожалению, я не могу воспроизвести это на эмуляторе, и у меня нет устройства с Android 14.
Отчет не указывает ни на один конкретный нативный метод, который я мог бы связать с функционалом моего приложения.
Основные функции, которые использует мое приложение и которые могут быть связаны с Background ANR:
- отслеживание местоположения
- локальные и push-уведомления
- Firebase Firestore
Ниже представлена текстовая версия отчета об ошибке
main (native):tid=1 systid=12610
#00 pc 0xc7d28 libc.so (__epoll_pwait + 8) (BuildId: 1d36f8ae6e0af6158793abea7d4f4f2b)
#01 pc 0xfc28 libutils.so (android::Looper::pollOnce + 184) (BuildId: c07f08c7e5a964a8f8c6bc5c820fb795)
#02 pc 0x18c53c libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce + 44) (BuildId: e0fc1ccfe043ab286e745f48696bc0d8)
at android.os.MessageQueue.nativePollOnce(Native method)
at android.os.MessageQueue.next(MessageQueue.java:349)
at android.os.Looper.loopOnce(Looper.java:189)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8592)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
Список зависимостей, которые я использую
dependencies:
address: ^0.1.0+2
flutter:
sdk: flutter
battery_plus: ^5.0.1
cached_network_image: ^3.1.0
confetti: ^0.7.0
dartx: ^1.2.0
flutter_osm_plugin: ^1.3.0
dropdown_search: ^5.0.6
email_validator: ^2.1.16
easy_localization: ^3.0.0
cloud_firestore: ^4.9.0
firebase_analytics: ^10.2.1
flutter_card_swiper: ^6.0.0
firebase_auth: ^4.2.6
firebase_dynamic_links: ^5.0.12
firebase_core: ^2.24.2
firebase_crashlytics: ^3.0.12
firebase_database: ^10.0.10
firebase_messaging: ^14.2.2
firebase_performance: ^0.9.2+7
firebase_storage: ^11.0.11
flutter_picker_plus: ^1.2.0
fl_chart: ^0.68.0
flutter_background_geolocation: ^4.15.5
duration_picker:
path: packages/duration_picker
flutter_spinkit: ^5.1.0
flutter_image_compress: ^2.1.0
flutter_stripe: ^9.6.0
flutter_bloc: ^8.1.3
flutter_polyline_points: ^2.0.0
flutter_local_notifications: ^17.2.2
flutter_rating_bar: ^4.0.0
flutter_riverpod: ^2.3.7
flutter_staggered_grid_view: ^0.7.0
flutter_svg: ^2.0.9
fluttertoast: ^8.0.8
flutter_chat_types: ^3.6.2
logging: ^1.2.0
#geolocator: ^8.2.1
get_it: ^7.2.0
google_fonts: ^4.0.4
google_maps_flutter: ^2.5.0
google_maps_place_picker_mb: ^3.1.2
google_sign_in: ^6.1.6
hive_flutter: ^1.1.0
http: ^1.2.0
image_picker: ^1.0.4
location: ^5.0.0
lottie: ^2.3.2
percent_indicator: ^4.2.3
permission_handler: ^11.0.1
shared_preferences: ^2.0.17
share_plus: ^7.2.1
rxdart: ^0.27.7
sign_in_with_apple: ^6.1.2
# tflite_flutter: ^0.9.0
url_launcher: ^6.0.18
diacritic: ^0.1.4
device_info_plus: ^9.0.2
path_provider: ^2.0.5
flash: ^3.0.5+2
uuid: ^4.3.3
webview_flutter: ^4.4.2
flutter_date_pickers: ^0.4.3
meta: ^1.8.0
# date_time_picker: ^2.1.0
# flutter_datetime_picker:
# git:
# url: https://github.com/Realank/flutter_datetime_picker.git
# ref: master
smooth_page_indicator: ^1.0.0+2
showcaseview: ^3.0.0
package_info_plus: ^5.0.1
version: ^3.0.2
cupertino_icons: ^1.0.3
flutter_custom_clippers: ^2.0.0
barcode_widget: ^2.0.4
flutter_countdown_timer: ^4.1.0
flutter_widget_from_html_core: ^0.14.9
tutorial_coach_mark: ^1.2.11
flutter_typeahead: ^5.2.0
community_charts_flutter: 1.0.1
stacked: ^3.4.0
# day_picker: ^2.2.0
time_range: ^1.1.0
flutter_chat_ui: ^1.6.6
firebase_remote_config: ^4.2.6
collection: ^1.15.0-nullsafety.4
geolocator: 10.1.1
app_settings: ^5.1.1
firebase_in_app_messaging: ^0.7.5+7
firebase_app_installations: ^0.2.5+7
pointer_interceptor: ^0.10.1+2
mapbox_search: any
polyline_codec: ^0.1.6
dependency_overrides:
package_info_plus: ^4.1.0
google_api_headers: ^3.2.1
web: ^1.0.0
flutter_osm_web: ^1.3.0
google_maps_flutter_platform_interface: ^2.9.2
# firebase_core_platform_interface: ^4.8.0
#test_api: 0.4.18
# stripe_android: "9.5.0+1"
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.1.2
flutter_launcher_icons: ^0.13.1
lint: ^2.0.20
dependency_validator: ^3.2.2
Есть ли идеи, что может вызывать это?
Некоторые изображения из Crashlytics
Ответ или решение
С учетом изменений в Android 14 и их воздействием на ваше Flutter-приложение в фоновом режиме, важно рассмотреть несколько аспектов, которые могут приводить к проблемам с ANR (Application Not Responding).
Изменения в Android 14, влияющие на фоновую работу
-
Управление ресурсами и фоновые ограничения:
В Android 14 Google усилила ограничения на использование ресурсов приложениями, работающими в фоновом режиме. Это может вызвать проблемы с производительностью и привести к ANR, если в вашем приложении осуществляется значительная работа в фоне, например, отслеживание местоположения или обработка уведомлений. -
Новые политики для фоновых задач:
В Android 14 введены новые политики для работы с фоновой активностью и задачами. Приложения, которые используют интенсивные фоновые задачи (как ваша система отслеживания местоположения), могут сталкиваться с требованиями к оптимизации, что может приводить к большему количеству ANR. -
Ограничение на фоновый доступ к данным:
Изменения в политике доступности данных могут повлиять на работу библиотеки Firestore, если она пытается получать данные в фоновом режиме. Это может вызывать задержки и, как следствие, ANR, если запросы выполняются синхронно или не обрабатываются надлежащим образом. -
Увеличенные временные пороги для фоновых задач:
Android 14 мог увеличить временные пороги для выполнения фоновых задач, что в сочетании с вашим кода может привести к тому, что некоторые операции могут занимать слишком много времени, и приложение будет восприниматься как не отвечающее.
Рекомендации по устранению ANR
-
Проверка фоновых задач:
Проверьте, как ваша библиотека аналогичного местоположения (flutter_background_geolocation
) обрабатывает фоновый доступ. Убедитесь, что фоновые задачи выполняются эффективно и не блокируют основной поток. -
Асинхронность запросов:
Убедитесь, что все запросы к Firestore и другие операции ввода-вывода выполняются асинхронно. ИспользуйтеFuture
иasync/await
для обработки асинхронных операций. -
Лимитирование частоты запросов:
Проверьте, чтобы расписание фоновых задач, таких как отслеживание местоположения, не было слишком частым. Убедитесь, что вы не вызываете слишком много операций за краткое время. -
Логи и мониторинг:
Убедитесь, что у вас есть подходящий уровень логирования для фоновых задач. Это поможет вам выявить, где именно происходит задержка и какие операции могут блокировать основной поток. -
Производительность уведомлений:
Проверьте реализацию уведомлений. Убедитесь, что они не блокируют основной поток или имеют долгую обработку, которая приводит к ANR. -
Тестирование на реальных устройствах:
Так как проблема возникает только на Android 14 и выше, имеет смысл опробовать ваше приложение на реальном устройстве с этой версией операционной системы для детального анализа.
Заключение
В связи с новыми ограничениями Android 14 необходимо внимательно пересмотреть то, как ваше приложение взаимодействует с фоновыми задачами. Скрупулезное исследование каждого компонента, особенно связанных с фоновым отслеживанием местоположения и запросами к Firestore, может выявить узкие места и решить проблему ANR.