2023.11.21 - [백엔드/Rust] - Rust 걸음마 떼기 (1) - Rust 설치 및 실행
2023.11.21 - [백엔드/Rust] - Rust 걸음마 떼기 (2) - 변수 선언, 입력, 비교
2023.11.21 - [백엔드/Rust] - Rust 걸음마 떼기 (3) - 일반 프로그래밍 개념을 rust에서는 어떻게 다루는가
2023.11.21 - [백엔드/Rust] - Rust 걸음마 떼기 (4) - 소유권 (러스트의 메모리 관리)
2023.11.21 - [백엔드/Rust] - Rust 걸음마 떼기 (5) - Rust의 구조체
Rust를 모른다면 일단 위의 글을 보고 오도록 하자
위 글들을 통해서 rust의 아주 기본은 대충 파악해봤으니 flutter rst bridge tutorial을 한번 진행해보려고한다.
📚 Tutorial: A Flutter+Rust app - flutter_rust_bridge (cjycode.com) 이 페이지의 예제를 한번 실행해본다.
Part2: User Guide의 Create new Projects from a template의 과정을 읽어보면서 따라하려고한다.
Tutorial 시작
우선은 flutter 설치와 rust 설치가 이미 되어 있음을 가정한다.
rust는 이전에 내가 올린 포스트에서 설치를 했었음을 가정하고있다.
flutter 설치 링크는 Windows install | Flutter와 Set up an editor | Flutter 를 통해서 flutter를 설치한다.
그리고 Android SDK 설치를 위해서 Download Android Studio & App Tools - Android Developers 이 링크로 Android studio도 설치를 해준다.
Visual Studio Code를 우선 사용해보려고 하니 위의 링크에서 flutter extension도 설치해둔다.
설치 완료 후 flutter doctor를 입력하면 아래 같이 flutter 관련 프로그램이 설치가 잘됐는지 확인할 수 있는데,
Unable to find bundled Java version.
라는 Android studio 오류가 발생한다.
아래 페이지에서 해결할 수 있다.
위 링크에서 문제 해결법을 알려줬다.
C:\Program Files\Android\Android Studio
경로로 가셔서 jbr 폴더의 내용을 jre 폴더에 붙여넣기 해보세요!
따라해보자!
과연..!
고쳐졌다. 그럼 다음으로 간다.
flutter rust bridge 를 clone 하고 example을 한번 실행해보려한다.
원하는 폴더에 다음 커맨드를 입력하고 git을 clone해오자.
https://github.com/Desdaemon/flutter_rust_bridge_template.git
Android에서 돌아가는게 1차 목표니
이걸 따라해보려고한다.
(1) Cross compile을 위해서 target을 설정해주어야한다.
터미널에서 다음을 입력한다.
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android
(2) 그리고 두번째로 JDK8 JDK11을 설치해야한다.
JDK 8설치하라고 튜토리얼에 되어있지만 그러면 에러발생해서 11로 설치해야한다. (이유는 가장 아래 Trouble shooting에 있다.)
JDK 11 버전
Java Archive Downloads - Java SE 11 | Oracle 대한민국
(3) ANDROID NDK(Native Development Kit) 설정을 해줘야한다.
Android Studio > SDK Manager > SDK Tools > NDK (Side by side)
위의 경로로 NDK를 설치한다.
주의할점은 NDK (Side by Side) 버전을 설치해야한다는 것이다. (이게 더 최신버전이라서 이걸 설치한다.)
나의 경우에는 C:\Users\Sanghyeok\AppData\Local\Android\Sdk\ndk에 설치되어있다.
"주로 유저이름%AppData\Local\Android\Sdk\ndk" 에 설치 되는것 같다.
(4) 이 경로를 Gradle property에 추가해주어야한다.
android/gradle.properties에 다음을 추가한다.
ANDROID_NDK=(path to NDK)
윈도우라 그런가 \\으로 경로를 구분했다. \하나만 붙이면 잘 안되는것같다.
(5) cargo-ndk
터미널에서 다음을 입력해서 cargo-ndk 를 설치한다.
cargo install cargo-ndk --version ^2.7.0
ndk를 최신으로 받았기 떄문에 2.7.0버전 이상의 cargo-ndk를 설치해야한다.
그리고 2.7.0이상의 cargo-ndk의 경우 윈도우는 다음 과정이 더 필요하다.
1. libunwind.a 를 포함하고 있는 4개의 폴더를 찾는다.
윈도우의 경우 아래와 같은 폴더에 있다. (숫자는 다를 수 있다.)
C:\Users\Administrator\AppData\Local\Android\Sdk\ndk\24.0.8215888\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\14.0.1\lib\linux\x86_64\
나의 경우는 아래와 같다.
C:\Users\Sanghyeok\AppData\Local\Android\Sdk\ndk\25.2.9519653\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\14.0.7\lib\linux
여기서 보이는 4개의 폴더에 대해서 2번 사항을 진행한다.
2. 해당 폴더들에 libgcc.a 파일을 생성하고 다음과 같은 내용을 넣는다.
INPUT(-lunwind)
일단 여기까지하면 뭔가 설정은 다 한것 같기도하고..?
그래서 뭔가 그냥 실행시켜봤다.
flutter run을 통해서 실행하는 듯 해서 실행해봄!
근데 flutter doctor --android-licenses를 안했다고 한다.
그래서 flutter doctor도 해봤다
sdk가 안깔렸단다. 안깔긴했다.. 아우 귀찮아..! (이후에 android emulator 실행을 위해서 설치가 필요하긴하다. 반드시할것!)
Android Studio에서 다음과 같이 진행해보자
Android Studio > SDK Manager > Android 13.0 (Tiramisu)
위를 체크하고 확인을 누르면 SDK를 설치한다.
혹시 몰라서 위에서부터 한 5개 설치하려고한다.
SDK 설치 체크 및 설치화면! OK누르면 알아서 설치한다.
다시 flutter doctor --android-licenses 를 입력했는데 또 못찾는단다 ㅡㅡ 왜지
여기를 보고 해결해보자
Android SDK Command-line Tools(Latest) 얘도 설치해야하는가보다
Android SDK Command-line Tools(Latest) 제발 마지막이여라
flutter doctor --android-licenses
다시 시도하자
드디어 된다.
다 y 누르고 완료해보도록 하자
이제 그러면 여기에 러스트 프로젝트를 연결해보자!
이미 예제에는 native폴더가 파일로 존재해서 이를 그대로 활용해보기로한다.
혹시나 새로운 프로젝트를 연결하려면 새로 rust 프로젝트를 생성하고 Cargo.toml 파일 아래에 빨간 부분을 추가해야한다.
flutter 연결을 위해서 필요한 library와 dependency는 아래와 같다.
(6) 그리고 관련 library를 다음 명령어들을 통해서 설치해주도록 한다.
다 필요한 명령어인지는 모르겠으나 필요해보여서 일단 다 입력..
cargo install flutter_rust_bridge_codegen
dart pub global activate ffigen
dart pub add ffigen
dart pub add ffi
flutter pub add flutter_rust_bridge
# if using Dart codegen
flutter pub add -d build_runner
flutter pub add -d freezed
flutter pub add freezed_annotation
이제 하나만 더 하면된다.
(7) Android Studio를 열어서 Virtual Device를 하나 만들자
android studio를 켜서 어플을 실행할 Virtual Device를 하나 만들자
Android Studio > Virtual Device Manager > Create Device
Select Device에서 원하는 사이즈를 정하자
나는 폴더블 개발을 위함으로 Resizable이 흥미로워보이니 이걸로할생각이다.
다 next 누르고 마지막에 finish누르면 생성된다.
(8) android emulator를 vscode에서 실행한다 그리고 파일 하나를 수정한다.
vscode에서 f1을 누르고 flutter:select device를 선택한다.
offline되어있는 device중에 하나를 선택해서 켠다.
그리고 android/app/build.gradle 파일의 가장 마지막부분이 없거나, 아래와 비슷한 코드가 있을텐데 다 지우고 아래 내용을 추가한다.
[
new Tuple2('Debug', ''),
new Tuple2('Profile', '--release'),
new Tuple2('Release', '--release')
].each {
def taskPostfix = it.first
def profileMode = it.second
tasks.whenTaskAdded { task ->
if (task.name == "javaPreCompile$taskPostfix") {
task.dependsOn "cargoBuild$taskPostfix"
}
}
tasks.register("cargoBuild$taskPostfix", Exec) {
// Until https://github.com/bbqsrc/cargo-ndk/pull/13 is merged,
// this workaround is necessary.
def ndk_command = """cargo ndk \
-t armeabi-v7a -t arm64-v8a -t x86_64 \
-o ../android/app/src/main/jniLibs build $profileMode"""
workingDir "../../native"
environment "ANDROID_NDK_HOME", "$ANDROID_NDK"
if (org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem.isWindows()) {
commandLine 'cmd', '/C', ndk_command
} else {
commandLine 'sh', '-c', ndk_command
}
}
}
(9) 터미널에서 flutter run을 입력한다.
빌드 및 실행이 된다.
Trouble Shooting
1. flutter doctor --android-license 시 발생하는 문제
JAVA 버전이 맞지 않아 생기는 문제다.
java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocationsProvider has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
JDK 8 설치한 경우 위의 에러가 발생한다. (JAVA 11로 설치했다면 발생하지 않을것이다.)
JDK 11로 설치하자 (8로 이전에 설치했다면 환경변수도 바꿔주자)
2. flutter run 커맨드로 실행시 assert.h not found 문제가 발생하는경우
[Bug] Failed to generate dart_api_dl binding - PullAnswer 와 아예 같은 문제
[Bug] Failed to generate dart_api_dl binding - PullAnswer
try cargo-ndk = "2.12.5"
cargo-ndk 버전이 낮아서 생긴 문제였음.
NDK 설치시에 cargo-ndk버전은 cargo-ndk 2.7.0이상 설치해야하고
NDK (version 22) 설치시에는 cargo-ndk 2.6.0을 설치해야하는데
NDK (Side by Side) 설치후 cargo-ndk 2.6.0을 설치해버리는 경우 나올 수 있는 문제로 보인다..
cargo install cargo-ndk --version ^2.12.5
내가 그랬다.. ㅠㅜ
3. flutter run 시 에뮬레이터에 어플이 실행되는것 같으나 libnative.so not found 같은 에러 발생
아직 잘은 모르겠지만 추측건데 libnative.so 라는 파일이 내가 작성하는 rust crate를 library로 변경해서 flutter와 결합하는건데
rust 폴더의 이름을 잘못설정하거나 flutter run 커맨드에 rust폴더이름을 제대로 지정 하지 않은 경우에 발생한다.
예제에서는 native 폴더가 rust 파일들이 있는 폴더고, 이를 컴파일하도록 커맨드가 잘 지정되어있었는데
내가 새로 rust라는 이름의 폴더를 만들고 그걸로 빌드를 시도하도록 해서 발생했다.
(아직 정확하게 고치지는 못했는데 나처럼 rust로 폴더이름을 만든경우 librust.so 파일을 flutter에서 불러오도록 커맨드 및 다른 코드들을 변경해야하는 듯 하다.)
4. flutter run시 에뮬레이터가 아니라 다음 3개중 선택하라고 뜨는경우
이 경우는 단순하게 Virtual Device가 offline이여서 생기는 문제로
vscode에서 f1 을 누르고 flutter: select device를 선택해서 offline 되어 있는 device를 선택해서 켜야한다.
이제 flutter + rust로 example을 켜는것 까지는 성공했다.
'백엔드 > Rust' 카테고리의 다른 글
Rust 걸음마 떼기 (5) - Rust의 구조체 (2) | 2023.11.21 |
---|---|
Rust 걸음마 떼기 (4) - 소유권 (러스트의 메모리 관리) (2) | 2023.11.21 |
Rust 걸음마 떼기 (3) - 일반 프로그래밍 개념을 rust에서는 어떻게 다루는가 (1) | 2023.11.21 |
Rust 걸음마 떼기 (2) - 변수 선언, 입력, 비교 (2) | 2023.11.21 |
Rust 걸음마 떼기 (1) - Rust 설치 및 실행 (0) | 2023.11.21 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.