Android Rust CLI
A command-line tool for scaffolding Android and Kotlin Multiplatform projects with Rust integration. Generate production-ready project templates with customizable package names, JNI bindings, and iOS C FFI support.
╭──────────────────────────────────────────╮
│ │
│ ╔═╗╔╗╔╔╦╗╦═╗╔═╗╦╔╦╗ ╦═╗╦ ╦╔═╗╔╦╗ │
│ ╠═╣║║║ ║║╠╦╝║ ║║ ║║ ╠╦╝║ ║╚═╗ ║ │
│ ╩ ╩╝╚╝═╩╝╩╚═╚═╝╩═╩╝ ╩╚═╚═╝╚═╝ ╩ │
│ │
╰──────────────────────────────────────────╯
Features
- Instant Project Setup — Create fully-configured Android + Rust projects in seconds
- Multiple Templates — Standard, multi-module, and KMP (Kotlin Multiplatform) layouts
- KMP Support — Kotlin Multiplatform template with Rust integration for both Android (JNI) and iOS (C FFI)
- Interactive Prompts — Project name, template, and package name are prompted interactively
- Smart Package Management — Automatic package name substitution across Kotlin, Rust, Gradle, and Xcode configs
- Environment Diagnostics —
doctorcommand checks your toolchain setup - Shell Completions — Full support for bash, zsh, fish, and PowerShell
- Dry Run Mode — Preview what will be created before writing files
- Custom Templates — Bring your own templates from any directory
- JNI Convention Handling — Automatic package name encoding for JNI bindings
- jni 0.22 Support — All templates use the latest jni crate with
EnvUnownedand error policies
Installation
[!IMPORTANT] Please use version 0.3.2 or later for KMP template support and interactive project name prompts.
Quick Start
# Create a new project (fully interactive — prompts for name, template, package)
# Create with a specific name
# Initialize in current directory
# Specify everything via flags (non-interactive)
# Preview without creating files
# See available templates with descriptions
Commands
new — Create a New Project
When NAME is omitted, the CLI will interactively prompt for a project name.
| Option | Description |
|---|---|
--template <NAME> |
Template to use (standard, multi-module, kmp-mobile) |
--package-name <PKG> |
Android package name (e.g., com.example.app) |
--template-path <PATH> |
Use custom templates from directory |
--force |
Overwrite existing files |
--dry-run |
Preview without creating files |
init — Initialize in Current Directory
Initialize a new project directly in the current directory.
# Init with standard template (default)
# Init with specific template
list-templates — View Available Templates
doctor — Check Environment
Diagnose your development environment:
Checks:
- ✓ Rust toolchain version
- ✓ Android NDK installation
- ✓ cargo-ndk availability
- ✓ Required Android targets
completions — Generate Shell Completions
# Bash
# Zsh
# Fish
# PowerShell
Templates
| Template | Description |
|---|---|
standard |
Basic Android + Rust JNI project with single module |
multi-module |
Clean architecture with app, domain, and data modules |
kmp-mobile |
Kotlin Multiplatform (Android + iOS) with Rust via JNI and C FFI |
KMP Mobile Template
The kmp-mobile template generates a full Kotlin Multiplatform project with:
- Compose Multiplatform UI shared across Android and iOS
- Rust workspace with three crates:
core— Shared pure Rust logicandroid— JNI bindings (cdylib) using jni 0.22ios— C FFI bindings (staticlib) with header file
- Kotlin expect/actual pattern for
RustBridgeacross platforms - iOS cinterop setup with
.deffile and header includes - Xcode project ready for iOS builds
- Android Rust Gradle Plugin integration for both Android and iOS Rust builds
Custom Templates
Use your own template directories:
# List custom templates
# Generate from custom template
Creating Custom Templates
- Create a directory for your template
- Add a
template.tomlfile (optional):
[]
= "My custom Android + Rust template"
= ["jni", "compose", "custom"]
-
Use Jinja2 template syntax in files:
{{ package_name }}— Package name (e.g., com.example.app){{ package_path }}— Package path (e.g., com/example/app){{ jni_package }}— JNI-encoded package (e.g., com_example_app){{ project_name }}— Project/folder name (e.g., my-app)
-
Use
__package_path__in directory names to create package structure
Non-Interactive Mode
For CI/CD pipelines, all options can be specified via flags:
Defaults when stdin is not a terminal:
- Project name:
my-project - Package:
dev.rodroid.rust - Template:
standard(if available)
Credits
Rodroid Mods