We resolve available partitions for sepolicy.rules when patching boot and bind mount the partition by magiskinit. For older devices, the previous logic won't work because the part name is never readable. Co-authored-by: topjohnwu <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.