🎉 Thanks for your interest in Ruffle! Contributions of all kinds are welcome.
Before you can build the app from source, you'll need to grab a few things.
- Install Android Studio with at least the Platform SDK (e.g. version 35) and the NDK Tools (e.g. version 26).
- Install jdk 17 (potentially included with Android Studio)
- Install rust
cargo install cargo-ndk
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android
- Set the
ANDROID_NDK_ROOT
environment variable to the location of the versioned ndk folder - for exampleANDROID_NDK_ROOT=$HOME/Android/Sdk/ndk/24.0.8215888/
If you're completely using the command line and bypassing Android Studio, make sure that the local.properties
file exists at the repository root folder. It can be empty.
To build the apks run ./gradlew assembleDebug
. You will find the resulting APKs in app/build/outputs/apk/debug/
.
Just open the repository root directory in Android Studio, it should automatically set up all the right things.
To speed up iteration, you can tell gradle to only build the rust project for one specific target - the emulator/device you're using.
To do this, add ndkTargets=arm64
(for example) to your local.properties
. To specify more than one target, separate them with a space.
The default value is all 4 targets, so that's cutting the build time by 75%!
An Android device is not required to build or test Ruffle. Android Studio defaults to deploying and testing on an emulator.
Feel free to install other emulators to help test different form factors or older versions of Android OS.
Set the target of your favourite tools (such as Rust Rover or Rust Analyzer) to aarch64-linux-android
(or similar)
to stop any errors from it trying to compile Android code for an unsupported platform.
If that isn't enough, you may also need to set the TARGET_CC
, TARGET_CXX
, and TARGET_AR
environment variables to the
full paths of the (sometimes API level-specific) clang
, clang++
, and llvm-ar
binaries from the NDK, respectively.
This means your ANDROID_NDK_ROOT
environment variable is missing or incorrect.
We have strict guidelines about trivial code quality matters (formatting and easily checkable lints). These are enforced by Github Actions, but you are encouraged to run these locally to avoid having to iterate after a PR has been opened.
Ruffle is built using the latest stable version of the Rust compiler. Nightly and unstable features should be avoided.
The Rust code in Ruffle strives to be idiomatic. The Rust compiler should emit no warnings when building the project.
Additionally, all code should be formatted using rustfmt
and linted using clippy
.
You can install these tools using rustup
:
rustup component add rustfmt
rustup component add clippy
You can auto-format your changes with rustfmt
cargo fmt --all
And you can run the clippy lints:
cargo ndk clippy --all --tests
Specific warnings and clippy lints can be allowed when appropriate using attributes, such as:
#[allow(clippy::float_cmp)]
We try to use Kotlin where possible, no Java. Additionally, we try to use best practices and maintain readable, idiomatic code.
To automatically format all Kotlin code, run:
./gradlew ktlintFormat
And to automatically lint the code, use:
./gradlew lint