Klepton, Vision Pro에서 Android VR 앱을 네이티브 ARM64로 돌려요

Meta Quest용 Android ARM64 VR 앱을 Apple Vision Pro에서 실행하려면 운영체제와 그래픽 API의 차이를 함께 풀어야 해요. Klepton은 CPU 명령을 통째로 에뮬레이션하는 대신 Android 라이브러리를 Apple 형식으로 바꾸고, 필요한 API를 macOS와 visionOS 구성요소에 이어 붙여요. 현재 Beat Saber가 두 플랫폼에서 실행되지만 그래픽 문제와 지원 범위의 제약은 남아 있어요. 1 2
핵심 요약
| 구분 | 내용 |
| 실행 방식 | Android ARM64 명령어를 대부분 유지한 채 `.so`를 Mach-O 기반 `.dylib`와 `.framework`로 바꿔요. |
| 호환 계층 | Bionic, NDK, JNI, OVRP 호출을 Apple 플랫폼의 시스템 라이브러리와 프레임워크에 연결해요. |
| 그래픽 | OpenGL ES는 ANGLE을 거쳐 Metal로 보내고, Vulkan은 MoltenVK로 변환해요. |
| 현재 범위 | Java 의존성이 얕은 앱에 초점을 맞춰요. ART와 JVM은 제공하지 않아요. |
| 확인된 사례 | Beat Saber가 macOS와 visionOS에서 실행돼요. 사소한 그래픽 문제가 남아 있고 Steam VR Link는 개발 중이에요. |
1. Android VR 앱을 Apple 형식으로 다시 연결해요
Klepton의 중심에는 `klepton-ld`가 있어요. 이 도구는 APK 안의 Android `.so` 라이브러리를 Apple 플랫폼이 불러올 수 있는 `.dylib`와 `.framework`로 변환해요. 변환된 게스트 코드는 Mach-O 형태로 실행되며 ARM64 명령어 바이트는 대부분 그대로 남아요. 같은 ARM64 계열 CPU를 쓰는 점을 이용해 무거운 CPU 에뮬레이션을 피한 접근이에요. 2
운영체제 API 차이는 별도의 호환 계층이 맡아요. `libklepton_bionic`은 Android의 libc, libm, pthread 같은 호출을 Apple의 libSystem에 연결해요. `libklepton_ndk`는 ALooper, ANativeWindow, 센서와 에셋 API를 다뤄요. `libklepton_jni`는 합성 JavaVM과 JNIEnv 환경을 제공하고, `libklepton_ovrp`는 Meta의 OVRP 계열 함수를 다시 구현해요.
그래픽 경로도 두 갈래로 나뉘어요. GLES 3.2 호출은 프로젝트에 포함된 ANGLE GLES 3.0과 Metal 백엔드를 거쳐요. Vulkan 호출은 MoltenVK가 Metal로 바꿔요. Vision Pro 쪽 화면 구성과 추적 기능에는 Compositor Services와 ARKit을 사용해요. 컨트롤러와 오디오는 GameController, AVAudioEngine에 연결해요.
ARM64의 `x18` 레지스터 차이도 따로 처리해요. 구형 Android 앱 가운데 일부는 `x18`을 사용하지만, macOS는 문맥을 전환할 때 이 값을 0으로 만들어요. `klepton-ld`는 라이브러리 안의 `x18` 사용 지점을 찾아 라이브러리별 TLS 슬롯을 쓰도록 바꿔요. CPU 아키텍처가 같아도 ABI와 운영체제 규칙이 다르면 이런 보정이 필요해요. 1
Klepton이 모든 Android 앱을 바로 지원하는 것은 아니에요. 현재 ART와 JVM이 없어서 Java 계층 의존성이 얕은 앱을 중심으로 다뤄요. LuaJIT이나 V8처럼 실행 중 코드를 만드는 런타임도 JIT 권한이 필요할 수 있어요. Vision Pro에서 JIT 없이 동작한다는 설명은 지원되는 네이티브 중심 앱에 해당해요.
프로젝트가 공개한 사례는 Beat Saber예요. macOS와 visionOS에서 실행되지만 작은 그래픽 문제가 남아 있어요. Steam VR Link 프런트엔드는 아직 작업 중이에요. 앱 APK는 저장소가 제공하지 않으므로 사용자가 합법적으로 준비해야 해요. 빌드에는 Apple Silicon Mac과 Xcode가 필요하고, Vision Pro 기기에서 돌리려면 Apple 개발자 계정도 필요해요. 3
왜 중요한가요
Klepton은 같은 ARM64라도 앱을 다른 운영체제로 옮기는 일이 CPU 명령어 호환만으로 끝나지 않는다는 점을 구체적으로 보여줘요. 바이너리 형식, C 런타임, JNI, 그래픽 API, 예약 레지스터, 입력과 오디오까지 한꺼번에 맞아야 실제 앱이 실행돼요. 구현을 살펴보면 에뮬레이터보다 바이너리 변환기와 호환 계층에 가까운 이유를 알 수 있어요. 2
개발자에게는 Android XR 앱의 기존 네이티브 코드를 Apple 공간 컴퓨팅 기기에서 재사용할 수 있는 실험 경로예요. 다만 지금은 범용 배포 도구보다 초기 단계의 오픈소스 프로젝트에 가까워요. ART와 JVM 부재, JIT가 필요한 앱, 그래픽 오차, 기기 서명과 대용량 ANGLE 빌드 같은 조건을 먼저 확인해야 해요. 공식 빌드 문서는 ANGLE 소스와 중간 산출물에 약 20GiB를 잡으라고 안내해요. 3
참고 자료
- Apple Vision Pro에서 Android ARM64 VR APK 실행하기 — GeekNews
- Klepton: JIT-less relinker and compatibility layer — GitHub
- Building Klepton — GitHub
'IT & AI' 카테고리의 다른 글
| Xirp가 AI 코딩에 조직의 기억을 연결하는 방법 (0) | 2026.08.12 |
|---|---|
| Rails 포크 Amiko가 묻는 것, 프레임워크와 창시자를 분리할 수 있을까요 (0) | 2026.08.11 |
| Meta가 다시 꺼낸 공개 가중치 AI, 약속보다 조건을 봐야 해요 (0) | 2026.08.11 |
| LLM 설명을 움직이는 학습 시뮬레이션으로 바꾸는 법 (0) | 2026.08.11 |
| Claude Code가 Auto mode를 기본값으로 바꾸는 이유 (0) | 2026.08.11 |