A high-performance, rootless, open-source USB flashing utility for Android. Enables creating bootable Linux and Windows drives directly from your device.
- Direct SCSI Engine: Rust core using
USBDEVFS_BULKsynchronous ioctl — kernel manages DMA internally, bypassing theusbfs_memory_mbuserspace pool limit. - Adaptive AIMD Flow Control: Chunk size halves on ENOMEM, additively recovers after 200 cycles, but never exceeds
last_failing_size / 2. Prevents 64KB-128KB DMA oscillation. - Windows Deployment Core: Full Windows 10/11 ISO support with FAT32 formatting and intelligent WIM/SWM splitting for files >4GB.
- Per-SCSI Progress:
physical_positionupdates after each SCSI command, polled at 10Hz from the main thread — smooth UI without jank. - BLAKE3 Verification: Triple-buffered read-ahead verification with BLAKE3 hashing computes integrity check inline during source reads.
- ISO Validation: File content-probed at selection via Rust probes — only valid Linux or Windows ISOs accepted, with Snackbar feedback for unsupported files.
- Ultra-Lightweight: Full APK under 3MB.
- Auto-Eject: Drive ejected via SCSI START STOP UNIT on completion.
- Android App (
:app): Jetpack Compose UI (MVI-lite). SingleMainActivity, single screen with conditional overlays. - Native SDK (
:androidusbflasher): UniFFI + JNA bridge.AndroidUsbFlasher.ktwraps the native calls;UsbFlasherNative.ktis auto-generated. - Rust Core (11 crates):
hyntix-usb-flasher-jni: CDYLIB entry point, UniFFI exports ->libusbflasher.sohyntix-usb: SCSI BOT protocol,USBDEVFS_BULKwith AIMD flow controlhyntix-usb-flasher: Flash orchestration, BLAKE3 verification, progress pollinghyntix-windows,hyntix-fat32: UDF parsing, FAT32/GPT formatting, WIM splittinghyntix-iso,hyntix-udf,hyntix-wim: Filesystem parsers
- USB 2.0 ceiling: ~19 MB/s write, ~20 MB/s read verify (NAND-limited on typical flash drives)
- Initial burst: Pipeline starts at 256KB chunks, AIMD settles at stable size (64KB on constrained DMA pools, 128KB+ on larger pools)
- DMA constraint: Most Android devices have
usbfs_memory_mb< 8MB, forcing small URB sizes in aSUBMITURB/REAPURBpipeline.USBDEVFS_BULKbypasses this by delegating DMA to the kernel.
- Android 13+ (API 33)
- USB-OTG adapter + flash drive
- Install Android NDK r28+, Rust 1.85+,
rustup target add aarch64-linux-android - Install
uniffi-bindgenmatching the crate version:cargo install uniffi --version 0.31.2 --features cli - Build:
./gradlew assembleRelease - APK at
app/build/outputs/apk/release/app-arm64-v8a-release.apk
GPL-3.0. See LICENSE.