Создание нативной Android библиотеки с Flutter модулем
Build native Android library with a Flutter dependency
Создание Android библиотеки(aar) из Flutter модуля
English version (WIP): https://medium.com/@askarsyzdykov/creating-native-android-library-from-flutter-project-9b8a58b165d1
Данная статья будет полезна тем, кто собирается создать или уже создал Flutter приложение/модуль с возможностью его встраивания в нативные приложения клиентов без предоставления исходного кода.
В этой статье будет рассмотрен способ встраивания библиотеки разработанной на фреймворке Flutter в нативное приложение Android, добавление сторонних плагинов и встречающиеся проблемы при компиляции Android archive (aka “aar”) файла.

Для дальнейшей работы на вашем компьютере должны быть установлены:
- Flutter , подробную информацию по установке на разные ОС можно найти в официальной документации.
- Android Studio 3.5 или выше
- JDK 1.8
Оглавление:
- Создание Android проекта.
- Настройка окружения Flutter.
- Создание Flutter модуля.
- Компиляция Flutter модуля.
- Компиляция нативного модуля.
- Добавление Activity в нативный модуль.
- Компиляция fat-aar и добавление готовой библиотеки в другой проект.
- Добавление стороннего плагина во Flutter модуль.
- Возможные проблемы.
- Заключение.
- Создание проекта.
Начнем с создания Android проекта, для этого в Android Studio выбираем Start a new Android project → Empty Activity

Создание Android проекта
Проект создан, теперь добавим в него библиотеку, для этого необходимо открыть меню File → New → New module → Android library.

Добавление нативной библиотеки
В итоге у вас должна получиться вот такая структура проекта:

Структура проекта
- app — это наше тестовое приложение;
- library — это нативная библиотека, в которую позже будет добавлен Flutter модуль;
- Это файл app/build.gradle, в который мы добавили зависимость от нативной библиотеки
С нативной частью мы пока закончили, переходим к созданию Flutter модуля.
2. Настройка окружения Flutter.
Данная статья написана 5 сентября 2019 года. На данный момент Flutter SDK не поддерживает сборку aar файлов в stable канале, поэтому для продолжения необходимо переключиться на версию Flutter 1.10.3 с помощью следующих команд в терминале:
$ flutter version v1.10.3
$ flutter upgrade
Эти команды могут выполняться очень долго, запаситесь терпением :) После успешного выполнения команды flutter upgrade, нужно убедиться, что все сделали правильно, для этого выполним команду:
$ flutter doctor
Результат выполнения команды должен быть примерно таким:
[✓] Flutter (Channel unknown, v1.10.3, on Mac OS X 10.14.6 18G95, locale en-US)
3. Создание Flutter модуля.
Теперь перейдем в терминале в папку с проектом и выполним следующую команду:
$ flutter create -t module --androidx --org com.example flutter_library
1. flutter_library — это название модуля. Запомните его, оно пригодится нам далее.
2. com.example — название пакета.
3. Обратите внимание, что используется флаг “--androidx”, с его помощью создается Android модуль с поддержкой AndroidX. Рекомендую указывать его, т.к. многие плагины уже используют компоненты AndroidX.

Структура проекта после добавления Flutter модуля
Flutter модуль добавлен в проект, но пока еще нет связи между ними. Чтобы их связать добавьте в файл settings.gradle (находится в корневой директории проекта) следующие строки:
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir.parentFile,
'flutter_library/.android/include_flutter.groovy'
))
Обратите внимание в коде выше используется flutter_library — это название Flutter модуля, который мы добавили ранее.
В итоге должен получиться такой файл settings.gradle

settings.gradle
Теперь в Android Studio нужно нажать на кнопку Sync Project with Gradle Files, чтобы синхронизировать зависимости. Если все сделали правильно, то у директории Flutter появится иконка папки с тремя полосками, как показано ниже:

4. Компиляция Flutter модуля.
Чтобы скомпилировать Flutter модуль необходимо перейти в директорию модуля, в моем случае это flutter_library, и выполнить следующую команду:
$ flutter build aar
5. Компиляция нативного модуля
Чтобы собрать нативную библиотеку, необходимо выполнить в корневой папке проекта команду:
$ ./gradlew assemble
После завершения сборки откройте файл library/build.gradle и добавьте зависимость от Flutter модуля, как показано на изображении:

6. Добавление Activity в нативный модуль.
Чтобы отобразить view из Flutter модуля, необходимо добавить активити в нативный модуль “library”:

Добавление Activity в нативный модуль
После создания LibraryActivity, необходимо заменить код в методе onCreate на код представленный ниже:
[embed]
7. Компиляция fat-aar и добавление готовой библиотеки в другой проект
Если скомпилировать библиотеку сейчас, то в ней не будет классов необходимых для правильной работы Flutter, поэтому нам нужно собрать aar файл, который будет содержать в себе все нужные зависимости, его и называют fat-aar. Для его компиляции я воспользовался этим плагином. На момент написания этой статьи доступна версия 1.2.6. Я не буду дублировать инструкцию по настройке данного плагина, вы можете найти его здесь. После настройки плагина необходимо еще раз выполнить команду:
$ ./gradlew assemble
Готовые к использованию aar файлы (debug и release) будет находиться в директории /library/build/outputs/aar. Если вы откроете library-debug.aar, то его структура должна быть примерно как на этом изображении:

Теперь можно добавить наш aar в другой проект, сделать это можно в меню File → New → New module → Import .JAR/.AAR Package и указать путь к скомпилированному aar файлу. Все что осталось сделать, это добавить открытие LibraryActivity из вашего проекта.

Открытие LibraryActivity из нативного Android проекта
8. Добавление стороннего плагина во Flutter модуль.
Если ваш Flutter модуль будет использовать сторонние плагины, то для того чтобы код этих плагинов попал в итоговый aar, необходимо:
- Добавить зависимость в файл flutter_library/pubspec.yaml
- В директории flutter_library выполнить команды:
$ flutter pub get
$ flutter clean
$ flutter build aar
-
В Android Studio нажать на кнопку Sync Project with Gradle Files
-
В файле library/build.gradle добавить
dependencies {
// your dependencies
...
embed project(path: ":vibrate", configuration: "default")
}
9. Возможные проблемы.
- Вероятно вам потребуется указать в app/build.gradle совместимость с Java 8
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
-
Если вы используете Flutter плагины, то необходимо убедиться, что версия Gradle плагина не ниже 3.2.1, а gradle wrapper 5.4.1. В нашем примере используется плагин vibrate.
-
Ещё во время выполнения команды flutter build aar -v вы можете столкнуться с ошибкой:
[ +699 ms] Oops; flutter has exited unexpectedly.
[+2140 ms] Crash report written to /Users/username/Development/flutter/.pub-cache/hosted/pub.dartlang.org/native_device_orientation-0.2.0/flutter_02.log;
[ ] please let us know at https://github.com/flutter/flutter/issues.
[ +32 ms] FAILURE: Build failed with an exception.
[ ] * Where:
[ ] Script '/Users/username/Development/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 929
[ ] * What went wrong:
[ ] Execution failed for task ':flutter:buildPluginReleaseNativeDeviceOrientation'.
[ ] > Process 'command '/Users/username/Development/flutter/bin/flutter'' finished with non-zero exit value 1
[ ] * Try:
[ ] Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
[ ] * Get more help at https://help.gradle.org
[ ] Initializing gradle...
[ ] Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
[ ] See https://docs.gradle.org/4.6/userguide/command_line_interface.html#sec:command_line_warnings
[ ] BUILD FAILED in 27s
Как видно из сообщения это связано с плагином native_device_orientation. Откройте файл {your_flutter_home_path}/.pub-cache/hosted/pub.dartlang.org/native_device_orientation-0.2.0/flutter_02.log:
Flutter crash report; please file at https://github.com/flutter/flutter/issues.
## command
flutter build aar --quiet --suppress-analytics --output-dir /Users/username/Projects/did_test_stable/flutter_lib/build/host --release
## exception
ProcessException: ProcessException: Permission denied
Command: /Users/username/Development/flutter/.pub-cache/hosted/pub.dartlang.org/native_device_orientation-0.2.0/android/gradlew -v
...
В моём случае была ошибка в том, что у системы не было разрешения на использование программы gradlew. Чтобы исправить эту ошибку необходимо выполнить следующую команду:
$ chmod +x {your_flutter_home_path}/.pub-cache/hosted/pub.dartlang.org/native_device_orientation-0.2.0/android/gradlew
10. Заключение.
Добавление Flutter модуля в существующее приложение на данный момент находится в master канале и работает еще не очень стабильно. Тем не менее уже сейчас можно встраивать Flutter модули в ваши проекты.
Ознакомиться с тестовым проектом можно по ссылке — https://github.com/askarsyzdykov/native_flutter_lib
Ссылки:
- Добавление Flutter модуля в существующее приложение: https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps
- Плагин для генерации fat-aar: https://github.com/kezong/fat-aar-android
- Официальный сайт Flutter: https://flutter.io
- Инструкция по установке Flutter: https://flutter.dev/docs/get-started/install
메타데이터
- post_id
- a124ffcd758
- slug
- android-lib-with-flutter-module-a124ffcd758
- url
- https://medium.com/@askarsyzdykov/android-lib-with-flutter-module-a124ffcd758
- canonical_url
- https://medium.com/@askarsyzdykov/android-lib-with-flutter-module-a124ffcd758
- author_url
- https://medium.com/@askarsyzdykov
- status
- ok
- fetched_at
- 2026-07-29 19:10:59