안녕하세요! Flutter로 모바일, 웹, 데스크톱 앱을 만들며 크로스 플랫폼의 강력함을 경험하고 계실 텐데요. 여기서 한 걸음 더 나아가, 여러분의 Flutter 앱을 라즈베리 파이나 젯슨 나노 같은 임베디드 장치에서 구동하는 상상, 해보셨나요? 오늘은 바로 그 새로운 가능성을 열어주는 flutter-elinux
에 대해 깊이 알아보려 합니다.
flutter-elinux
는 Sony가 개발한 비공식 Flutter SDK 확장 도구로, 임베디드 리눅스(eLinux) 환경에서 Flutter 앱을 빌드하고 디버깅할 수 있게 해줍니다. 덕분에 우리는 익숙한 Flutter의 개발 속도와 유연성을 임베디드 세계로 가져와, 풍부하고 매력적인 UI를 구현할 수 있게 되었습니다.
flutter-elinux
, 무엇이 특별할까요?
flutter-elinux
는 임베디드 시스템의 까다로운 요구사항을 만족시키기 위해 여러 인상적인 강점을 갖추고 있습니다.
- 임베디드에 최적화된 경량 설계: 일반 리눅스 데스크톱 환경(X11, GTK 기반)보다 훨씬 가볍고, 최소한의 라이브러리만 사용하도록 설계되었습니다. 제한된 리소스의 임베디드 기기에서 시스템 부하를 줄이며 높은 성능을 발휘할 수 있는 비결이죠.
- 폭넓은 아키텍처 지원:
arm64
와x64
아키텍처를 모두 지원하여 라즈베리 파이, 젯슨 나노 등 다양한 임베디드 보드와 뛰어난 호환성을 자랑합니다.
- 강력한 크로스 빌딩: 개발용 PC(x64)에서 타겟 임베디드 기기(arm64)를 위한 실행 파일을 빌드할 수 있습니다. 타겟 기기에 직접 개발 환경을 구축하기 어려운 임베디드 개발의 생산성을 극적으로 향상시켜 줍니다.
- 유연한 디스플레이 백엔드 지원: Wayland를 기본으로 사용하며, DRM(Direct Rendering Module)과 X11도 지원합니다. 다만 X11은 디버깅 용도로만 사용하고, 실제 제품에는 Wayland나 DRM을 사용하는 것이 권장됩니다.
- 플러그인 생태계와 API 호환성:
flutter-elinux-plugins
저장소를 통해 카메라, 비디오 플레이어 등 필수 플러그인을 제공합니다. 또한 공식 플러그인과 API 호환성을 유지하고, MethodChannel/EventChannel 같은 핵심 API도 동일하게 작동하여 일관된 개발 경험을 보장합니다. - 편리한 원격 개발 지원:
custom-devices
기능을 통해 원격 타겟 장치에 앱을 설치하고 디버깅하는 워크플로우를 완벽하게 지원합니다. 이 기능은 잠시 후에 더 자세히 살펴보겠습니다.
flutter-elinux
시작하기
자, 이제 flutter-elinux
를 직접 사용해볼까요?
1. 설치 준비
- 운영체제:
flutter-elinux
는 공식적으로 리눅스 데스크톱(Ubuntu 20.04 이상 권장) 환경을 필요로 합니다. 하지만 리눅스 PC가 없어도 괜찮습니다. Windows 사용자라면 WSL(Windows Subsystem for Linux)을 사용하여 Windows 내에서 리눅스 환경을 손쉽게 구축할 수 있습니다.
- WSL이란?: WSL은 Windows에서 네이티브 리눅스 바이너리 실행 파일을 직접 실행할 수 있게 해주는 기능입니다. 별도의 가상 머신 없이도 리눅스 커널과 상호작용하며, 거의 완벽한 리눅스 환경을 제공하여 개발 생산성을 크게 높여줍니다.
- WSL2 설치 및 설정:
flutter-elinux
개발 환경, 특히 Docker와의 원활한 연동을 위해서는 WSL2가 필수적입니다.- 설치: Windows PowerShell이나 명령 프롬프트를 관리자 권한으로 열고, 다음 명령어를 입력하면 WSL과 최신 Ubuntu 배포판이 WSL2 버전으로 설치됩니다.
$ wsl --install
버전 확인 및 업그레이드: 이미 WSL을 사용하고 있었다면, 아래 명령어로 현재 설치된 배포판의 버전이 2인지 확인하세요.
$ wsl -l -v
만약 VERSION이 1이라면,wsl --set-version <배포판_이름> 2
명령어를 통해 WSL2로 업그레이드할 수 있습니다. - 초기 설정: 설치가 완료되면 Windows 시작 메뉴에서 Ubuntu를 찾아 실행하고, 초기 사용자 설정(사용자 이름 및 암호)을 마치면 모든 준비가 끝납니다. 이제 여러분의 Windows PC에서
flutter-elinux
를 사용할 준비가 되었습니다.
- 설치: Windows PowerShell이나 명령 프롬프트를 관리자 권한으로 열고, 다음 명령어를 입력하면 WSL과 최신 Ubuntu 배포판이 WSL2 버전으로 설치됩니다.
- 필수 라이브러리 설치: 터미널에서 아래 명령어로 필요한 도구들을 설치합니다.
$ sudo apt-get update
$ sudo apt-get install unzip curl clang cmake pkg-config
2.flutter-elinux
설치
flutter-elinux
를 /opt
디렉토리에 설치하여 시스템 전역에서 사용하도록 설정합니다.
- 리포지토리 클론 및 이동:
WSL 터미널에서flutter-elinux
코드를 홈 디렉토리에 내려받은 후,/opt
디렉토리로 이동시킵니다.
$ cd ~
$ git clone https://github.com/sony/flutter-elinux.git
$ sudo mv flutter-elinux /opt/
- PATH 설정:
/opt/flutter-elinux
의bin
폴더를 PATH 환경 변수에 추가합니다.
$ export PATH="$PATH:/opt/flutter-elinux/bin"
팁: 터미널을 재시작할 때마다 이 설정을 유지하려면, WSL 터미널에서
nano ~/.bashrc
또는nano ~/.zshrc
명령어로 쉘 설정 파일을 열고 맨 아래에 위export
라인을 추가한 후 저장해주세요.
3. 설치 확인
아래 명령어로 설치가 잘 되었는지 확인합니다. elinux-wayland
와 elinux-x11
장치가 보이면 성공입니다.
$ flutter-elinux devices
4. 프로젝트 생성 및 실행
- 새 프로젝트 생성: 일반 Flutter 프로젝트처럼
create
명령어를 사용합니다.
$ flutter-elinux create my_elinux_app
- 기존 프로젝트에 적용: 이미 프로젝트가 있다면, 해당 디렉토리로 이동해 아래 명령어로
elinux
지원을 추가할 수 있습니다.
$ flutter-elinux create .
- 샘플 앱 실행: Wayland 환경에서 앱을 실행해봅시다.
- 네이티브 리눅스 환경: Wayland 컴포지터(예: Sway, Weston)가 먼저 설치되고 실행되어 있어야 합니다.
- WSL 환경 (Windows 11): 최신 버전의 WSL은 GUI 앱을 지원하는 WSLg가 기본적으로 포함되어 있습니다. WSLg는 자체적으로 Wayland 서버를 내장하고 있으므로, 별도의 컴포지터를 설치할 필요 없이 바로 Wayland 앱을 실행할 수 있습니다. Linux GUI 앱이 마치 네이티브 Windows 앱처럼 창으로 나타나는 편리함을 경험할 수 있습니다.
아래 명령어로 앱을 실행합니다.
$ cd my_elinux_app
$ flutter-elinux run -d elinux-wayland
심화 활용: 크로스 빌딩과 원격 디버깅
flutter-elinux
의 진정한 힘은 개발 PC와 임베디드 기기를 넘나드는 크로스 빌딩과 원격 디버깅에서 드러납니다. 이 기능들은 임베디드 개발의 효율을 극적으로 높여주는 핵심입니다.
크로스 빌딩: 내 PC에서 임베디드 앱 빌드하기 (Docker + WSL)
크로스 빌딩은 개발 PC(x64)에서 타겟 임베디드 기기(arm64)용 실행 파일을 빌드하는 기술입니다. Windows 환경의 WSL 사용자를 기준으로, Docker를 활용해 크로스 빌딩 환경을 구축하는 방법을 자세히 알아보겠습니다.
1. Docker Desktop 설정
앞서 설명한 WSL2 환경이 준비되었다면, 이제 크로스 빌딩을 위해 Docker Desktop을 설정할 차례입니다. Docker는 컨테이너 기술을 통해 독립된 개발 환경을 손쉽게 만들어주는 강력한 도구입니다.
- Docker Desktop 설치: Docker Desktop 공식 다운로드 페이지에서 Windows용 설치 파일을 받아 화면 지시에 따라 설치를 완료합니다. 설치 과정에서 "Use WSL 2 instead of Hyper-V" 옵션이 선택되어 있는지 확인하는 것이 좋습니다.
- WSL 통합 설정: Docker Desktop 설치 후, Settings > Resources > WSL Integration 메뉴로 이동합니다. "Enable integration with my default WSL distro"를 켜고, Docker를 사용하려는 특정 배포판(예: Ubuntu)의 스위치를 활성화해주세요. "Apply & Restart" 버튼을 누르면 설정이 적용되며, 이제 WSL 터미널에서
docker
명령어를 바로 사용할 수 있습니다.
2. 크로스 빌딩 환경 구축 (Docker + QEMU)
x64 아키텍처의 PC에서 arm64용 코드를 컴파일하고 실행하기 위해, 호스트에는 크로스 컴파일러를, Docker 내부에는 QEMU 에뮬레이터와 타겟 시스템의 라이브러리(Sysroot)를 설정합니다.
- 호스트(WSL)에 크로스 컴파일 도구 설치:
먼저 WSL 터미널에 ARM64용 크로스 컴파일러를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
- QEMU 설정:
다른 아키텍처의 Docker 이미지를 실행하기 위해, WSL 터미널에서 아래 명령어로 QEMU 핸들러를 등록합니다. (최초 한 번만 실행)
$ sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- ARM64 Sysroot 생성:
이제 arm64용 Docker 이미지를 실행하여 빌드에 필요한 라이브러리 모음(Sysroot)을 만듭니다.
- Docker 컨테이너 실행: 타겟 환경과 유사한
ubuntu:20.04
이미지를 예시로 사용합니다.--platform
플래그로 아키텍처를 명시합니다.$ sudo docker run --platform linux/arm64 -itd --name arm64-builder arm64v8/ubuntu:20.04 $ sudo docker exec -it arm64-builder /bin/bash
- 컨테이너 내 라이브러리 설치: 컨테이너에 접속된 상태에서, 임베디드 환경 빌드에 필요한 라이브러리들을 설치합니다.
참고: 라이브러리 설치 중 시간대(Timezone) 설정 프롬프트가 나타날 수 있습니다. 만약 잘못 설정했거나 변경이 필요하다면,$ apt-get update $ apt-get install -y clang cmake build-essential pkg-config \ libegl1-mesa-dev libxkbcommon-dev libgles2-mesa-dev \ libwayland-dev wayland-protocols libdrm-dev libgbm-dev \ libinput-dev libudev-dev libsystemd-dev libfontconfig1-dev
dpkg-reconfigure tzdata
명령어를 실행하여Asia
>Seoul
순서로 다시 설정할 수 있습니다. - Sysroot 복사: 설치가 끝나면
exit
로 컨테이너를 빠져나온 후, 컨테이너 안의 파일 시스템을 WSL 환경으로 복사합니다.$ sudo docker cp arm64-builder:/ ./ubuntu20-arm64-sysroot
3. 앱 크로스 빌딩 실행
모든 준비가 끝났습니다. 이제 flutter-elinux
명령어로 앱을 빌드합니다. --target-compiler-triple
옵션을 추가하여 크로스 컴파일러를 명시해주는 것이 중요합니다.
$ flutter-elinux build elinux --target-arch=arm64 --target-compiler-triple=aarch64-linux-gnu --target-sysroot=<Absolute_path_to>/ubuntu20-arm64-sysroot --debug
<Absolute_path_to>
부분은 위에서 Sysroot를 복사한 디렉토리의 절대 경로로 변경해야 합니다. (예:/home/user/my_elinux_app/ubuntu20-arm64-sysroot
)- 문제 해결: 만약 빌드 중
bits/c++config.h
파일을 찾지 못하는 오류가 발생하면,--system-include-directories
옵션을 추가하여 호스트의 C++ 헤더 경로를 직접 지정해 해결할 수 있습니다.
# 예시: g++-aarch64-linux-gnu 9.x 버전을 사용하는 경우
$ flutter-elinux build elinux --target-arch=arm64 \
--target-sysroot=<Absolute_path_to>/ubuntu20-arm64-sysroot \
--target-compiler-triple=aarch64-linux-gnu \
--system-include-directories=/usr/aarch64-linux-gnu/include/c++/9/aarch64-linux-gnu
빌드된 결과물은 프로젝트 내의 ./build/elinux/arm64/debug/bundle
과 같은 경로에 생성됩니다.
원격 타겟 개발 (custom-devices
)
custom-devices
기능은 원격 기기와의 연동을 매우 편리하게 만들어 줍니다.
~/.flutter_custom_devices.json
파일 생성: 홈 디렉토리에 원격 기기의 정보를 담은 JSON 파일을 만듭니다. 기기의 ID, 이름, IP 주소, 접속 정보 및 앱 설치/실행/제거에 필요한 명령어들을 정의할 수 있습니다.
{
"custom-devices": [
{
"id": "jetson-nano",
"label": "Jetson Nano",
"sdkNameAndVersion": "JetPack 4.3",
"enabled": true,
"platform": "arm64",
"backend": "x11",
"ping": [
"ping",
"-w",
"500",
"-c",
"1",
"<deviceIP>"
],
"pingSuccessRegex": "ttl=",
"install": [
"scp",
"-P",
"<devicePort>",
"-r",
"${localPath}",
"<deviceUser>@<deviceIP>:/tmp/${appName}"
],
"uninstall": [
"ssh",
"-p",
"<devicePort>",
"<deviceUser>@<deviceIP>",
"rm -rf \"/tmp/${appName}\""
],
"runDebug": [
"ssh",
"-p",
"<devicePort>",
"<deviceUser>@<deviceIP>",
"export DISPLAY=:0 && /tmp/${appName}/${appName} -b ."
],
"stopApp": [
"ssh",
"-p",
"<devicePort>",
"<deviceUser>@<deviceIP>",
"ps aux | grep \"/tmp/${appName}\" | grep -v grep | awk '{print $2}' | xargs kill"
],
"forwardPort": [
"ssh",
"-p",
"<devicePort>",
"-o",
"ExitOnForwardFailure=yes",
"-L",
"127.0.0.1:${hostPort}:127.0.0.1:${devicePort}",
"<deviceUser>@<deviceIP>"
],
"forwardPortSuccessRegex": "Linux"
}
]
}
- 원격 빌드 및 실행: 이제
-d
옵션에 기기 ID를 지정하여 원격으로 앱을 빌드하고 실행할 수 있습니다.
# 원격 타겟용으로 빌드
$ flutter-elinux build elinux -d jetson-nano --target-arch=arm64 --target-compiler-triple=aarch64-linux-gnu --target-sysroot=<Absolute_path_to>/ubuntu20-arm64-sysroot --target-backend-type=x11 --debug
# 원격 기기에서 실행
$ flutter-elinux run -d jetson-nano
이 명령을 실행하면 flutter-elinux
가 JSON 파일에 정의된 install
과 runDebug
명령을 순서대로 실행하여 앱을 배포하고 디버그 모드로 실행해 줍니다.
결론
오늘 우리는 flutter-elinux
가 임베디드 리눅스 환경에서 Flutter 개발의 문을 어떻게 활짝 열어주는지 살펴보았습니다. 경량 설계, 폭넓은 호환성, 강력한 크로스 빌딩과 원격 개발 지원까지. flutter-elinux
는 임베디드 개발자들이 마주하는 많은 어려움을 해결해 줄 강력한 잠재력을 지니고 있습니다.
물론 크로스 빌딩처럼 다소 복잡한 과정도 있지만, flutter-elinux
가 제공하는 유연성과 생산성은 그만한 노력을 투자할 가치가 충분합니다. 새로운 임베디드 프로젝트를 구상 중이거나, 기존 시스템에 현대적인 UI/UX를 더하고 싶다면 flutter-elinux
를 꼭 한번 고려해 보시길 바랍니다.
'Flutter' 카테고리의 다른 글
[Flutter에 홈 위젯 만들기] #1. Android Glance로 반응형 위젯 레이아웃 만들기 (3) | 2025.07.10 |
---|---|
[Flutter로 개인 블로그 만들기] #3-1. go_router를 이용하여 라우팅 관리하기 (2) | 2024.10.13 |
[Flutter로 개인 블로그 만들기] #2. Github Actions를 이용하여 CI/CD 구현하기 (1) | 2024.09.19 |
[Flutter로 개인 블로그 만들기] #1. Flutter Web을 Github Pages에 업로드하기 (5) | 2024.09.18 |