Dokumen sumber, 16 Oktober 2026, @Mochamad Nizwar Syafuan. Disalin dari PDF spesifikasi ke Markdown supaya bisa di-review lewat pull request. Catatan implementasi (bahasa Inggris) ada di architecture.md.
Catatan implementasi. Dokumen ini adalah spesifikasi awal dan disimpan apa adanya. Implementasinya berbeda di beberapa bagian, terutama Engine VM: Avo tidak memakai crosvm, tetapi engine sendiri, avo-vmm, yang menjalankan image AOSP Cuttlefish langsung di Hypervisor.framework (lihat engine.md).
Avo menjalankan aplikasi Android di macOS sebagai aplikasi biasa: Android hidup di VM latar belakang, dan setiap aplikasi Android tampil di jendela macOS-nya sendiri. Proyek ini dibangun sebagai produk komunitas open source dan dibagikan gratis.
Tujuan yang bisa diukur:
- Satu aplikasi Android = satu jendela macOS, lengkap dengan ikon di Dock, Launchpad, dan Spotlight.
- Double-click file APK langsung meng-install dan membuat shortcut, tanpa terminal.
- Game kasual dan menengah bisa dimainkan dengan keyboard, mouse, atau gamepad lewat keymapping overlay.
- Membuka aplikasi yang sudah ter-install terasa instan, karena VM tetap hidup di latar belakang.
- Semua pengaturan VM (RAM, CPU, storage, grafis, root, profil device) ada di satu control panel.
Batasan ini ditetapkan sejak awal supaya ruang lingkup tidak melebar dan janji ke user tetap jujur.
| Area | Keputusan | Alasan |
|---|---|---|
| Hardware | Apple Silicon saja (M1 ke atas) | Guest Android ARM64 jalan langsung lewat Hypervisor.framework tanpa translasi instruksi |
| Mac Intel | Tidak didukung | Butuh image x86 dan translasi ARM, sehingga beban maintenance jadi dua kali lipat |
| Google Play Services / Play Store | Tidak dibundel | Distribusi GMS butuh lisensi Google; lihat bagian Strategi GMS |
| Aplikasi bank, e-wallet, DRM | Tidak dijanjikan jalan | Play Integrity dan hardware attestation tidak bisa dilewati di VM |
| Game FPS kompetitif (PUBG Mobile, Delta Force) | Target utama | Sebagian game online bisa mendeteksi VM yang tidak dikenal dan menolak berjalan; produk tidak menyediakan fitur apa pun di luar yang ada di ponsel |
| Mac App Store | Bukan target distribusi | Butuh entitlement hypervisor dan akses sistem di luar sandbox |
Semua bagian di macOS berbicara dengan satu Runtime Daemon, dan semua bagian di Android berbicara dengan satu Bridge Agent. Keduanya terhubung lewat vsock dan gfxstream di dalam Engine VM.
flowchart TB
subgraph mac["macOS (Apple Silicon)"]
shim["App Shim + Window Host<br/>1 proses per aplikasi Android<br/>NSWindow dan render Metal"]
cp["Control Panel<br/>SwiftUI: VM, aplikasi, root, profil device"]
km["Keymap Overlay<br/>Tombol ke sentuhan, Mode FPS<br/>profil per package"]
daemon["Runtime Daemon (LaunchAgent)<br/>Memegang VM, daftar aplikasi, dan koneksi vsock;<br/>snapshot dan quick boot"]
engine["Engine VM (crosvm + backend HVF)<br/>crosvm dengan backend Hypervisor.framework baru;<br/>virtio dan gfxstream ke Metal dan CoreAudio"]
shim --> daemon
cp -- XPC --> daemon
km --> daemon
daemon --> engine
end
subgraph android["VM Android (AOSP ARM64, tanpa launcher)"]
agent["Bridge Agent (system app)<br/>VirtualDisplay per task, event aplikasi,<br/>input, notifikasi, clipboard, profil device"]
gfx["Grafis gfxstream<br/>Driver GLES dan Vulkan di guest,<br/>surface terpisah per VirtualDisplay"]
apps["Aplikasi Android<br/>Setiap aplikasi diluncurkan ke VirtualDisplay miliknya sendiri"]
agent --> apps
apps --> gfx
end
engine <-- "virtio-vsock<br/>ADB · Control · Input" --> agent
engine <-- "gfxstream<br/>GLES dan Vulkan ke Metal" --> gfx
App Shim dan Window Host berjalan di proses yang sama, supaya setiap aplikasi Android dianggap aplikasi terpisah oleh Dock dan Cmd+Tab.
Guest-nya adalah image AOSP ARM64 tanpa launcher. Satu system service buatan sendiri (kita sebut "Bridge Agent") menjadi satu-satunya penghubung ke macOS.
Image dasar
- Base: AOSP 16 atau lebih baru dengan target
arm64, varianuserdebuguntuk development danuseruntuk rilis. - Launcher3 dihapus. SystemUI dikurangi sampai tidak ada status bar, navigation bar, maupun recents.
- Home default diganti activity kosong milik Bridge Agent, supaya tidak ada layar "home" yang terlihat.
- Kernel dikonfigurasi untuk virtio: virtio-gpu, virtio-input, virtio-vsock, virtio-blk, virtio-snd, dan virtio-balloon.
Bridge Agent (privileged system app, ditandatangani platform key)
- Membuat satu
VirtualDisplayper task. Setiap aplikasi yang dibuka diluncurkan ke display miliknya sendiri lewatActivityOptions.setLaunchDisplayId. - Mengirim event ke host: aplikasi ter-install atau terhapus (
PACKAGE_ADDED/PACKAGE_REMOVED), ikon dan label, task dibuka atau ditutup, serta orientasi dan ukuran yang diminta aplikasi. - Menerima perintah dari host: launch, close, resize display, inject input, install, uninstall, clear data, dan force stop.
- Meneruskan notifikasi lewat
NotificationListenerServicedan clipboard lewatClipboardManagerlistener. - Menerapkan override properti device (profil spoof) dan status root saat boot.
Grafis
- gfxstream sebagai jalur GLES dan Vulkan ke host. gfxstream juga dipakai Android Emulator dan Cuttlefish, dan sudah terintegrasi dengan crosvm lewat rutabaga.
- Setiap VirtualDisplay memiliki surface sendiri yang direnders di host, jadi frame tidak perlu di-encode menjadi video.
Di sisi macOS ada satu daemon yang memegang VM, ditambah beberapa aplikasi kecil yang semuanya berbicara dengan daemon itu lewat XPC.
| Komponen | Bentuk | Tugas |
|---|---|---|
| Runtime Daemon | LaunchAgent (Swift + engine VM) | Menjalankan, menghentikan, dan membuat snapshot VM; memegang koneksi vsock ke Bridge Agent; menjadi satu sumber kebenaran untuk daftar aplikasi |
| Engine VM | crosvm (Rust) dengan backend hypervisor baru untuk Hypervisor.framework; device virtio dan gfxstream (rutabaga) dipakai ulang | Virtualisasi CPU, memori, disk, dan perangkat virtio; meneruskan perintah grafis ke Metal |
| Window Host | Framework Swift/AppKit yang berjalan di dalam proses App Shim, satu NSWindow per VirtualDisplay | Merender surface lewat Metal, meneruskan input keyboard, mouse, dan trackpad, menangani resize, resolusi internal, dan upscaling MetalFX |
| App Shim | Bundle .app kecil per aplikasi Android di ~/Applications/Android Apps/ |
Memberi ikon sendiri di Dock, Launchpad, dan Spotlight; saat dibuka, mengirim perintah launch package ke daemon |
| Control Panel | Aplikasi SwiftUI | Pengaturan VM, daftar aplikasi, root, profil device, dan editor keymapping |
| Keymap Overlay | Panel transparan di atas jendela game | Editor tombol dan runtime yang menerjemahkan tombol menjadi sentuhan |
| Menu Bar Item | NSStatusItem |
Status VM, tombol start/stop, dan pintasan ke Control Panel |
Kenapa App Shim, bukan alias di Desktop: alias hanya membuka aplikasi utama, sehingga semua jendela Android menumpuk di satu ikon Dock. Dengan shim, tiap aplikasi Android punya identitas proses sendiri, sehingga Cmd+Tab, Dock, dan Mission Control memperlakukannya sebagai aplikasi terpisah. Ini pola yang sama dengan cara Chrome membuat PWA.
Semua komunikasi berjalan lewat virtio-vsock, tidak lewat jaringan TCP, supaya tidak ada port yang terbuka di Mac.
| Kanal | Port vsock | Isi |
|---|---|---|
| ADB | 5555 | Install dan uninstall APK, pm, am, logcat, debugging |
| Control | 6000 | Perintah dan event Bridge Agent dalam format protobuf: launch, close, resize, daftar aplikasi, notifikasi, clipboard |
| Input | 6001 | Event multitouch, keyboard, dan gamepad bervolume tinggi, dipisah dari kanal Control supaya latensinya rendah |
| Grafis | gfxstream (pipe tersendiri) | Perintah GLES dan Vulkan per display |
Pesan utama di kanal Control:
- Host ke guest:
Launch(package, displayId, width, height, dpi),Resize(displayId, w, h),Close(displayId),Install(path),Uninstall(package),SetClipboard(text),ListApps(). - Guest ke host:
AppInstalled(package, label, iconPng, versionName),AppRemoved(package),DisplayReady(displayId),TaskClosed(displayId),Notification(package, title, body, key),ClipboardChanged(text),OrientationRequest(displayId, orientation).
Setiap pesan membawa nomor versi protokol, supaya host dan image Android bisa di-update secara terpisah.
Setiap poin brief dijabarkan menjadi perilaku yang bisa diuji.
- Tidak ada home screen, status bar, atau navigation bar yang pernah terlihat oleh user.
- Tombol Back dipetakan ke Esc dan swipe trackpad dua jari ke kiri. Home dan Recents tidak ada, karena perannya sudah digantikan Dock dan Mission Control.
- Play Store tidak dibundel; lihat bagian Strategi GMS.
- Control Panel menampilkan grid aplikasi yang ter-install, lengkap dengan ikon, nama, versi, dan ukuran.
- Daftarnya diperbarui secara live dari event
AppInstalleddanAppRemoved, termasuk aplikasi yang di-install dari dalam Android (misalnya lewat F-Droid atau Aurora Store). - Setiap aplikasi otomatis punya App Shim, sehingga muncul di Launchpad dan Spotlight.
- Daftarkan file association untuk
.apk,.xapk,.apkm, dan.apks. Double-click pada file akan memunculkan sheet konfirmasi berisi nama, versi, dan izin, lalu meng-install. - Drag file ke ikon Dock atau ke jendela Control Panel juga akan meng-install.
- Split APK dipasang dengan
pm install-create/install-write/install-commit. OBB dari XAPK disalin ke/sdcard/Android/obb/. - Kalau VM belum jalan, daemon menyalakannya terlebih dahulu, dan progres ditampilkan di sheet.
- Setiap install membuat App Shim di
~/Applications/Android Apps/, dengan ikon Android diubah ke format.icns(adaptive icon dirender di atas squircle macOS). - Opsi di Control Panel: "Buat alias di Desktop" (default menyala sesuai brief) dan "Tambahkan ke Dock".
- Uninstall akan menghapus shim dan alias-nya.
- Tekan Cmd+Shift+K di jendela game untuk membuka editor overlay transparan.
- Jenis kontrol: tap, hold, D-pad (WASD), aim dengan mouse (pointer lock), swipe, tap berulang, dan makro sederhana.
- Profil disimpan per package dalam format JSON. Profil bisa diekspor dan diimpor, sehingga komunitas bisa berbagi profil game.
- Gamepad didukung lewat GameController.framework, dengan pemetaan ke tombol overlay yang sama.
- Sentuhan disuntikkan sebagai multitouch lewat kanal Input ke virtio-input.
- Mouse-look: pointer lock di macOS. Gerakan mouse mentah (tanpa akselerasi) diterjemahkan menjadi drag sentuhan berkelanjutan di area kamera. Saat drag mencapai tepi area, sentuhan diangkat dan dimulai ulang dari tengah tanpa terlihat (re-centering), sehingga kamera bisa berputar tanpa batas.
- Sensitivitas: sumbu X dan Y diatur terpisah, ada kurva dan deadzone, serta sensitivitas terpisah saat membidik (ADS/scope).
- Tombol mouse: klik kiri untuk tembak, klik kanan untuk ADS (tahan atau toggle), scroll untuk ganti senjata, dan tombol samping mouse bisa di-map.
- Mode kursor: tombol toggle (default Alt) untuk keluar dari pointer lock saat membuka inventory atau peta. Layout kontrol berganti otomatis sesuai konteks.
- Multitouch serentak: minimal 10 titik sentuh, supaya WASD, kamera, tembak, lompat, dan jongkok bisa ditekan bersamaan.
- Latensi: target input di bawah satu frame pada 120 FPS, lewat kanal Input yang terpisah dari kanal Control.
- Profil bawaan: profil untuk game FPS populer disediakan dan dikelola komunitas.
- Grafis: preset "Game berat" dengan rendering GPU, batas FPS 90/120, rekomendasi RAM VM minimal 8 GB, dan game di 720p 16:9 dengan upscaling MetalFX.
- Batas tegas: tidak ada makro recoil, auto-aim, atau rapid fire otomatis. Fitur seperti itu melanggar aturan banyak game dan memperbesar risiko akun user di-ban.
- Risiko deteksi VM: sebagian game online bisa menolak berjalan atau mem-ban akun di VM yang tidak dikenali. Avo tidak menyembunyikan diri dari aplikasi yang memeriksanya. Status tiap game dicatat di daftar kompatibilitas komunitas.
| Tab | Pengaturan | Perlu restart VM |
|---|---|---|
| Performa | RAM (2–16 GB), jumlah CPU core, ballooning saat idle | Ya |
| Storage | Ukuran disk data (bisa diperbesar, tidak bisa diperkecil), lokasi file image, bersihkan cache | Ya, untuk resize |
| Grafis | Renderer (Otomatis, GPU (Metal) lewat gfxstream dari Android Emulator 37+, atau Software; GPU yang gagal dimulai kembali ke Software sampai "Coba GPU Lagi"), batas FPS (30/60/120), resolusi dan penskalaan per profil Aplikasi/Game (ikuti jendela × skala render, atau resolusi tetap 540p–1080p dengan rasio aspek), ukuran tampilan, filter MetalFX/Bilinear/Nearest, ketajaman, HUD performa, pengaturan per aplikasi | Sebagian |
| Display | Ukuran jendela default, mode portrait atau landscape | Tidak |
| Aplikasi | Uninstall, force stop, clear data, izin, buka info aplikasi | Tidak |
| Sidik Jari | Daftarkan jari dengan nama (maksimal 5), ganti nama, hapus | Tidak |
| Sistem | Versi Android, root, profil device, snapshot, reset Android | Ya |
- Implementasinya kini Magisk: salinan init_boot image yang di-patch Magisk
(
MagiskRoot, docs/engine.md "Root"), menggantikan rancangan awal berupa dua overlay partisisystem(stock dan rooted, KernelSU). - Mencentang opsi ini menukar overlay saat boot berikutnya, tanpa menyentuh data user.
- Saat dicentang, tampilkan peringatan bahwa aplikasi yang memeriksa integritas akan menolak berjalan.
- Dropdown berisi template seperti Samsung Galaxy S24 Ultra, Google Pixel 9 Pro, Xiaomi 14, ASUS ROG Phone 8, dan OnePlus 12, ditambah opsi "Custom".
- Setiap template berisi
ro.product.brand,ro.product.manufacturer,ro.product.model,ro.product.device,ro.build.fingerprint, dan resolusi atau DPI yang sesuai. - Override diterapkan lewat resetprop saat boot. Ganti profil butuh restart VM.
- Template disimpan sebagai file JSON di repo, sehingga komunitas bisa menambah template lewat pull request.
- Peringatan di UI: profil ini mengubah identitas yang dibaca aplikasi, tetapi tidak meloloskan hardware attestation.
Emulasi hardware (checkbox "Emulate this phone's hardware"). Untuk
developer: selain nama/model, template bisa membawa blok hardware (SoC, CPU,
GPU) sehingga aplikasi menjalankan jalur kode per-perangkat — misalnya cek
"ini Snapdragon?" atau cek merek — seperti di perangkat aslinya. Mencentang
kotak ini menerapkannya; tanpa dicentang (dan untuk identitas jujur Avo yang
tak punya hardware) profil hanya mengubah nama. Jalurnya, sesuai cara aplikasi
membaca hardware:
- SoC — properti read-only saat boot:
ro.soc.manufacturer/ro.soc.model(Build.SOC_MANUFACTURER/SOC_MODEL),ro.board.platform(codename yang dibaca pustaka deteksi SoC),ro.product.board(Build.BOARD), plus kunci vendor (ro.vendor.qti.*Snapdragon,ro.vendor.mediatek.*/ro.mediatek.*Dimensity). Ini jalur utama — hampir semua cek chipset lewat sini. - GPU — dua layer melaporkan GPU profil ke renderer milik aplikasi: layer
GLES (
libGLES_avo_profile.so) menjawabglGetString(GL_VENDOR,GL_RENDERER,GL_VERSION) dengan GPU profil alih-alih ANGLE, dan Vulkan layer (VK_LAYER_AVO_profile) menjawabVkPhysicalDeviceProperties(nama, vendorID, driver). GLES tetap digambar ANGLE di GPU Mac (ekstensi tetap milik ANGLE); SurfaceFlinger, HWUI, WebView dan instance Vulkan milik ANGLE sengaja tidak disentuh agar layar tetap benar. - CPU — mesin melaporkan model inti tiap cluster (MIDR) dan frekuensinya,
sehingga
/proc/cpuinfodan/sys/devices/system/cpucocok dengan target (satu policy cpufreq per cluster). Frekuensinya hanya nama: tiap vCPU tetap berjalan secepat Mac mengizinkan. - Yang tetap jujur dan tak dipalsukan (mengubahnya memecah aplikasi/driver):
ro.hardwaredan HAL, daftar ABI, level API, dan kemampuan GPU sebenarnya. Aplikasi yang bercabang pada.so/HAL khusus-Qualcomm tetap jatuh ke jalur fallback — dan itu justru informasi yang berguna bagi developer. Avo juga tetap menyatakan dirinya (ro.boot.avo.*,com.avodroid.feature.MAC), apa pun profilnya; ini bukan untuk mengelabui attestation.
- Notifikasi Android muncul di Notification Center macOS, dan meng-klik notifikasi akan membuka jendela aplikasinya.
- Clipboard tersinkron dua arah.
- Tampilan terang dan gelap: Pengaturan › Umum › Tampilan memilih Sistem (bawaan, mengikuti Mac termasuk saat berganti sendiri), Terang, atau Gelap, untuk semua jendela Avo (Pustaka, Pengaturan, jendela app dan panelnya, panel bar menu, widget). Tema gelap Android tetap mengikuti Mac.
- Drag file dari Finder ke jendela aplikasi akan menyalinnya ke
/sdcard/Downloaddan memicu share intent. - Gestur trackpad diterjemahkan ke gerakan Android: scroll dua jari, pinch untuk zoom, dan swipe.
- Kamera, mikrofon, dan lokasi diteruskan dengan prompt izin bawaan macOS. Kamera belakang dan depan Android masing-masing bisa emulasi, tidak ada, atau salah satu kamera Mac (Pengaturan › Perangkat › Kamera); kamera Mac hanya menyala selama app Android memakainya.
- Audio lewat virtio-snd ke CoreAudio.
- Quick boot dari snapshot, dan VM tetap jalan di latar belakang dengan memori yang dikembalikan saat idle.
- Mock sidik jari: jari yang didaftarkan dengan nama di Control Panel (Pengaturan › Sidik Jari) di-enroll Avo sendiri ke stack sidik jari Android (sensor virtual AOSP di image userdebug), jadi aplikasi (BiometricPrompt) dan layar kunci melihat sidik jari terdaftar. Menu Device › Fingerprint di title bar jendela aplikasi berisi jari-jari itu: memilih satu jari menyentuh sensor dengan jari tersebut; "Jari Tak Terdaftar" menyentuh dengan jari yang tidak dikenali; "Kelola Sidik Jari…" membuka Control Panel. Prompt sidik jari aplikasi tampil di layar Android sendiri (tidak terlihat di jendela), jadi selama aplikasi itu atau layar kunci meminta sidik jari, menu yang sama muncul juga sebagai tombol biru sendiri di title bar. Android hanya menerima sidik jari jika ada kunci layar (PIN, pola, atau sandi); menghapus kunci layar, atau Reset Android, menghapus semua sidik jari. Lima jari salah mengunci sidik jari 30 detik, dua puluh berturut-turut sampai kunci layar dimasukkan. Batasan: sensor virtual tidak menandatangani token perangkat keras, jadi aplikasi yang membuka kunci kriptografi (CryptoObject) dengan sidik jari menerima sentuhannya tetapi tidak bisa memakai kunci itu.
- Avo tidak membundel Android. Saat pertama dibuka, dan selama belum ada image Android yang bisa dipakai, Control Panel menampilkan Asisten Pengaturan: Selamat Datang, Versi Android, Izin (notifikasi, mikrofon, lokasi, masing-masing dengan kegunaan dan tombolnya), Aplikasi Google (opsional, menunjuk ke penginstal di Pengaturan › Sistem), lalu Siap: Android dijalankan dan progresnya ditampilkan. Bantuan › Asisten Pengaturan… membukanya lagi.
- Daftar versi diambil dari Android Build API publik Google (yang dipakai
ci.android.com dan
scripts/fetch-cuttlefish.sh): build sukses terbaru dari setiap versi Android, minimal Android 16, untuk targetaosp_cf_arm64_only_phone-userdebug, dengan nomor build, tanggal, dan ukuran unduhan. Endpoint, API key, branch, dan target diatur di satu tempat (AndroidBuildSource). - Unduhan bisa dijeda, dilanjutkan (juga setelah Avo ditutup), dan
dibatalkan. Ruang disk diperiksa sebelum mengunduh, dan unduhan dicocokkan
dengan MD5 dari API sebelum diekstrak. "Pakai Image di Mac Ini…" menerima
zip image, folder berisi file
.img, atau folder hasilfetch-cuttlefish.sh, dan memeriksanya dulu (arm64, userdebug, Android 16 atau lebih baru). - Image Cuttlefish adalah build Google, jadi tidak ditandatangani Avo: setelah
diperiksa, SHA-256 dan ukuran setiap file dicatat di
manifest.json, dan daemon memeriksanya sebelum Android dijalankan. - Pengaturan › Sistem › Versi Android menampilkan versi dan build yang terpasang, serta "Ganti Versi Android…" dengan peringatan yang jelas: naik versi tetap menyimpan aplikasi dan data; kembali ke Android yang lebih lama tidak bisa dengan data yang sama (data Android dihapus dulu); aplikasi Google harus sesuai dengan versi Android. Versi sebelumnya disimpan agar bisa kembali.
Keputusannya: image resmi tidak berisi komponen Google. Sebagai gantinya, user diberi tiga jalur yang bisa dipilih saat setup pertama.
| Jalur | Isi | Kelebihan | Kekurangan |
|---|---|---|---|
| Tanpa GMS (default) | AOSP murni + F-Droid atau Aurora Store | Paling bersih secara lisensi, paling ringan | Aplikasi yang bergantung pada Play Services (FCM, Maps, login Google) bisa error |
| microG | microG dengan signature spoofing yang dibatasi untuk microG | Push notification dan sebagian API Google jalan, open source | Kompatibilitasnya tidak 100%; beberapa aplikasi tetap menolak |
| Bring your own GApps | Wizard yang memasang paket GApps yang di-download sendiri oleh user | Play Store asli tersedia | Device harus didaftarkan sebagai "uncertified" lewat halaman registrasi Google; proyek tidak mendistribusikan file Google |
Yang tidak dilakukan: mendistribusikan APK Google di repo, rilis, atau mirror. Wizard hanya menerima file dari user dan memasangnya.
Rilis dibagikan sebagai DMG yang ditandatangani Developer ID dan sudah di-notarize, dengan update otomatis lewat Sparkle.
Distribusi
- Pengguna cukup mengunduh DMG dan menyeret aplikasinya ke folder Applications. Image Android (sekitar 1–2 GB) diunduh saat setup pertama, bukan dibundel di DMG (lihat "Setup awal dan versi Android").
- Entitlement yang dibutuhkan:
com.apple.security.hypervisoruntuk VM, serta kamera dan mikrofon yang diminta hanya saat dipakai. - Biaya Apple Developer Program (USD 99 per tahun) diperlukan untuk notarization. Ini satu-satunya biaya tetap proyek.
- Channel rilis: stable dan beta di GitHub Releases. Image Android diberi versi terpisah dari aplikasi macOS.
Lisensi
- Kode host dan Bridge Agent: Apache 2.0, supaya sejalan dengan AOSP. crosvm berlisensi BSD-3, jadi fork-nya tetap kompatibel.
- Komponen GPL (kernel Linux dan KernelSU) dipisahkan dengan jelas, dan source-nya dipublikasikan sesuai kewajiban GPL.
- Merek Android, Google Play, dan nama brand di template device hanya dipakai untuk keperluan kompatibilitas, bukan untuk branding produk.
Keamanan
- Kanal vsock hanya bisa diakses oleh proses daemon; tidak ada port TCP yang terbuka.
- ADB tidak pernah diekspos ke jaringan.
- App Shim berkomunikasi dengan daemon lewat XPC dengan validasi code signature pemanggil.
- Image Android diverifikasi dengan checksum dan tanda tangan sebelum dipasang.
Pengerjaan dibagi menjadi empat fase. Setiap fase baru dianggap selesai setelah gerbangnya terpenuhi, dan hasilnya sudah bisa dirilis sebagai beta.
| Fase | Isi | Gerbang |
|---|---|---|
| 1 · Fondasi | VM Android headless boot di Apple Silicon, Bridge Agent dan kanal vsock berjalan. Install APK lewat ADB, semua aplikasi tampil di satu jendela, daftar aplikasi dasar | APK di-install dari Finder dan aplikasinya bisa dipakai |
| 2 · Native | Satu VirtualDisplay per task, satu NSWindow per aplikasi, App Shim di Dock dan Launchpad. Notifikasi, clipboard, drag and drop, gestur trackpad, quick boot dari snapshot | 50 aplikasi uji berjalan di jendelanya sendiri |
| 3 · Gaming | Keymapping overlay, Mode FPS (mouse-look, ADS, re-centering), profil per package. Gamepad lewat GameController.framework, preset grafis Game berat (Vulkan, 90/120 FPS) | Delta Force, PUBG Mobile, Genshin Impact, dan Clash of Clans bisa dimainkan |
| 4 · Kontrol penuh | Control Panel lengkap, checkbox root, dropdown profil device. Wizard GMS: tanpa GMS, microG, atau bring your own GApps | Rilis publik 1.0 di GitHub Releases |
Fase 2 sengaja ditempatkan sebelum gaming: tanpa jendela per aplikasi, produk ini tidak ada bedanya dengan emulator biasa.
Risiko terbesar ada di jalur grafis dan di multi-display, karena dua hal ini paling menentukan apakah produk terasa native.
| Risiko | Dampak | Mitigasi |
|---|---|---|
| Performa gfxstream ke Metal kurang untuk game berat | Tinggi | Ukur sejak Fase 1 dengan game acuan, terutama Genshin Impact, PUBG Mobile, dan Delta Force; siapkan jalur Venus/Vulkan lewat MoltenVK sebagai alternatif |
| Aplikasi menolak jalan di VirtualDisplay sekunder | Tinggi | Uji 50 aplikasi populer di Fase 2; sediakan fallback "mode jendela tunggal" untuk aplikasi yang bermasalah |
| Play Integrity membuat aplikasi populer gagal | Sedang | Komunikasikan dengan jelas di README dan UI; kelola daftar kompatibilitas yang diisi komunitas |
| Update macOS mengubah perilaku Hypervisor.framework | Sedang | Ikuti rilis beta macOS dan uji di CI pada mesin Apple Silicon |
| Beban maintenance AOSP setiap rilis Android baru | Sedang | Tetap di satu versi AOSP stabil per tahun; patch Bridge Agent dibuat seminimal mungkin |
| Biaya mesin CI Apple Silicon | Rendah | Mulai dengan self-hosted runner di Mac kontributor |
| crosvm belum mendukung macOS (saat ini hanya KVM, WHPX, dan backend lain non-Apple) | Tinggi | Backend HVF ditulis di crate hypervisor crosvm memakai binding Rust Hypervisor.framework; dikerjakan di awal Fase 1 sebagai pekerjaan terbesar |
Pertanyaan terbuka
- Nama proyek: Avo.
- Versi AOSP: 16 atau lebih baru.
- Engine VM: crosvm, dengan backend Hypervisor.framework yang ditulis sendiri.
- Root: Magisk (KernelSU direncanakan semula; image Cuttlefish tidak membawanya).
- Game acuan: Delta Force, PUBG Mobile, Genshin Impact, Clash of Clans, ditambah game lain usulan komunitas.
- Logo: arah C, "Monogram a" (lihat brand.md).
- Daftar 50 aplikasi uji untuk kriteria kompatibilitas.
- Cek ketersediaan nama Avo di GitHub, domain, dan Homebrew.