Вопрос или проблема
Вопрос
Возможно ли построить только пакет Flutter в режиме релиза, а затем ссылаться на (ссылку) его из артефакта сборки релизного приложения Flutter (libapp.so)?
Целевая среда
- Linux
- flutter 3.10.6 или новее
Предыстория
Я разрабатываю приложение Flutter (=appX). Это приложение состоит из нескольких локальных пакетов Flutter (=packageA, packageA’).
packageA и packageA’ предоставляют один и тот же интерфейс, но имеют разное поведение. appX использует только один из packageA и packageA’.
В настоящее время переменные dart-define определяют, использовать ли packageA или packageA’ при компиляции appX.
Тем не менее, я хотел бы переключаться между packageA и packageA’ с использованием следующей процедуры. (Причина, по которой я хочу это сделать, довольно сложна, поэтому я не буду углубляться в нее здесь.)
- Скомпилировать packageA и packageA’ в режиме релиза и создать файлы с одинаковым именем (packageA-selected.so)
- Во время установки решить, использовать ли packageA.so или packageA’.so, и установить packageA-selected.so, который будет использоваться.
- libapp.so использует packageA-selected.so при запуске.
Я хотел бы спросить, возможна ли такая процедура.
Спасибо!
Ответ или решение
Да, вы можете создавать Flutter-пакеты и использовать их в приложении Flutter. Ваша идея о разделении пакетов (packageA и packageA’) с разными реализациями и использовании одного из них в зависимости от условий установки интересна и вполне выполнимая задача.
Ниже приведены шаги для достижения вашей цели:
Шаг 1: Создание пакетов в режиме релиза
-
Создайте ваши пакеты (
packageA
иpackageA'
) как обычные Flutter-пакеты. Убедитесь, что они имеют одинаковый интерфейс, чтобы ваше приложение (appX
) могло ссылаться на них без изменений в коде. -
Соберите пакеты в режиме релиза. Вы можете сделать это, используя команду:
flutter build linux --release --target=path_to_your_packageA flutter build linux --release --target=path_to_your_packageA'
Это создаст соответствующие файлы
packageA.so
иpackageA'.so
в выходных директориях.
Шаг 2: Создание файла с требуемым именем
- Переименуйте скомпилированные файлы так, чтобы они имели одинаковое имя, как вы и планировали. Например, переименуйте их в
packageA-selected.so
. Это можно сделать с помощью командной строки:mv build/linux/x64/release/your_library/packageA.so build/linux/x64/release/your_library/packageA-selected.so mv build/linux/x64/release/your_library/packageA'.so build/linux/x64/release/your_library/packageA-selected.so
Шаг 3: Установка и использование
-
При установке вашего приложения (
appX
) решите, какой пакет использовать. В зависимости от ваших условий, вы должны выбрать нужныйpackageA-selected.so
для установки. -
Обновите
libapp.so
вашего приложения так, чтобы он ссылался наpackageA-selected.so
. Вы можете сделать это с помощью динамической загрузки библиотек. В вашем приложении, при инициализации, вы можете загрузить нужную библиотеку с помощью:import 'dart:ffi' as ffi; ffi.DynamicLibrary.open('path/to/packageA-selected.so');
Заключение
Этот процесс позволяет вам выбирать между разными реализациями пакетов без необходимости пересборки всего приложения, а только загружая нужную библиотеку в момент выполнения. Убедитесь, что ваши библиотеки правильно экспортируют функции и классы, которые использует ваше приложение.
Важные примечания
- Тестирование: Обязательно протестируйте приложение в различных сценариях, чтобы убедиться, что правильные библиотеки загружаются и функционируют как ожидается.
- Документация: Поскольку это немного нестандартный подход, убедитесь, что в вашем проекте есть хорошая документация для будущих разработчиков, которые могут работать с вашим кодом.
Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться! Удачи с вашим проектом!