Какие основные потоки (threads) существуют в архитектуре Flutter Embedder?

«Какие основные потоки (threads) существуют в архитектуре Flutter Embedder?» — вопрос из категории Платформенное взаимодействие, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Архитектура выполнения Flutter построена на нескольких изолированных потоках, которые взаимодействуют через механизм передачи сообщений. Это обеспечивает отзывчивый UI.

Ключевые потоки в Embedder:

  1. Платформенный поток (Platform Thread / Main Thread):

    • Это нативный поток ОС (например, основной поток UI в Android или iOS).
    • Здесь запускается FlutterEngine и обрабатываются вызовы платформенных каналов (Platform Channels).
    • Важно: Длительные операции (сеть, файлы) не должны выполняться здесь, чтобы не блокировать нативный UI.
  2. Поток UI (UI Thread / Runner Thread):

    • Главный поток выполнения Dart-кода. Здесь работает изолят Dart, в котором выполняется весь код приложения, включая build()-методы, бизнес-логику и обработку жестов.
    • Он не является тем же потоком, что и платформенный. Взаимодействие между ними происходит асинхронно через сообщения.
  3. Поток GPU (GPU Thread):

    • Отвечает за преобразование слоев визуализации (layer tree) в команды для графического API (OpenGL, Metal, Vulkan).
    • Работает параллельно с UI Thread. UI Thread подготавливает frame (кадр), а GPU Thread его рендерит.
  4. Поток ввода-вывода (IO Thread):

    • Обрабатывает ресурсоемкие задачи, которые не должны блокировать UI Thread, но не являются строго графическими. Например, декодирование изображений из формата png/jpg в raw перед передачей на GPU Thread.

Схема взаимодействия:

[Platform Thread] <--(Platform Channels)--> [UI Thread (Dart Isolate)]
                                                    |
                                                    | (Layer Tree)
                                                    v
                                            [GPU Thread]
                                                    ^
                                                    | (Raw Image Data)
                                           [IO Thread]

Практический вывод: Поскольку код Dart выполняется в одном изоляте (UI Thread), для выполнения CPU-интенсивных задач без блокировки интерфейса необходимо использовать изоляты Dart (Dart Isolates), которые являются аналогом потоков, но с разделяемой памятью.