Skip to content

Android

Slint supports building Android applications in both Rust and C++. See also android module in the Rust API documentation.

Slint uses the android-activity crate ↗ as the interface to the operating system, which is re-exported as slint::android::android_activity.

To get started, follow these steps:

First, your project needs to be a library crate. Add the following to your Cargo.toml:

[lib]
crate_type = ["cdylib"]
toml

Select the version of android-activity you want to use:

[dependencies]
slint = { version = "1.18.0", features = ["backend-android-activity-06"] }
toml

It is safe to enable this feature unconditionally.

Then, in your lib.rs, add this function:

#[cfg(target_os = "android")]
#[unsafe(no_mangle)]
fn android_main(app: slint::android::AndroidApp) {
slint::android::init(app).unwrap();
let main_window = ...; // window generated by the Slint macros
main_window.run().unwrap();
}
rs

You can also add an Android event (android_activity::PollEvent ↗) listener by replacing the call to slint::android::init with slint::android::init_with_event_listener.

Next, we’re going to set up the environment to build the project.

The Android development workflow centers around the adb command line tool. Use it to connect to Android devices and emulators to upload and run applications.

The easiest way to install the Android development environment is to download and install Android Studio ↗. In the settings pane, navigate to the Android SDK page and install all SDK versions you need. We recommend to use the latest version available, because it can be configured to be backwards-compatible with older versions of Android. The SDK Manager is available in the settings in “Languages & Frameworks” > “Android SDK”.

Screenshot Android SDK Manager

Also note the SDK location on top, this path might have to be used for the ANDROID_HOME environment variable if the build tools can’t detect it automatically.

In the SDK Manager, also install:

  • The Android NDK (under the “SDK Tools” tab)
  • CMake (under the “SDK Tools” tab)

Set up these environment variables so the build can find the NDK:

Terminal window
export ANDROID_HOME=$HOME/Android/Sdk
export ANDROID_NDK_ROOT=$ANDROID_HOME/ndk/<version>
bash

Slint is written in Rust, so a Rust toolchain is needed to compile for Android. Install Rust via the Rust Getting Started Guide ↗, then add the Android target:

Terminal window
rustup target add aarch64-linux-android
bash

Add other targets if you need to support additional ABIs:

Terminal window
rustup target add armv7-linux-androideabi # armeabi-v7a
rustup target add x86_64-linux-android # x86_64 (emulator)
rustup target add i686-linux-android # x86 (emulator)
bash

Add the platform-tools directory to your PATH so that the adb tool is available on the command line.

To get a list of Android devices, simulators and emulators currently attached to your machine, run

Terminal window
adb devices
bash

You can connect to a physical device on the network by using

Terminal window
adb connect <host>
bash

The host is the IP address of the device; it has to have development mode enabled.

We recommend developing using a virtual device first, because it speeds up the development cycle. However, eventually you have to also test on a device to make sure that the interface is usable on a touch screen and to verify the look and feel.

To create and run a virtual device, use the Virtual Device Manager available in Android Studio. You can open it from its main screen under “More Actions”:

Screenshot Virtual Device Manager Menu Item

You can create any number of devices with different configurations here:

Screenshot Virtual Device Manager

A good approach is to have one device with the minimum API level supported by your application and another one with the latest release to make sure it runs on both.

Running virtual devices connect to adb automatically.

Depending on the device template you pick, the virtual devices created here might use a hardware keyboard by default, which is not helpful for testing your application.

To fix this, click on the three vertical dots next to the device in the manager to open up the menu and select “Show on disk”. In the directory displayed, open the file config.ini in a text editor. Navigate to the line hw.keyboard=yes and change it to hw.keyboard=no, then save the file.

This brings us to choose a stylus:

Screenshot Stylus Support

Disable the stylus input in the keyboard settings:

Screenshot Keyboard Settings

Select “Write in textfields” in the list and then disable that feature. This enables the regular virtual keyboard.

Define your main function and UI in your lib.rs:

#[cfg(target_os = "android")]
#[unsafe(no_mangle)]
fn android_main(app: slint::android::AndroidApp) {
slint::android::init(app).unwrap();
let main_window = MainWindow::new().unwrap();
main_window.run().unwrap();
}
rs

You can also add an Android event (android_activity::PollEvent ↗) listener by replacing the call to slint::android::init with slint::android::init_with_event_listener.

Slint doesn’t require a specific tool to build, upload, and run Android apps written in Rust. The app’s activity must be android.app.NativeActivity, or a subclass of it, because that’s the activity type Slint’s Android backend supports. This section covers some common tools that can package such an app. None of them needs Android Studio.

cargo-apk2 ↗ builds, signs, and installs the APK from your Cargo.toml, and can also compile Java and Kotlin sources into it. Install it and run your app on the connected device:

Terminal window
cargo install cargo-apk2
cargo apk2 run --target aarch64-linux-android --lib
bash

Declare the NativeActivity in your Cargo.toml:

[[package.metadata.android.application.activity]]
name = "android.app.NativeActivity"
[[package.metadata.android.application.activity.meta_data]]
name = "android.app.lib_name"
[[package.metadata.android.application.activity.intent_filter]]
actions = ["android.intent.action.VIEW", "android.intent.action.MAIN"]
categories = ["android.intent.category.LAUNCHER"]
toml

Set additional manifest values in the [package.metadata.android] table of your Cargo.toml. See the cargo-apk2 README ↗ for the available keys.

To build a release APK, run cargo apk2 build --target aarch64-linux-android --lib --release. The APK is then located in target/release/apk/.

cargo-apk ↗ generates the Android manifest, including the NativeActivity, from your Cargo.toml. Install it and run your app on the connected device:

Terminal window
cargo install cargo-apk
cargo apk run --target aarch64-linux-android --lib
bash

Set additional manifest values in the [package.metadata.android] table of your Cargo.toml. See the cargo-apk README ↗ for the available keys.

To build a release APK, run cargo apk build --target aarch64-linux-android --lib --release. The APK is then located in target/release/apk/.

cargo-ndk ↗ builds only the native library. Gradle, or Android Studio, then packages it like any other Android app. Use this setup to add Java or Kotlin code, or to build an Android App Bundle (AAB) for Google Play.

Build the library into the jniLibs directory of your Gradle project:

Terminal window
cargo install cargo-ndk
cargo ndk -t arm64-v8a -o app/src/main/jniLibs build --release --lib
bash

Declare a NativeActivity in AndroidManifest.xml, with android.app.lib_name set to your library name. The C++ tab of this page shows such a manifest, and the Slint Viewer ↗ is a complete example.

xbuild ↗ builds for Android and iOS. The release on crates.io (0.2.0) is outdated, so install the git version:

Terminal window
cargo install --git https://github.com/rust-mobile/xbuild.git
bash

The command line tool is called x. List the connected devices with x devices. For Android devices it talks to adb, so a device you connected with adb shows up here too.

To build your project, navigate to the directory containing your Cargo.toml and run

Terminal window
x run --device <id>
bash

Where <id> is shown in x devices as the leftmost column and is something like adb:emulator-1234 for virtual Android devices. To recompile and test changes, press ctrl-c and run the same command again.

If x run doesn’t work, run x doctor to check that xbuild finds all the tools it needs.

To build an APK for distribution, use something like

Terminal window
x build --platform android --arch arm64 --format apk --release
bash

The APK is then located in target/x/release/android/<name>.apk. Run x build --help for the other formats.


© 2026 SixtyFPS GmbH