This is a native Android application for Ruffle.
It is in a very early stage.
Prebuilt APKs
The latest release (here) should have a few .apk
files uploaded as assets.
You can try this app by downloading and installing one of those.
-
For the vast majority of modern phones, tablets, single board computers, and small game consoles, you'll need the
arm64-v8a
version. -
The
armeabi-v7a
version is for older, 32-bit ARM stuff. -
The
x86_64
version is for some rare Intel/Microsoft tablets and/or for Chromebooks, and/or for running on a PC on Android-x86 or in Waydroid or similar. -
The
x86
version is there mostly just for completeness. -
The
universal
version should work on all 4 of the above architectures, but it's huge.
Build Prerequisites
- Install Android Sudio with at least the Platform SDK (e.g. version 29) and the NDK Tools (e.g. version 25).
- Ensure
java
is Java 17. cargo install cargo-ndk
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android
Build Steps
# substitute the appropriate location and version:
export ANDROID_NDK_ROOT=$HOME/Android/Sdk/ndk/24.0.8215888/
cd app
./gradlew assembleDebug # the "release" version requires a keyfile
The final APK should be at: app/ruffle/build/outputs/apk/debug/ruffle-universal-debug.apk
There are also single-arch split APKs next to it.
Opening the app
project in Android Studio for development and debugging also works.
Development Tips
Set the target of rust-analyzer
to x86_64-linux-android
(or even aarch64-linux-android
), to stop one of the NDK crates from erroring out due to compilation to an unsupported platform.
Also set the ANDROID_HOME
and ANDROID_NDK_ROOT
extra environment variables for it to suitable values, so the C parts of the dependencies can also be built by it.
TODO
In no particular order:
- Ability to show the built-in virtual keyboard (softinput), for text input
- Controller/Gamepad input?
- Mapped to key presses and/or virtual mouse pointer
- Own custom keyboard overlay, maybe even per-content configs
- Not an overlay, and not per-content, but custom keyboard is there
- Navigator backend (fetch, open browser)
- Opening links works at least
- Error/panic handling
- Loading "animation" (spinner)
- Logging?
- Alternative audio backend (OpenSL ES) for Android < 8
- UI backend (context menu)
- Context menu works
- Proper storage backend?
- Cross-platform build instructions?
- I think gradle should take care of it now
- Resolve design glitches/styling/theming (immersive mode, window insets for holes/notches/corners)
- Publish to various app stores, maybe automatically?
- Bundle demo animations/games
- Add ability to load content from well known online collections? (well maybe not z0r... unless?)
- History, favorites, other flair...?
- Clean up ~everything
DONE:
- Touch/mouse input
- Keyboard input: only with physical keyboard connected or through
scrcpy
- This was needed: rust-windowing/winit#2226
- Split into a separate repo
- Add ability to Open SWF by entered/pasted URL (or even directly from clipboard)
- No direct clipboard open, but easy to paste into the text field...
- Unglitchify rendering: scale, center and letterbox the content properly
- Ask CPAL/Oboe to open a "media" type output stream instead of a "call" one
- so the right volume slider controls it, and it uses the loud(er)speaker
- -> solved by switching to a direct AAudio (ndk-audio) backend
- Add building this to CI, at least to the release workflow
- This repo has its own CI setup, which builds APKs
- Simplify build process (hook cargo-apk into gradle, drop cargo-apk?)
cargo-apk is fine, but is only used to detect the SDK/NDK environment and run Cargo in it, and not to build an APK.- actually solved by switching to
cargo-ndk
and the corresponding Gradle plugin
- Somehow filter files to be picked to .swf
- How well this works depends on the file picker, but it "should work most of the time"
- Unglitchify audio volume (buttons unresponsive?)
- (pending: rust-windowing/winit#1919)
- actually solved by switching to GameActivity instead
- Register Ruffle to open .swf files
- How well this works depends on the application opening the file, but it "should work most of the time"
- Figure out why videos are not playing (could be a seeking issue)
- The video decoder features weren't enabled on
ruffle_core
...
- The video decoder features weren't enabled on
- Sign the APK
- Using a very simple key for now, with just my name in it
- Support for 32-bit ARM phones
- Untested, but should work in theory
- Support for x86(_64) tablets?
- Sorted out
- Consider not building the intermediate .apk just for the shared libraries
- Figured out, no intermediate .apk any more, only native libs built
- Unbreak the regular build on CI
- No longer relevant after the repo split
- Clean up commit history of the branch
- No longer relevant after the repo split