The Rust compiler has been supporting Android for a long time now. However when you ask rustc to compile for Android, what it produces is an executable that you can only run through debugging tools. When we talk about developing for Android, what we usually want is an apk or Android package. An apk is a file that contains the Android application in addition to various resource files and that can be installed then run by an average user.

To automate building an apk, you may have heard of the android-rs-glue repository, which Servo uses. Through a weird trick, it would capture the arguments that rustc passed to the linker and instead manually invoke the linker itself, then setup a build directory and run the normal Android package building process.

One of the difficult part of setting up an Android environment was compiling Rust for Android. This would require some steps are not necessarily easy for everyone. But now that the Rustup utility appeared, you can obtain an Android-compatible with just rustup target add arm-linux-androideabi . Now only the only difficult part left was setting up android-rs-glue.

Announcing cargo-apk

A few days ago, I started reworking the content of android-rs-glue to make it much easier to use. The initial part of the rework has just landed.

Now, all you need to do is to compile for Android is:

Download the Android SDK and NDK, unzip them somewhere, and export the NDK_HOME and ANDROID_HOME environment variables to point to their content.

and environment variables to point to their content. Obtain an Android-compatible rustc. If you installed rustup, this is done with rustup target add arm-linux-androideabi .

. Run cargo install cargo-apk .

In the future this may be even more simplified by the fact that rustup could automatically distribute the NDK.

Now go to your project’s path and run cargo apk install . Provided that all the libraries you use support Android, you won’t need to make any modification to your source code.

This should build your crate just like any other crate, except that the final output is an Android package that runs the main function of your program at startup. Once this is done, it automatically runs adb install -r <path to apk> to install the app on your device so you can test it. If you don’t want to install the package, just run cargo apk .

Android_glue package

If you run cargo apk on a hello world program, starting the application will write hello world to the logs and show a black screen. This is obviously not very useful.

In order to interface with the Android environment, you will need to use the android_glue crate. This crate provides the functions required to capture user input and draw to the window through OpenGL or Vulkan.

It is important to note, however, that no function will allow you to get a native Android UI. This build system and this library are meant for applications that handle everything themselves, like video games. If you want a regular app you should write in Java.

Customizing the apk

In order to customize the apk, you can put additional elements in your Cargo.toml, like the basic example shows. Only a few values exist yet. This remains to be documented.

A few notes