Какие изменения в Android 14 влияют на ANR в приложениях Flutter в фоновом режиме?

Вопрос или проблема

Я получаю отчеты 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, влияющие на фоновую работу

  1. Управление ресурсами и фоновые ограничения:
    В Android 14 Google усилила ограничения на использование ресурсов приложениями, работающими в фоновом режиме. Это может вызвать проблемы с производительностью и привести к ANR, если в вашем приложении осуществляется значительная работа в фоне, например, отслеживание местоположения или обработка уведомлений.

  2. Новые политики для фоновых задач:
    В Android 14 введены новые политики для работы с фоновой активностью и задачами. Приложения, которые используют интенсивные фоновые задачи (как ваша система отслеживания местоположения), могут сталкиваться с требованиями к оптимизации, что может приводить к большему количеству ANR.

  3. Ограничение на фоновый доступ к данным:
    Изменения в политике доступности данных могут повлиять на работу библиотеки Firestore, если она пытается получать данные в фоновом режиме. Это может вызывать задержки и, как следствие, ANR, если запросы выполняются синхронно или не обрабатываются надлежащим образом.

  4. Увеличенные временные пороги для фоновых задач:
    Android 14 мог увеличить временные пороги для выполнения фоновых задач, что в сочетании с вашим кода может привести к тому, что некоторые операции могут занимать слишком много времени, и приложение будет восприниматься как не отвечающее.

Рекомендации по устранению ANR

  1. Проверка фоновых задач:
    Проверьте, как ваша библиотека аналогичного местоположения (flutter_background_geolocation) обрабатывает фоновый доступ. Убедитесь, что фоновые задачи выполняются эффективно и не блокируют основной поток.

  2. Асинхронность запросов:
    Убедитесь, что все запросы к Firestore и другие операции ввода-вывода выполняются асинхронно. Используйте Future и async/await для обработки асинхронных операций.

  3. Лимитирование частоты запросов:
    Проверьте, чтобы расписание фоновых задач, таких как отслеживание местоположения, не было слишком частым. Убедитесь, что вы не вызываете слишком много операций за краткое время.

  4. Логи и мониторинг:
    Убедитесь, что у вас есть подходящий уровень логирования для фоновых задач. Это поможет вам выявить, где именно происходит задержка и какие операции могут блокировать основной поток.

  5. Производительность уведомлений:
    Проверьте реализацию уведомлений. Убедитесь, что они не блокируют основной поток или имеют долгую обработку, которая приводит к ANR.

  6. Тестирование на реальных устройствах:
    Так как проблема возникает только на Android 14 и выше, имеет смысл опробовать ваше приложение на реальном устройстве с этой версией операционной системы для детального анализа.

Заключение

В связи с новыми ограничениями Android 14 необходимо внимательно пересмотреть то, как ваше приложение взаимодействует с фоновыми задачами. Скрупулезное исследование каждого компонента, особенно связанных с фоновым отслеживанием местоположения и запросами к Firestore, может выявить узкие места и решить проблему ANR.

Оцените материал
Добавить комментарий

Капча загружается...