Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Sang kepiting hidup di dalam ponsel

Daniel me-root Xiaomi Mi 8, menaruh OpenCrabs ke dalam chroot Ubuntu di perangkat itu, lalu mengarahkan aplikasi Flutter ke sana lewat ACP. Setelah itu sang kepiting menulis aplikasi Android, membangun APK di ponsel dengan aapt2, javac, d8, dan apksigner, lalu memasangnya. Tanpa PC, tanpa cloud, tanpa Gradle, tanpa SDK.

Ada yang bilang Flutter jelek… ya (ironis) @opencrabs di dalam ponsel tersambung ke a2a di aplikasi flutter buatan sendiri. Bisa mengubah OS. Bisa menulis kode aplikasi android, compile dan membukanya… semua di dalam ponsel ini, beneran

Aplikasi pertama yang dibangun sepenuhnya di dalam ponsel pakai @opencrabs, ya, kodenya dibuat di dalam ponsel, apk dibangun dan dibuka. Nggak perlu pc ;)

Perangkatnya: Xiaomi Mi 8 (dipper), Android 10 / API 29, MIUI 12, aarch64, kernel 4.9.186, RAM 5,6 GB. Root datang dari boot image itu sendiri: Magisk menambalnya di ponsel, fastboot mem-flash-nya, dan sebuah verifier membongkar hasilnya untuk memeriksa ramdisk alih-alih memercayai log patch. Sekarang: magisk -c melaporkan 30.7:MAGISK:R.

Memasang userland Linux ke Android butuh dua percobaan. Generasi pertama mengirim binary aarch64-linux-android sebagai modul Magisk dengan skrip supervisor, yang berarti port cfg 59 file dan pertarungan glibc versus musl. Generasi kedua, yang berjalan hari ini, adalah chroot Ubuntu 24.04.5 dengan glibc 2.39, yang memang diminta binary linux-arm64 hasil rilis. Jebakan yang paling banyak memakan waktu: /apex adalah tmpfs berisi bind mount per-apex, jadi satu bind ke /apex menyalin direktori kosong dan setiap binary Android mati dengan “required file not found”, yang terbaca seperti error izin padahal itu interpreter yang hilang. Obatnya adalah me-bind setiap entri /apex/* satu per satu.

Lalu aplikasinya. Daniel ingin UI percakapan yang ia sukai di web, dibangun native di Flutter, bukan WebView. Jadi aplikasi itu berbicara ACP (JSON-RPC 2.0 lewat stdio) ke opencrabs acp yang berjalan di chroot, protokol yang sama dengan TUI: potongan penalaran langsung, kartu tool, prompt izin, pemakaian token. Tanpa browser, tanpa server, tanpa port terbuka.

  • Bertahan setelah reboot tanpa ada yang menyentuh ponsel: job JobScheduler yang mempersenjatai dirinya lagi tanpa syarat, hook service yang menunggu sys.boot_completed dan memasang ulang ketujuh mount, serta loop yang menerapkan lagi appops idle dan autostart MIUI karena powerkeeper menghapus pengecualian baterai sekitar 20 detik setelah boot
  • Bukti, dari logcat setelah reboot sungguhan: handshake ok di detik ke-12, service hidup, pengecualian baterai beres, lalu self test headless dengan hasil 12 lulus / 0 gagal, GREEN dalam 3,7 detik yang mencakup versi binary, shell, sesi, wiring boot, status service, pengecualian baterai, pengenal suara, izin mikrofon, binding widget, ACP siap, dan prompt sungguhan
  • APK yang dibangun di ponsel: MIUI mengirim tile perekam layarnya hanya dengan stub 20 KB di belakangnya, jadi mengetuknya membuka app store dan tidak merekam apa pun. Sang kepiting menulis tile Quick Settings sungguhan, membangunnya dalam enam langkah tanpa Gradle dan tanpa SDK manager, lalu menaruhnya di panel di samping WiFi. 12.784 byte.
  • Rantai build-nya: aapt2 compile → aapt2 link → javac --release 8 terhadap android.jar → d8 dari R8 → zip dex-nya masuk → zipalign → apksigner sign dan verify
  • Dipasang dari dalam chroot, menjangkau package manager Android lewat nsenter -t 1 -m, lalu diberi root dengan menulis baris kebijakan Magisk dan ditambahkan ke shade dengan cmd statusbar add-tile
  • Satu tubuh, dua otak: ACP itu stdio dan ssh -T juga stdio, jadi ponsel bisa menunjuk ke Mac di LAN tanpa jembatan dan tanpa port terbuka. Terukur: initialize dalam 1,2 detik, daftar sesi remote berisi 40, self test 9/9 GREEN terhadap otak remote

Bagian yang penting: tile itu tidak merekam apa pun sendiri. Ia memanggil, lewat su milik Magisk, binary perekam yang sama di dalam chroot yang dipakai perintah chat /rec, jadi ada satu perekam, satu file state, satu folder output. Sang kepiting menulis aplikasi Android yang menjadi pegangan untuk alat Linux di dalam ponsel yang sama. Aplikasinya adalah jempol, kepitingnya adalah otak. Itulah seluruh arsitektur proyek ini, dalam 13 KB.

Log penalaran dari sesi itu adalah detail yang layak disimpan: sang kepiting berhenti untuk memeriksa apakah ia benar-benar berada di ponsel, dan memastikannya dari runtime alih-alih berasumsi.

Lihat sumber di X ↗

APK yang dibangun di ponsel ↗