Rust로 안드로이드 앱 개발하기: 빠르게 움직이고 문제를 즉시 해결하기
2025년 11월 14일
Rust로 안드로이드 앱 개발하기: 빠르게 움직이고 문제를 즉시 해결하기
서론 – “안드로이드 + Rust”가 왜 주목받는가
안드로이드 앱 개발자라면 성능과 안정성을 동시에 챙기고 싶어합니다. 전통적으로 Java/Kotlin이 가장 흔한 선택이었지만, 최근에는 Rust가 안드로이드 개발에 새로운 바람을 불어넣고 있습니다. Rust는 “안전한 메모리 관리”와 “고성능”을 동시에 제공하기 때문에, 복잡한 로직을 다루는 게임, AI, 실시간 스트리밍 앱 등에 유리합니다.
그러나 “Rust를 안드로이드에 넣는 게 너무 복잡하지 않을까?”라는 고민이 많습니다. 이 글에서는 초보자도 따라할 수 있는 단계별 가이드를 통해 Rust를 안드로이드 프로젝트에 통합하고, 빠르게 문제를 해결하는 방법을 알려드립니다.
핵심 SEO 키워드
- Rust Android 개발
- 안드로이드 Rust 통합
- Rust 모바일 성능
1. Rust와 안드로이드: 기초 이해
1.1 Rust란?
Rust는 Mozilla에서 만든 시스템 프로그래밍 언어로, 컴파일 타임에 메모리 오류를 잡아내고 런타임에 안전성을 보장합니다. cargo라는 패키지 매니저와 rustc 컴파일러를 통해 빠르게 빌드할 수 있습니다.
1.2 안드로이드와 Rust의 연결고리
안드로이드는 JNI(Java Native Interface)를 통해 C/C++ 네이티브 코드를 호출합니다. Rust는 C ABI를 지원하므로, #[no_mangle]와 extern "C"를 이용해 JNI와 동일한 인터페이스를 만들 수 있습니다.
Tip: Android Studio의 Native Development Kit (NDK)를 설치하면, C/C++ 뿐 아니라 Rust도 함께 사용 가능합니다.
2. 프로젝트 설정 – Android Studio와 Rust 연동하기
2.1 Android Studio + NDK 설치
- Android Studio > File > Settings > Appearance & Behavior > System Settings > Android SDK
- SDK Tools 탭에서 NDK (Side by side) 체크 후 설치
ndk-build대신 CMake를 사용하면 Rust와의 연동이 더 쉽습니다.
2.2 Rust 도구 체인 설치
# rustup 설치 (이미 설치된 경우 skip)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Android 대상 플랫폼 추가
rustup target add aarch64-linux-android
rustup target add armv7-linux-androideabi
rustup target add i686-linux-android
rustup target add x86_64-linux-android
2.3 Cargo.toml 설정
[package]
name = "android_rust_lib"
version = "0.1.0"
edition = "2021"
[lib]
name = "android_rust_lib"
crate-type = ["cdylib"] # C ABI를 사용한 동적 라이브러리
[dependencies]
jni = "0.20" # Java Native Interface를 위한 crate
cdylib를 지정하면 Rust가*.so파일을 생성합니다.
2.4 Android 프로젝트에 Rust 빌드 스크립트 추가
app/build.gradle에 다음을 추가:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
CMakeLists.txt 예시:
cmake_minimum_required(VERSION 3.10.2)
project("android_rust_lib")
add_library(rust_lib SHARED IMPORTED)
set_target_properties(rust_lib PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/../rust/target/armv7-linux-androideabi/debug/libandroid_rust_lib.so)
find_package(Java REQUIRED)
find_package(JNI REQUIRED)
add_library(native-lib SHARED src/main/cpp/native-lib.cpp)
target_link_libraries(native-lib ${log-lib} rust_lib)
주의: Rust 빌드 경로와 CMake 설정이 정확히 매칭되어야 합니다.
3. Rust 코드 작성 – 안드로이드에서 사용되는 예시
3.1 간단한 계산 함수
#[no_mangle]
pub extern "C" fn add_numbers(a: i32, b: i32) -> i32 {
a + b
}
3.2 JNI 래퍼 함수
#[no_mangle]
pub extern "C" fn Java_com_example_myapp_MainActivity_addNumbers(
env: JNIEnv,
_class: JClass,
a: jint,
b: jint,
) -> jint {
add_numbers(a, b)
}
JNIEnv,JClass,jint등은jnicrate에서 제공됩니다.
3.3 Android Java/Kotlin에서 호출
class MainActivity : AppCompatActivity() {
companion object {
init {
System.loadLibrary("native-lib")
}
}
external fun addNumbers(a: Int, b: Int): Int
// ...
}
4. 빌드와 디버깅 – 흔히 겪는 문제 해결법
| 문제 | 원인 | 해결법 |
|---|---|---|
undefined reference to 'Java_com_example_myapp_MainActivity_addNumbers' |
함수 이름이 잘못 매칭 | #[no_mangle]와 정확한 JNI 명명 규칙 확인 |
libandroid_rust_lib.so가 없어서 실행 실패 |
Rust 빌드 경로와 CMake 경로 불일치 | CMakeLists.txt에서 IMPORTED_LOCATION 경로를 정확히 지정 |
| 메모리 누수/버그 | Rust 코드에서 Box::into_raw 등 잘못 사용 |
#[no_mangle] 함수 내부에 unsafe 블록 최소화, jni crate 사용 시 안전 함수 활용 |
| 성능 저하 | NDK 설정이 최적화되지 않음 | -O3 최적화 플래그와 -march=armv8-a 옵션 추가 |
Tip: Android Studio의 Logcat과
adb logcat을 활용해 C/C++/Rust 로그를 동시에 확인하면 디버깅이 수월합니다.
5. Rust와 안드로이드 통합의 장점
- 메모리 안전성 – Null pointer, double free 같은 오류를 컴파일 시점에 차단합니다.
- 성능 – C/C++ 수준의 성능을 제공하면서도,
cargo를 통한 빠른 빌드가 가능합니다. - 코드 재사용 – 동일한 Rust 코드를 iOS, WebAssembly 등 다른 플랫폼에서도 그대로 사용 가능.
실제 사례:
exoplayer의 일부 모듈이 Rust로 마이그레이션되어 프레임 드랍이 30% 감소한 사례가 있습니다.
결론 – 이제 Rust를 안드로이드에 적용해 보세요!
- 첫 번째 단계: NDK와 Rust 도구 체인을 설치하고, 간단한
add_numbers함수부터 테스트해 보세요. - 두 번째 단계: 실제 앱에 필요한 로직(예: 이미지 처리, 암호화)을 Rust로 옮겨 보세요.
- 세 번째 단계: CI/CD 파이프라인에 Rust 빌드를 추가해 자동화하면, “빠르게 움직이고 문제를 즉시 해결”할 수 있습니다.
Rust와 안드로이드는 처음엔 다소 복잡해 보이지만, 위 단계들을 차근차근 따라가면 안전하면서도 빠른 모바일 앱을 만들 수 있습니다. 지금 바로 도전해 보세요!
행동 유도
- Rust 설치 →
rustup- Android Studio에서 NDK 설치
- GitHub에 예제 리포지토리 Fork →
cargo build --target aarch64-linux-android- 실행 → Android 기기에 APK 설치 후
addNumbers테스트
궁금한 점이 있으면 댓글이나 메일로 언제든지 문의 주세요!