The existing method for handling legacy SAR is: 1. Mount /sbin tmpfs overlay 2. Dump all patched/new files into /sbin 3. Magic mount root dir and re-exec patched stock init With Android 11 removing the /sbin folder, it is quite obvious that things completely break down right in step 1. To overcome this issue, we have to find a way to swap out the init binary AFTER we re-exec stock init. This is where 2SI comes to rescue! 2SI normal boot procedure is: 1st stage -> Load sepolicy -> 2nd stage -> boot continue... 2SI Magisk boot procedure is: MagiskInit 1st stage -> Stock 1st stage -> MagiskInit 2nd Stage -> -> Stock init load sepolicy -> Stock 2nd stage -> boot continue... As you can see, the trick is to make stock 1st stage init re-exec back into MagiskInit so we can do our setup. This is possible by manipulating some ramdisk files on initramfs based 2SI devices (old ass non SAR devices AND super modern devices like Pixel 3/4), but not possible on device that are stuck using legacy SAR (device that are not that modern but not too old, like Pixel 1/2. Fucking Google logic!!) This commit introduces a new way to intercept stock init re-exec flow: ptrace init with forked tracer, monitor PTRACE_EVENT_EXEC, then swap out the init file with bind mounts right before execv returns! Going through this flow however will lose some necessary backup files, so some bookkeeping has to be done by making the tracer hold these files in memory and act as a daemon. 2nd stage MagiskInit will ack the daemon to release these files at the correct time. It just works™ ¯\_(ツ)_/¯
Introduction
Magisk is a suite of open source tools for customizing Android, supporting devices higher than Android 4.2. It covers fundamental parts of Android customization: root, boot scripts, SELinux patches, AVB2.0 / dm-verity / forceencrypt removals etc.
Here are some feature highlights:
- MagiskSU: Provide root access to your device
- Magisk Modules: Modify read-only partitions by installing modules
- MagiskHide: Hide Magisk from root detections / system integrity checks
Download
Useful Links
- Installation Instruction
- OTA Upgrade Guide
- Full Official Docs
- Magisk Troubleshoot Wiki (by @Didgeridoohan)
Android Version Support
- Android 4.2+: MagiskSU and Magisk Modules Only
- Android 4.4+: All core features available
- Android 6.0+: Guaranteed MagiskHide support
- Android 7.0+: Full MagiskHide protection
- Android 9.0+: Magisk Manager stealth mode
Bug Reports
Canary Channels are cutting edge builds for those adventurous. To access canary builds, install either Canary Magisk Manager, switch to a Canary Channel in settings and upgrade.
Only bug reports from Canary DEBUG builds will be accepted.
For installation issues, upload both boot image and install logs.
For Magisk issues, upload boot logcat or dmesg.
For Magisk Manager crashes, record and upload the logcat when the crash occurs.
Building Magisk
- Clone sources:
git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git
- Magisk builds on any OS Android Studio supports. Install Android Studio and import the project.
- Python 3.6+. For Windows only, install Colorama with
pip install colorama
in admin shell. - Use the JDK bundled in Android Studio:
- macOS:
export JAVA_HOME="/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home"
- Linux:
export PATH="/path/to/androidstudio/jre/bin:$PATH"
- Windows: Add
C:\Path\To\Android Studio\jre\bin
to environment variablePATH
- macOS:
- Set environment variable
ANDROID_HOME
to the Android SDK folder - Download / clone FrankeNDK and set environment variable
ANDROID_NDK_HOME
to the folder - Set configurations in
config.prop
. A sample fileconfig.prop.sample
is provided. - Run
build.py
to see help messages. For each supported actions, use-h
to access help (e.g../build.py all -h
) - By default, the script builds everything in debug mode. If you want to build Magisk Manager in release mode (with the
-r, --release
flag), you need a Java Keystore (onlyJKS
format is supported) to sign APKs and zips. For more information, check Google's Documentation.
Translation Contributions
Default string resources for Magisk Manager and its stub APK are located here:
app/src/main/res/values/strings.xml
stub/src/main/res/values/strings.xml
Translate each and place them in the respective locations ([module]/src/main/res/values-[lang]/strings.xml
).
License
Magisk, including all git submodules are free software:
you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation,
either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.