Klepton: Android ARM64 VR APK's draaien op Apple Vision Pro en macOS

Architectuur

De tool klepton-ld vertaalt Android .so-bibliotheken naar Apple .dylib- en .framework-bibliotheken, die vervolgens worden gekoppeld aan de Klepton-runtime. Op dit moment richt Klepton zich uitsluitend op "Java-thin" applicaties (zonder ART of JVM).

Grafische vertaling

Voor de weergave wordt gebruikgemaakt van de volgende vertalingen:

  • GLES 3.2 wordt vertaald naar een geïntegreerde ANGLE GLES 3.0 (met Metal-backend).
  • Vulkan wordt vertaald naar MoltenVK.

Systeemstructuur

De architectuur is als volgt opgebouwd:

  1. Guest: Vertaalde Mach-O bestanden waarbij de instructiebytes grotendeels ongewijzigd blijven (bijv. libil2cpp, libunity, libunityopus, libmain, burst).
  2. Klepton Runtime: De imports worden via klepton-ld opgelost naar de runtime, bestaande uit:
  • libklepton_bionic: Vertaalt libc/libm/libdl/pthread/liblog naar libSystem.
  • libklepton_ndk: Bevat ALooper, ANativeWindow, ASensor en AAsset.
  • libklepton_jni: Een synthetische JavaVM / JNIEnv.
  • libkleptonovrp: Een reimplementatie van ovrp*.
  1. Frontend platform (mains) en OS-specifics: De onderste laag die communiceert met het besturingssysteem via:
  • MoltenVK (Vulkan → Metal) en ANGLE (GLES 3.0).
  • Compositor Services, ARKit, GameController en AVAudioEngine.

Technische details over x18 en JIT

Zowel Android als macOS reserveren het x18-register, maar veel oudere Android-applicaties maken hier nog gebruik van. Aangezien macOS x18 op nul zet bij context switches, wordt al het gebruik van x18 door klepton-ld gepatcht, zodat er in plaats daarvan per-bibliotheek TLS-slots worden gebruikt.

Klepton kan .so-bestanden tijdens runtime laden en patchen met mmap. Dit is echter voornamelijk nuttig op macOS, waar JIT is toegestaan. Het is waarschijnlijk dat sommige applicaties JIT vereisen als ze gebruikmaken van scripting-runtimes zoals LuaJIT of V8.

Bouwen

Voor de volledige handleiding kan worden verwezen naar BUILDING.md. De verkorte versie is als volgt:

Host-afhankelijkheden installeren:

brew install pkg-config sdl3 apktool

APK voorbereiden:

apktool d -f -o beatsaber beatsaber.apk

(De gebruiker dient zelf de APK aan te leveren; zie BUILDING.md voor details)

Controleren:

make check

(Voert een volledige regressietest uit)

Scripts voor snelle uitvoering

  • ./buildrunviewer.sh: Bouwt en start de macOS Beat Saber frontend.
  • ./buildrunvpro.sh: Bouwt en start de Vision Pro Beat Saber frontend.
  • ./buildrunslink.sh --shell --view: macOS Steam VR Link frontend (momenteel in ontwikkeling).

Status

Beat Saber werkt momenteel op macOS en visionOS, al zijn er nog enkele kleine grafische problemen aanwezig. De integratie van Steam VR Link en het verbeteren van de algemene bruikbaarheid en build-tooling zijn nog in ontwikkeling (WIP).