Signed-off-by: ACh Sulfate <xenonhydride@gmail.com> Co-authored-by: John Wu <topjohnwu@gmail.com>
Native Development
Prerequisite
Install the NDK required to build and develop Magisk with ./build.py ndk
. The NDK will be installed to $ANDROID_SDK_ROOT/ndk/magisk
. You don't need to manually install a Rust toolchain with rustup
, as the NDK installed already has a Rust toolchain bundled.
Build Configs
All C/C++ code and its dependencies are built with ndk-build
and configured with several *.mk
files scattered in many places.
The src
folder is also a proper Cargo workspace, and all Rust code is built with cargo
just like normal Rust projects.
Rust + C/C++
To reduce complexity involved in linking, all Rust code is built as staticlib
and linked to C++ targets to ensure our final product is built with an officially supported NDK build system. Each C++ target can at most link to one Rust staticlib
or else multiple definitions error will occur.
We use the cxx
project for Rust and C++ interop.
Development / IDE
All C++ code should be recognized and properly indexed by Android Studio out of the box. For Rust:
- Install the Rust plugin in Android Studio
- In Preferences > Languages & Frameworks > Rust, set
$ANDROID_SDK_ROOT/ndk/magisk/toolchains/rust/bin
as the toolchain location - Open
native/src/Cargo.toml
, and select "Attach" in the "No Cargo projects found" banner
Note: run ./build.py binary
before developing to make sure generated code is created.