퓨처 플러터 컨퍼런스 톺아보기
소개
조금 늦었지만, 2024년 9월 28일 진행된 Flutter 컨퍼런스 Future Flutter에서 들었던 내용을 정리하고, 실제 회사에 적용해보며 겪었던 이슈들에 대한 내용을 정리한 글이다.
FFI로 연결하는 고(Go)와 플러터
멀티 플랫폼에 대응하는 앱을 만들기 위해 Go 언어와 플러터를 활용하며 기본적인 UI 디자인을 적용하며 고성능의 앱을 개발하는 방법에 대해 고민하며 적용한 내용에 대한 발표였다.
왜 Go 인가?
고언어를 채택한 장점에는 크게 3가지의 이유가 있었다.
크로스 플랫폼 개발
Windows, macOS, Linux 와 같은 다양한 운영체제와 x86, ARM 등의 아키텍쳐로 크로스 컴파일이 가능하여 보다 빠르게 다양한 플랫폼 지원을 간편하게 한다.
빠른 컴파일과 실행
Go언어는 머신코드로 바로 컴파일 가능하기 때문에 고성능의 앱 개발에 유리하다. 실행속도가 빠를 뿐만아니라 컴파일 속도도 빨라, 수정사항을 빠르게 적용하여 테스트 가능하고 이로인해 개발 속도를 빠르게 가져갈 수 있다.
가벼움과 확장성
고루틴과 채널이라 알려진 동시성 기능을 지원하여 많은 작업들을 성능저하 없이 동시에 처리 가능하다. 효율성과 확장성을 필요로하는 고성능 어플리케이션 개발에 이상적이다.
왜 플러터인가?
크로스 플랫폼 개발
하나의 코드 베이 스로 안드로이드, IOS, Windows desktop, Web 등 여러 플랫폼 개발이 가능하다. 이로인해 적은 인원과 시간으로 다양한 플랫폼에 대응하는 App.을 개발할 수 있다.
유용한 개발도구
플러터의 핫리로드, 핫리스타스 같은 기능과 유용한 개발 도구를 지원해 개발 속도를 빠르게 한다.
빠르고 아름다운 애플리케이션
플러터는 자체적으로 기본적인 애니메이션과 인터렉션에 대한 처리가 되어있어 보다 간편하게 고퀄리티의 사용자 경험을 제공한다. 또한 각 플랫폼에 맞게 컴파일되어 효율적으로 동작하도록 해준다.
FFI 란?
Foreign Function Interface (FFI)는 C언어로 짜여진 함수를 다트나 플러터에서 사용하는 방법으로 플러터에서는 dart:ffi
패키지를 사용한다.
C뿐만 아니라 Go, C++, Rust 등의 C 인터페이스를 제공하는 언어라면 Dart에서 사용이 가능하다.
플러터에서 FFI 사용하기
flutter create --platforms=android,ios,macos,windows,linux --template=plugin ffi native add
위 커맨드로 프로젝트를 생성하면 lib
폴더 아래에 Dart
코드, src
폴더 아래에 C
코드가 생성된다.
고언어 라이브러리 생성하기
고언어 코드 작성
-
src
폴더 안에go.mod
파일 생성go.mod
파일이란? 모듈 이름, 버전, 의존성 등을 정의하는 파일 -
sum.go
파일을 생성하고 고언어 코드를 작성// sum.go file
package main
import "C" // cgo 문법으로
// export <함수명> 주석을 이용해서 sum이라는 함수를 C로 export
// export sum
func sum(a C.int, b C.int) C.int { // C에서 사용해야하기 때문에 Go의
return a + b // 타입이 아닌 C 타입으로 C.int 를 사용
}
func main() {}
고언어 라이브러리를 안드로이드용으로 컴파일
최신 안드로이드 단말기들을 지원하기 위해서는 arm64
와 x86_64
아키텍처를 지원하도록 크로스 컴파일 되어야함
export ANDROID_OUT=../android/src/main/jniLibs
export ANDROID_SDK=$HOME/Library/Android/sdk
export NDK_BIN=$ANDROID_SDK/ndk/23.1.777.9620/toolchains/llvm/prebuilt/darwin-x86_64/bin
# x86_64 아키텍처로 컴파일 해서 android/src/main/jniLibs/x86_64 폴더에 libsum.so 생성
CGO_ENABLED=1 \
GOOS=android \
GOARCH=and64 \
CC=$NDK_BIN/x86_64-linux-android21-clang \
go build -buildmod=c-shared -o $ANDROID_OUT/x86_64/libsum.so
# arm64 아키텍처로 컴파일 해서 android/src/main/jniLibs/arm64-v8a 폴더에 libsum.so 생성
CGO_ENABLED=1 \
GOOS=android \
GOARCH=arm64 \
CC=$NDK_BIN/aarch64-linux-android21-clang \
go build -buildmode=c-shared -o $ANDROID_OUT/arm64-v8a/libsum.so
고언어 라이브러리를 IOS용으로 컴파일
기본적인 컨셉은 안드로이드용 빌드와 동일하나 약간의 추가과정이 필요함
- IOS는 static 라이브러리로 컴파일 해야함
- 시뮬레이터용
arm64
와arm64
빌드와 아이폰용arm64
빌드, 총 세개의 라이브러리로 컴파일 - 시뮬레이터용 라이브러리 두개를 통합하기 위해 lipo라는 도구를 사용
- 빌드된 모든 라이브러리를
xframework
패키지로 통합