How To Guide Some hints for using Magisk on Android phones

Search This thread

bnsmb

Senior Member
Aug 22, 2017
212
108
Frankfurt
In this post I summarize everything I found out about using Magisk (https://topjohnwu.github.io/Magisk) until now. A lot of the infos in this post are already in my other posts in this board but hopefully this summary is useful anyway.
My main purpose is to configure Magisk as much as possible via scripts so this tutorial is mostly about using Magisk via CLI commands in an adb shell or from within scripts.

Please note that I mirror all my HowTos for Android on my web page:

http://bnsmb.de/My_HowTos_for_Android.html

I will update this post when I found something new and interesting. A history of changes in this post is at the end of the post.


PreRequisites

Most of the instructions below need an enabled adb access for the phone and root permissions for the adb shell. In addition, a working Recovery image that is able to mount the /data partition (like for example TWRP) is strongly recommended before starting to play with Magisk.

The Magisk version used for this tutorial is Magisk 25.1 and Magisk 25.2; the ROM used was OmniROM (Android 12 based).
The phone used was an ASUS Zenfone 8 but the instructions should work on other phones also.


Installation

Magisk consists out of two parts:

The Magisk App and the Magisk files in the boot partition. Without the files in the boot partition Magisk can do more or less nothing.

The Magisk App can be installed using the standard Android tools for installing apps.

The installation of the Magisk files into the boot partition can then be done using the Magisk App.

The official instructions to install Magisk into the boot partition are here:

https://topjohnwu.github.io/Magisk/install.html

Magisk can also be installed via script without user intervention into the boot partition -- see How to install Magisk into the boot partition using a script

Note that the Magisk files for the boot partition must be reinstalled after an OS upgrade but this can be done from within the Magisk App.


Uninstalling Magisk

Use the Button "Uninstall Magisk" in the Magisk App to uninstall Magisk.
The Magisk App can also remove the Magisk files from the boot partition.

To uninstall the Magisk App only via script do

Bash:
adb shell pm uninstall com.topjohnwu.magisk

To remove Magisk from the boot partition manually I suggest to flash the image of the original boot partition.


Installing Magisk Modules

Magisk Modules are extensions for Magisk to for example replace or add files to /system (and much more ... I suggest to study the documentation for Magisk for those that are interested in using Magisk)

Magisk Modules are distributed via ZIP files.

As of Magisk v25 or newer the official method to install Magisk Modules is to manually copy the ZIP file with the Magisk Module to the phone and then use the button "Install from storage" in the "Modules" sub menu in the Magisk App.

In previous versions of Magisk a Module browser to list and install Magisk Modules was part of the Magisk App but unfortunately the developer dropped that feature. Therefor you must search and download the available Magisk Modules using a browser on the phone or a PC.

Repositories with Magisk Modules are for example:

https://github.com/Magisk-Modules-Repo/

and

https://github.com/Magisk-Modules-Alt-Repo

A XDA thread about Magisk Modules (including a list of Magisk Modules) is here:

https://forum.xda-developers.com/t/collection-of-magisk-modules-v2.3575758/

There is now a new App for Android called "Fox's Magisk Module Manager" that can be used to list and download Magisk Modules to the phone (see https://github.com/Fox2Code/FoxMagiskModuleManager).


It's also possible to install a Magisk Module via script. The commands to install an Magisk Module via script are:

Bash:
# copy the Magisk Module to the phone

adb push /data/backup/Android/MagiskModules/Nano_for_Android_NDK-6_3-6300.zip /sdcard/Download/

# install the Module
#
# Note:
#
# The command can also be executed in a script runnning on the phone (without "adb shell")
#
adb shell magisk --install-module  /sdcard/Download/Nano_for_Android_NDK-6_3-6300.zip

# reboot the phone

adb reboot


Example:

Code:
[[email protected] ~]$ adb push  /data/backup/Android/MagiskModules/Nano_for_Android_NDK-6_3-6300.zip /sdcard/Download/
/data/backup/Android/MagiskModules/Nano_for_Android_NDK-6_3-6300.zip: 1 file pushed, 0 skipped. 37.6 MB/s (380554 bytes in 0.010s)

[[email protected] ~]$ adb shell magisk --install-module     /sdcard/Download/Nano_for_Android_NDK-6_3-6300.zip
- Current boot slot: _a
- Device is system-as-root
*****************************
 Nano for Android NDK
 by osm0sis @ xda-developers
*****************************
*******************
 Powered by Magisk
*******************
Archive:  /storage/emulated/0/Download/Nano_for_Android_NDK-6_3-6300.zip
  inflating: diffusion_config.sh
  inflating: module.prop
 
Mounting...
 
Extracting files...
Archive:  /storage/emulated/0/Download/Nano_for_Android_NDK-6_3-6300.zip
  inflating: META-INF/com/google/android/updater-script
  inflating: META-INF/com/google/android/update-binary
  inflating: sbin/nano
...
  inflating: etc/terminfo/l/linux
  inflating: customize.sh
  inflating: update.json
  inflating: bin/nano
  inflating: bin/nano.bin
  inflating: README.md
  inflating: diffusion_config.sh
  inflating: module.prop
 
Installing...
 
Installing nano to /data/adb/modules_update/nano-ndk/system/bin ...
Installing terminfo to /data/adb/modules_update/nano-ndk/system/etc ...
 
Unmounting...
 
Done!
[[email protected] ~]$  adb reboot
[[email protected] ~]$


Uninstalling a Magisk Module

Magisk Modules should be uninstalled via Magisk App if possible because there is no parameter for the magisk binary to uninstall a Magisk Module.

To force Magisk via shell command to remove the module after the next reboot create the file

remove

in the module directory.

If uninstalling the Magisk Module via Magisk does not work or if you want to uninstall a Magisk Module via script you can just delete the directory for the Magisk Module in /data/adb/modules and reboot the phone. This can be done in an adb shell or if that does not work anymore after rebooting the phone from a Recovery Image like TWRP, e.g.

Bash:
# uninstall the module "dummy_module" via adb shell commands
#

# check for an uninstall script for this module
#
if [ -x /data/adb/modules/dummy_module/uninstall.sh ] ; then
  echo "Executing the module uninstall script ...."
 
  /data/adb/modules/dummy_module/uninstall.sh
fi

adb shell rm -rf /data/adb/modules/dummy_module/

adb reboot

Note:

You should reboot the phone immediately after removing the directory with the Module.
This method is not really recommended.


List all installed Magisk Modules

The Magisk App will list all installed Magisk Modules

To list the installed Magisk Modules via CLI command use either

Bash:
adb shell ls -d /data/adb/modules/* | cut -f5 -d "/"


e.g.

Code:
[[email protected] ~]$ adb shell ls -d /data/adb/modules/* | cut -f5 -d "/"
PlayStore_for_MicroG
ccbins
dummy_module
initshell
nano-ndk
terminalmods
[[email protected] ~]$

# or

[[email protected] /]$ for i in $( adb shell  su - -c ls -d /data/adb/modules/* ); do printf "%-30s %s\n"  "${i##*/}" "$(  adb shell su - -c grep name= $i/module.prop 2>/dev/null | cut -f2 -d "=" | tr -s " " )" ; done
MiXplorer                      MiXplorer
PlayStore_for_MicroG           Patched Playstore from NanoDroid for MicroG (for ARM64 CPUs only)
ccbins                         Cross Compiled Binaries
dummy_module                   Dummy Module for testing a new module
initshell                      Create writable config files (/etc/profile) for sh
nano-ndk                       Nano for Android NDK
terminalmods                   Terminal Modifications
[[email protected] /]$

or on the phone:

Code:
[email protected]_I006D:/ # echo; for i in /data/adb/modules/*; do printf "%-30s %s\n"  "${i##*/}" "$(  grep name= $i/module.prop 2>/dev/null | cut -f2 -d "=" | tr -s " " )" ; done

PlayStore_for_MicroG           Patched Playstore from NanoDroid for MicroG (for ARM64 CPUs only)
ccbins                         Cross Compiled Binaries
dummy_module
initshell                      Create writable config files (/etc/profile) for sh
nano-ndk                       Nano for Android NDK
terminalmods                   Terminal Modifications
[email protected]_I006D:/ #


How to disable a Magisk Module

To disable a Magisk Module via script create a file called disable in the Module directory, e.g.:

Bash:
touch  /data/adb/modules/dummy_module/disable
The Magisk Module will then be disabled after the next reboot.

To re-enable the Magisk Module just delete the file disable in the Module directory and reboot the phone.

To list all disabled Magisk Modules do
Bash:
 adb shell ls /data/adb/modules/*/disable | cut -f5 -d "/"


Replacing files in /system using a Dummy Magisk Module

One feature of Magisk Modules is the possibility to change files in the sub directories in the directory /system or also add new files to the sub directories in the directory /system. /system is mounted read-only and in the current Android version it is not possible to remount /system read-write anymore so without Magisk it's very difficult to change files in /system.
Please note that you can not create new files or directories in the directory /system using this Magisk feature.

To test this feature you do not need to create a Magisk Module : It's sufficient to simulate a Magisk Module.

For that just create the necessary directory structure and files manually.

Magisk Modules are are installed in the directory /data/adb/modules. Each Magisk Module use an uniqe sub directory in that directory. To simulate a Magisk Module open an adb shell as user root and create the directories for your Dummy Magisk Module, e.g.:

Bash:
mkdir /data/adb/modules/dummy_module

# Next create the sub directory system in that new directory

mkdir /data/adb/modules/dummy_module/system

Now copy the files for /system to that directory: The files in that directory will overwrite existing files in /system after the next reboot. Files in that directory that not already exist in /system will be created in /system.

e.g.

Code:
# contents of my Dummy Magisk Module
#
[email protected]_I006D:/data/adb/modules/dummy_module/system # pwd
/data/adb/modules/dummy_module/system

[email protected]_I006D:/data/adb/modules/dummy_module/system # find .
.
./bin
./bin/my_new_binary
./etc
./etc/my_new_file_for_systme
[email protected]_I006D:/data/adb/modules/dummy_module/system #


After rebooting the phone the files are visible in /system:

Code:
[email protected]_I006D:/ # ls -l /system/etc/my_new_file_for_systme
-rw-rw-rw- 1 root root 20 2022-07-20 16:55 /system/etc/my_new_file_for_systme

[email protected]_I006D:/ # cat /system/etc/my_new_file_for_systme
This is my new file
[email protected]_I006D:/ #

[email protected]_I006D:/ # ls -l /system/bin/my_new_binary
-rwxr-xr-x 1 root root 41 2022-07-20 16:57 /system/bin/my_new_binary

[email protected]_I006D:/ # my_new_binary                                                                                                
Hello world from my dummy binary
[email protected]_I006D:/ #

The permissions for the new files in /system are equal to the permissions of the original files in
/data/adb/modules/dummy_module so if the original files are writable you can also edit the new files in /system, e.g

Code:
[email protected]_I006D:/ # cat /system/etc/my_new_file_for_systme
This is my new file
[email protected]_I006D:/ #

[email protected]_I006D:/ # echo "Test Test" >> /system/etc/my_new_file_for_systme                                                       
[email protected]_I006D:/ # cat /system/etc/my_new_file_for_systme
This is my new file
Test Test
[email protected]_I006D:/ #

These changes are persistent (because they change the original file in /data/adb/modules/<modulename>). You can also edit the files in /data/adb/modules/<modulename> but be aware that you can not use tools that create temporary files for changing the files like for example sed: Changes done with these kind of tools are only visible after a reboot of the phone.

To change the file via script I recommend to create a new file and then replace the existing file with the new file using cp.

This Magisk feature can also be used to make files in sub directories in /system writable -- see How to make files in system writable for detailed instructions.

Make sure that the new files for /system are readable for the user using them; e.g some files (like for example apk files) are used by the user system). IMHO it's recommended to add the read permission (chmod o+r) to all new files for /system.

Notes:

Magisk does not really change the files in /system - instead it uses "bind mounts" to replace the files with others. Therefor you can always restore the original files by deleting the files in /data/adb/modules/<module_name> and rebooting the phone. Another big advantage of this technique is that you do not have to take care about an update of the OS:
changes done via Magisk will also work after an OS upgrade (assuming you reinstalled Magisk to the boot partition after installing the OS update)

Please be careful when changing existing files in /system.

To add the necessary infos for the Magisk App to list your dummy module properly just create the file module.prop for your Dummy Magisk Module, e.g.

Code:
[email protected]_I006D:/ # cat /data/adb/modules/dummy_module/module.prop
id=dummy-module
name=Dummy Module for testing a new module
version=1.0
versionCode=1000
[email protected]
description=Dummy Module ..
[email protected]_I006D:/ #


For some examples for this technique see

How to change files in the directory /system with Magisk

How to replace the Fake Store from OmniROM with MicroG with a patched Playstore

How to change the home directory for the user root on an Android phone


How to use this technique to disable an app that can not be uninstalled

Apps that can not be uninstalled can be disabled by creating empty files for the app.

Example:

My Magisk Module for the patched Playstore must disable the FakeStore installed in the OmniROM with MicroG by default.

That's done by creating an empty file in the Magisk Module for the apk file for the FakeStore, the result looks like this:

Code:
[email protected]_I006D:/ # ls -l /data/adb/modules/PlayStore_for_MicroG/system/priv-app/FakeStore/FakeStore.apk                         
-rw-r--r-- 1 root root 1 2022-07-15 11:54 /data/adb/modules/PlayStore_for_MicroG/system/priv-app/FakeStore/FakeStore.apk
[email protected]_I006D:/ #

[email protected]_I006D:/ # ls -l /system/priv-app/FakeStore/FakeStore.apk                                                               
-rw-r--r-- 1 root root 1 2022-07-15 11:54 /system/priv-app/FakeStore/FakeStore.apk
[email protected]_I006D:/ #

In case there are multiple files in the folder for the app you can also hide the entire folder:

From the original documentation from https://topjohnwu.github.io/Magisk/guides.html:

If you place a file named .replace in any of the folders, instead of merging its contents, that folder will directly replace the one in the real system. This can be very handy for swapping out an entire folder.


How to access the files replaced by Magisk

Use another bind mount to access the files replaced by Magisk, e.g:

Code:
[email protected]_I006D:/ # head /data/adb/modules/fmradio/system/etc/public.libraries.txt                           
# See https://android.googlesource.com/platform/ndk/+/master/docs/PlatformApis.md
#
# 04.08.2022 /bs
#  added the library libqcomfm_jni.so
#
libandroid.so
libaaudio.so
libamidi.so
libbinder_ndk.so
libc.so
[email protected]_I006D:/ #
[email protected]_I006D:/ #


[email protected]_I006D:/ # head /system/etc/public.libraries.txt                                                                                                
# See https://android.googlesource.com/platform/ndk/+/master/docs/PlatformApis.md
#
# 04.08.2022 /bs
#  added the library libqcomfm_jni.so
#
libandroid.so
libaaudio.so
libamidi.so
libbinder_ndk.so
libc.so
[email protected]_I006D:/ #


# -> The file /system/etc/public.libraries.txt is replaced by a file from a Magisk Module

# To access the original version of the file /system/etc/public.libraries.txt do

[email protected]_I006D:/ #
[email protected]_I006D:/ # mkdir -p /data/test
[email protected]_I006D:/ #
[email protected]_I006D:/ # mount -o bind /system /data/test

#
# -> /data/test is now bind mounted to /system
#
# -> /data/test/etc/public.libraries.txt is the original version of that file:
#

[email protected]_I006D:/ #
[email protected]_I006D:/ # head /data/test/etc/public.libraries.txt                                                                                             
# See https://android.googlesource.com/platform/ndk/+/master/docs/PlatformApis.md
libandroid.so
libaaudio.so
libamidi.so
libbinder_ndk.so
libc.so
libcamera2ndk.so
libdl.so
libEGL.so
libGLESv1_CM.so
[email protected]_I006D:/ #


Replacing files in /vendor, /product, or /system_ext using a Dummy Magisk Module

The dummy Magisk Module can also be used to replace files in the directories /vendor, /product, or /system_ext:

from the Magisk documentation at https://topjohnwu.github.io/Magisk/guides.html:

If you want to replace files in /vendor, /product, or /system_ext, please place them under system/vendor, system/product, and system/system_ext respectively. Magisk will transparently handle whether these partitions are in a separate partition or not.

Note that this works only to replace existing files in these directories - you can not add new files to these directories using this method.

Example:

Code:
[email protected]_I006D:/ # cd /data/adb/modules/dummy_module/system
#
# files in the Magisk Module
#
[email protected]_I006D:/data/adb/modules/dummy_module/system # find . -type f
./bin/my_new_binary
./etc/my_new_file_for_systme
./product/mynewfile
./product/media/audio/alarms/Krypton.ogg
./vendor/mynewfile
./vendor/etc/sap.conf
./system_ext/mynewfile
./system_ext/etc/dpm/dpm.conf
[email protected]_I006D:/data/adb/modules/dummy_module/system #
#
#  the new files for /product, /vendor, and /system_ext in the Magisk Module do not exist:
#
[email protected]_I006D:/data/adb/modules/dummy_module/system # ls -l /product/mynewfile /vendor/mynewfile /system_ext/mynewfile
ls: /product/mynewfile: No such file or directory
ls: /vendor/mynewfile: No such file or directory
ls: /system_ext/mynewfile: No such file or directory

#
# The existing files in /product, /vendor, and /system_ext are replaced with the files from the Magisk Moduel
#
[email protected]_I006D:/data/adb/modules/dummy_module/system # cksum ./product/media/audio/alarms/Krypton.ogg  /product/media/audio/alarms/Krypton.ogg
4294967295 0 ./product/media/audio/alarms/Krypton.ogg
4294967295 0 /product/media/audio/alarms/Krypton.ogg
[email protected]_I006D:/data/adb/modules/dummy_module/system #

[email protected]_I006D:/data/adb/modules/dummy_module/system # cksum ./vendor/etc/sap.conf /vendor/etc/sap.conf
1967598015 7121 ./vendor/etc/sap.conf
1967598015 7121 /vendor/etc/sap.conf
[email protected]_I006D:/data/adb/modules/dummy_module/system #

[email protected]_I006D:/data/adb/modules/dummy_module/system # cksum  ./system_ext/etc/dpm/dpm.conf /system_ext/etc/dpm/dpm.conf
1970692378 2925 ./system_ext/etc/dpm/dpm.conf
1970692378 2925 /system_ext/etc/dpm/dpm.conf
[email protected]_I006D:/data/adb/modules/dummy_module/system #

[email protected]_I006D:/data/adb/modules/dummy_module/system # grep mynewfile /cache/magisk.log                       
01-01 00:11:51.764   767   769 W : Unable to add: /product/mynewfile, skipped
01-01 00:11:51.771   767   769 W : Unable to add: /system_ext/mynewfile, skipped
01-01 00:11:51.771   767   769 W : Unable to add: /vendor/mynewfile, skipped
[email protected]_I006D:/data/adb/modules/dummy_module/system #

A work around to create new files in sub directories in /product, /vendor, or /system_ext:

Copy the complete existing folder to the sub directory in

/data/adb/modules/<magisk_module>/system/[product|vendor|system_ext]/

and create the file .replace in that directory and add the new file(s) to that directory.

Example:

Code:
[email protected]_I006D:/ # find /data/adb/modules/testmodule/      
/data/adb/modules/testmodule/
/data/adb/modules/testmodule/system
/data/adb/modules/testmodule/system/product
/data/adb/modules/testmodule/system/product/lib
/data/adb/modules/testmodule/system/product/lib/.replace
/data/adb/modules/testmodule/system/product/lib/libframesequence.so
/data/adb/modules/testmodule/system/product/lib/libgiftranscode.so
/data/adb/modules/testmodule/system/product/lib/newfile001
/data/adb/modules/testmodule/system/vendor
/data/adb/modules/testmodule/system/vendor/app
/data/adb/modules/testmodule/system/vendor/app/TimeService
/data/adb/modules/testmodule/system/vendor/app/TimeService/TimeService.apk
/data/adb/modules/testmodule/system/vendor/app/TimeService/oat
/data/adb/modules/testmodule/system/vendor/app/TimeService/oat/arm64
/data/adb/modules/testmodule/system/vendor/app/TimeService/oat/arm64/TimeService.vdex
/data/adb/modules/testmodule/system/vendor/app/TimeService/oat/arm64/TimeService.odex
/data/adb/modules/testmodule/system/vendor/app/TimeService/newfile002
/data/adb/modules/testmodule/system/vendor/app/TimeService/.replace
/data/adb/modules/testmodule/system/system_ext
/data/adb/modules/testmodule/system/system_ext/app
/data/adb/modules/testmodule/system/system_ext/app/FM2
/data/adb/modules/testmodule/system/system_ext/app/FM2/.replace
/data/adb/modules/testmodule/system/system_ext/app/FM2/FM2.apk
/data/adb/modules/testmodule/system/system_ext/app/FM2/lib
/data/adb/modules/testmodule/system/system_ext/app/FM2/lib/arm64
/data/adb/modules/testmodule/system/system_ext/app/FM2/lib/arm64/libqcomfm_jni.so
/data/adb/modules/testmodule/system/system_ext/app/FM2/oat
/data/adb/modules/testmodule/system/system_ext/app/FM2/oat/arm64
/data/adb/modules/testmodule/system/system_ext/app/FM2/oat/arm64/FM2.odex
/data/adb/modules/testmodule/system/system_ext/app/FM2/oat/arm64/FM2.vdex
/data/adb/modules/testmodule/system/system_ext/app/FM2/newfile003
[email protected]_I006D:/ #

[email protected]_I006D:/ #   find /data/adb/modules/testmodule/system | grep newfile
/data/adb/modules/testmodule/system/product/lib/newfile001
/data/adb/modules/testmodule/system/vendor/app/TimeService/newfile002
/data/adb/modules/testmodule/system/system_ext/app/FM2/newfile003
[email protected]_I006D:/ #

[email protected]_I006D:/ # pwd
/
[email protected]_I006D:/ # ls -l $( find /data/adb/modules/testmodule/system | grep newfile | cut -f6- -d "/" )
-rw-r--r-- 1 root root 0 2022-08-07 14:34 system/product/lib/newfile001
-rw-r--r-- 1 root root 0 2022-08-07 14:24 system/system_ext/app/FM2/newfile003
-rw-r--r-- 1 root root 0 2022-08-07 14:36 system/vendor/app/TimeService/newfile002
[email protected]_I006D:/ #


See How to change any file or directory using Magisk for another approach to change files on read-only mounted filesystems.


Executing scripts while booting the phone

Magisk also supports executing additional scripts while booting the phone.

The scripts to be executed must be copied to one of these directories

/data/adb/post-fs-data.d/

/data/adb/service.d/


see the description in the original Magisk documentation: https://topjohnwu.github.io/Magisk/details.html

Working examples for this technique are described in these posts:

How to run a script atevery boot using Magisk

How to disable or change the swap device in the Android 12 from ASUS for the Zenfone 8

How to create or change a swap device in the OmniROM 12 using Magisk


Another example for using this technique I found here

https://gist.github.com/niikoo/3f6bd13a69f2d68f3dd51cc667e79bdc :

Bash:
# Boot logging
# Create the file: /data/adb/post-fs-data.d/0001logcatboot

#!/system/bin/sh
mkdir -p /cache/logs
/system/bin/logcat -r 1024 -n 9 -v threadTime -f /cache/logs/log >info.log 2>err.log &

Note that I added commands to create / cleanup the log directory and changed the logcat command on my phone:

Bash:
#!/system/bin/sh
 mkdir -p /cache/logs
rm -rf /cache/logs/*
/system/bin/logcat -r 102400 -n 9 -v threadTime -f /cache/logs/log >/cache/logs/info.log 2>/cache/logs/err.log &

To execute additional scripts earlier in the boot process you must add them to the boot image -- see the section Using Magisk to unpack and repack the boot image below for details.


Creating Magisk Modules

The official documentation for creating a Magisk Module is here: https://topjohnwu.github.io/Magisk/guides.html

Creating Magisk Modules that only use the standard features isn't that difficult and the official documentation should be sufficient.

I suggest to download an existing simple Magisk Module; unzip the ZIP file and study the contents.


Using Magisk to unpack and repack the boot image

The binary magiskboot that is part of the Magisk package can be used to unpack and repack the boot partition for every phone supported by Magisk.

For details see here: How to change files in the boot image using Magisk

Magisk also supports changing files in the root directory via Root Directory Overlays (see https://github.com/topjohnwu/Magisk/blob/master/docs/guides.md) :

This feature can be used to create additional start or stop services for the Android OS:

Android uses init *rc files to define the services to start when booting and also to define the services to run when doing the shutdown (like the systemd or initd in other Linux implementations).
These files are read early in the boot process and therefore reside only in the ramdisk on the boot partition. To add new init* rc files the boot image must be modified. This can be done with Magisk:

Just add the new init*rc files and optimal other scripts or files to the boot image using Magisk . Magisk will then take care of processing the new init*rc files by the Android operating system when booting the phone.
See these posts:

How to run a script at shutdown

How to trigger an action when a property is changed

How to enable root access using Magisk in a script

for examples for using that feature.


There are also magiskboot binaries for x86 in the Magisk apk file that can be used on a PC running the Linux OS:
see How to process Android boot image files on a PC running the Linux OS for more details about this feature.


Using Magisk to change the active slot

The Magisk App can also be used to change the active slot on phones with A/B slots -- for details see here :

How to manually switch the active slot



Directories and files used by Magisk

The directories and files used by Magisk are documented here https://topjohnwu.github.io/Magisk/guides.html

Some important directories and files for developing and trouble shooting Magisk Modules are:

The logfile used by Magisk is

/cache/magisk.log

In case something goes wrong with a Magisk Module you should first check that file.

The base directory for the data files for Magisk is

/data/adb

The config setttings for Magisk are stored in the SQLite database

/data/adb/magisk.db

To view (or probably) change the database entries via script you can either use sqlite3 binary (if installed)

Code:
ASUS_I006D:/ # sqlite3 /data/adb/magisk.db
SQLite version 3.7.6.3-Titanium
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

sqlite> .headers on
sqlite> .mode column
sqlite>
sqlite> .tables
denylist  policies  settings  strings
sqlite>
 sqlite> .schema
CREATE TABLE denylist (package_name TEXT, process TEXT, PRIMARY KEY(package_name, process));
CREATE TABLE policies (uid INT, policy INT, until INT, logging INT, notification INT, PRIMARY KEY(uid));
CREATE TABLE settings (key TEXT, value INT, PRIMARY KEY(key));
CREATE TABLE strings (key TEXT, value TEXT, PRIMARY KEY(key));
sqlite>
   sqlite> select * from denylist ;
sqlite>
sqlite> select * from policies ;
uid         policy      until       logging     notification
----------  ----------  ----------  ----------  ------------
2000        2           0           1           1
10134       1           0           1           1
sqlite>
sqlite> select * from settings ;
key         value
----------  ----------
denylist    0
su_biometr  0
sqlite>
sqlite> select * from strings ;
sqlite>

or the magisk binary, e.g:

Code:
ASUS_I006D:/ # magisk --sqlite  'select * from policies'                                                                         
logging=1|notification=1|policy=2|uid=2000|until=0
ASUS_I006D:/ #

ASUS_I006D:/ # magisk --sqlite  'select * from settings'                                                                         
key=denylist|value=0
key=su_biometric|value=0
ASUS_I006D:/ #

There is a handy little script to list all apps with root access in the XDA thread https://forum.xda-developers.com/t/magisk-general-support-discussion.3432382/page-2681 .


Magisk root access configuration details

Magisk uses the table policies in the sqlite database /data/adb/magisk.db to store the list of root enabled apps.

See this post https://forum.xda-developers.com/t/how-to-enable-root-access-using-magisk-in-a-script.4527035/ for details about this feature and how to enable root access via Magisk using a script.



Magisk App installation directory

Use
Bash:
pm list packages -f | grep magisk
to get the Magisk App installation directory.

Credits: https://forum.xda-developers.com/t/magisk-general-support-discussion.3432382/page-2689#post-87694851



The Magisk App Configuration files

The Magisk App stores the configuration (e.g. the app settings) in the default directory for App Settings, on my phone this is

/data/user_de/0/com.topjohnwu.magisk/shared_prefs

The file in that directory used to store the settings is

com.topjohnwu.magisk_preferences.xml

For more details about the file see the post Where does the Magisk App store the settings?.


Temporary Magisk config directory

While running Magisk uses a temporary directory for the configuration.

The path to the config directory can be retrieved via magisk binary:

Code:
ASUS_I006D:/dev/hP3B # magisk --path
/dev/hP3B
ASUS_I006D:/dev/hP3B#

The contents of that directory look like :

Code:
ASUS_I006D:/dev/hP3B # ls -al /dev/hP3B/
total 568
drwx------  3 root root    200 1970-01-01 04:08 .
drwxr-xr-x 27 root root   5480 2022-11-06 18:32 ..
drwxr-xr-x  8 root root    180 1970-01-01 04:08 .magisk
lrwxrwxrwx  1 root root     10 1970-01-01 04:08 magisk -> ./magisk64
-rwxr-xr-x  1 root root      0 1970-01-01 04:08 magisk32
-rwxr-xr-x  1 root root 247168 1970-01-01 04:08 magisk64
-rwxr-xr-x  1 root root 328240 1970-01-01 04:08 magiskpolicy
lrwxrwxrwx  1 root root      8 1970-01-01 04:08 resetprop -> ./magisk
lrwxrwxrwx  1 root root      8 1970-01-01 04:08 su -> ./magisk
lrwxrwxrwx  1 root root     14 1970-01-01 04:08 supolicy -> ./magiskpolicy

ASUS_I006D:/dev/hP3B # ls -al /dev/hP3B/.magisk/
total 7
drwxr-xr-x 8 root root  180 1970-01-01 04:08 .
drwx------ 3 root root  200 1970-01-01 04:08 ..
d--------- 2 root root  160 1970-01-01 04:08 block
drwxr-xr-x 2 root root 7240 1970-01-01 04:08 busybox
---------- 1 root root  127 1970-01-01 04:08 config
d--------- 7 root root  220 1970-01-01 04:08 mirror
drwxr-xr-x 3 root root 3452 2022-11-06 18:32 modules
drwxr-xr-x 2 root root    0 1970-01-01 04:08 pts
d--------- 2 root root   80 1970-01-01 04:08 selinux

ASUS_I006D:/dev/hP3B # cat /dev/hP3B/.magisk/config
KEEPVERITY=false
KEEPFORCEENCRYPT=false
PATCHVBMETAFLAG=false
RECOVERYMODE=false
SHA1=1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
ASUS_I006D:/dev/hP3B #


Backup of the boot partitions

Magisk creates backups of the boot partitions in sub directories in /data/adb with filenames starting with magisk_backup_, e.g.:

Code:
[email protected]_I006D:/data/adb # ls -l /data/magisk_backup_*
/data/magisk_backup_79f3370cd83d03441325998a8875888780c3182f:
total 31712
-rwxr-xr-x 1 root root 32436260 2022-09-26 12:20 boot.img.gz

/data/magisk_backup_a0c712541fd002c331c25772a3b8609ae2fba546:
total 31712
-rwxr-xr-x 1 root root 32436965 2022-09-27 19:30 boot.img.gz
[email protected]_I006D:/data/adb #

The uniq string after the second underscore in the name of the directory with the backup is the SHA-1 from the boot image that was patched to install Magisk:

Code:
[[email protected] /data/develop/android/scripts_on_linux]$ ./install_magisk_via_twrp.sh
install_magisk_via_twrp.sh version - v2.0.0.1 - add Magisk to the boot partition of a phone running Android using TWRP
....
Creating the boot image file "/sdcard/Download/boot_b.1086412.img" from the partition "/dev/block/by-name/boot_b" ...
196608+0 records in
196608+0 records out
100663296 bytes (96 M) copied, 0.313082 s, 307 M/s

Checking the result ...
-rw-rw---- 1 root media_rw 100663296 2022-11-06 16:01 /sdcard/Download/boot_b.1086412.img
...
OK, patching the boot partition "/dev/block/by-name/boot_b" was successfull
....
[[email protected] /data/develop/android/scripts_on_linux]$

The image file patched by Magisk in this example is /sdcard/Download/boot_b.1086412.img.

The backup of the boot partition on the phone created by Magisk for this installation is:
Code:
ASUS_I006D:/ # ls -ld /data/magisk_backup*                                  
drwxr-xr-x 2 root root 3452 2022-11-06 17:14 /data/magisk_backup_1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
ASUS_I006D:/ #

ASUS_I006D:/ # ls -l /data/magisk_backup_1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
total 50692
-rw-r--r-- 1 root root 51852324 2022-11-06 17:14 boot.img.gz
ASUS_I006D:/ #

1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb is the SHA-1 from the image file used for the installation of Magisk:

Code:
ASUS_I006D:/ # sha1sum /sdcard/Download/boot_b.1086412.img
1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb  /sdcard/Download/boot_b.1086412.img
ASUS_I006D:/ #

or

Code:
ASUS_I006D:/data/adb/workdir/unpack/ramdisk # /data/adb/magisk/magiskboot  sha1 /sdcard/Download/boot_b.1086412.img
1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
ASUS_I006D:/data/adb/workdir/unpack/ramdisk #

The SHA1 from the previous boot image is stored in the file /dev/hP3B/.magisk/config used by Magisk while running, e.g.:

Code:
ASUS_I006D:/data/adb/workdir/unpack/ramdisk # cat /dev/hP3B/.magisk/config
KEEPVERITY=false
KEEPFORCEENCRYPT=false
PATCHVBMETAFLAG=false
RECOVERYMODE=false
SHA1=1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
ASUS_I006D:/data/adb/workdir/unpack/ramdisk #

/dev/hP3B is a directory on the temporary ramdisk used by Magisk while it is running.

Use the command magisk --path to retrieve the path for the current ramdisk while Magisk is running, e.g.:

Code:
ASUS_I006D:/data/adb/workdir/unpack/ramdisk # magisk --path
/dev/hP3B
ASUS_I006D:/data/adb/workdir/unpack/ramdisk #

The SHA1 from the previous boot image is also stored in the file .backup/.magisk in the ramdisk of a boot image, e.g:

Code:
# Note: unpack the boot image and the ramdisk from the boot image to get that file
#
ASUS_I006D:/data/adb/workdir/unpack/ramdisk # cat .backup/.magisk
KEEPVERITY=false
KEEPFORCEENCRYPT=false
PATCHVBMETAFLAG=false
RECOVERYMODE=false
SHA1=1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
 ASUS_I006D:/data/adb/workdir/unpack/ramdisk #

To do it all in once use:

Bash:
grep "^SHA1=" $( magisk --path )/.magisk/config | cut -f2 -d "="
e.g.:

Code:
ASUS_I006D:/data/adb/workdir/unpack/ramdisk # grep "^SHA1=" $( magisk --path )/.magisk/config | cut -f2 -d "="
1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
ASUS_I006D:/data/adb/workdir/unpack/ramdisk # #


Backup the Magisk config

To backup the Magisk config just copy the directories in /data/adb except the directory /data/adb/magisk (that directory is used for the binaries only)

Code:
adb shell tar --exclude data/adb/magisk/ -czf /sdcard/Download/magisk_config_$( date +%Y-%m-%d).$$.tar /data/adb/

To restore the backup unpack the tar file on the phone and reboot the phone.

To also create a backup the settings from the Magisk App create a backup of the directory with the Magisk App Settings (see above for details).



Start/Stop the Magisk App

To start the Magisk App via CLI command use

Bash:
am start -n com.topjohnwu.magisk/.ui.MainActivity


To stop the Magisk App via CLI command use:

Bash:
am force-stop  com.topjohnwu.magisk


Start/Stop the Magisk Daemon

To stop the Magisk Daemon use

Bash:
magisk --stop

Be aware that stopping the magisk daemon will remove all bind mounts for files in /system. To re-enable these bind mounts a reboot is required.

To start the Magisk Daemon use

Bash:
/data/adb/magisk/magisk64 --daemon

To check if the Magisk Daemon is running use

Bash:
/data/adb/magisk/magisk64 -v

Example output:

Code:
# Magisk Daemon is running

ASUS_I006D:/ # /data/adb/magisk/magisk64 -v
25.2:MAGISK:R
ASUS_I006D:/ #

# Magisk Daemon is not running

|ASUS_I006D:/ # /data/adb/magisk/magisk64 -v
No daemon is currently running!
1|ASUS_I006D:/ #


Building Magisk

The Magisk source code is available at

https://github.com/topjohnwu/Magisk

There are also instructions how to create a local copy of the repository and compile Magisk on that page. I've successfully build Magisk using these instructions.


Miscellaneous

magiskboot
can also be used compress or decompress files:

Code:
1|ASUS_I006D:/data/adb/magisk # ./magiskboot      
MagiskBoot - Boot Image Modification Tool

Usage: ./magiskboot <action> [args...]

Supported actions:
...

 compress[=format] <infile> [outfile]
   Compress <infile> with [format] to [outfile].
   <infile>/[outfile] can be '-' to be STDIN/STDOUT.
   If [format] is not specified, then gzip will be used.
   If [outfile] is not specified, then <infile> will be replaced
   with another file suffixed with a matching file extension.
   Supported formats: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg

 decompress <infile> [outfile]
   Detect format and decompress <infile> to [outfile].
   <infile>/[outfile] can be '-' to be STDIN/STDOUT.
   If [outfile] is not specified, then <infile> will be replaced
   with another file removing its archive format file extension.
   Supported formats: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg

1|ASUS_I006D:/data/adb/magisk #

magiskboot is also used in TWRP to unpack and repack the boot image for installing Magisk


Using the magisk binary while the phone is booted into TWRP

If the used TWRP can mount the volume for /data you can also use the binary magisk while in TWRP. The magisk binary is not in the path while booted into TWRP - therefor you must use the fully qualified filename:

This is

/data/adb/magisk/magisk64

for 64 Bit CPUs and

/data/adb/magisk/magisk32

for 32 Bit CPUs.

Some functions of Magisk are only usable if the Magisk daemon is running. To start the Magisk daemon the Magisk binary can also be used - example:

Code:
# read the policies table from the Magisk squlite database
#
ASUS_I006D:/ # /data/adb/magisk/magisk64 --sqlite "select * from policies ;"                                                                         
No daemon is currently running!

#
# -> the Magisk daemon is not running -> start it
#
1|ASUS_I006D:/ # /data/adb/magisk/magisk64 --daemon
ASUS_I006D:/ #

ASUS_I006D:/ # /data/adb/magisk/magisk64 --sqlite "select * from policies ;"                                                                           
logging=1|notification=1|policy=2|uid=2000|until=0
logging=1|notification=1|policy=2|uid=10135|until=0
logging=1|notification=1|policy=2|uid=10143|until=0
logging=1|notification=1|policy=2|uid=10055|until=0
logging=1|notification=1|policy=2|uid=10142|until=0
ASUS_I006D:/ #

Use

Bash:
/data/adb/magisk/magisk64 -V

to check if the Magisk daemon is running

Use

Bash:
/data/adb/magisk/magisk64 --stop

to stop the Magisk Daemon, e.g.:

Code:
ASUS_I006D:/ # /data/adb/magisk/magisk64 -V
25200

# -> The Magisk Daemon is running

ASUS_I006D:/ # /data/adb/magisk/magisk64 --stop                                                                                                          
ASUS_I006D:/ #

ASUS_I006D:/ # /data/adb/magisk/magisk64 -V                                                                                                              
No daemon is currently running!
1|ASUS_I006D:/ # 2D


Trouble Shooting

If something went wrong and booting the phone does not work anymore after installing a Magisk Module just remove the files in /data/adb/modules/<modulename> and reboot the phone :

Either connect via adb to the not booting phone (this should be possible in most cases even if the boot process does not finish), delete the files, and reboot the phone. Or reboot the phone from a Recovery image like TWRP, delete the files in /data/adb/modules/<modulename>, and reboot the phone.

The same procedure can be used if booting the phone does not work anymore after adding another init script - just delete the new script in /data/adb/post-fs-data.d or /data/adb/service.d and reboot the phone

An error like this

Code:
08-06 18:41:39.341 +0000  1356  1726 W ziparchive: Unable to open '/system/app/AsusFMRadio/AsusFMRadio.apk': Permission denied
08-06 18:41:39.341 +0000  1356  1726 E system_server: Failed to open APK '/system/app/AsusFMRadio/AsusFMRadio.apk': I/O error
08-06 18:41:39.354 +0000  1356  1356 W PackageManager: Failed to parse /system/app/AsusFMRadio: Failed to parse /system/app/AsusFMRadio/AsusFMRadio.apk

is most of the time caused by missing read permissions for the file.

Use

Bash:
chmod o+r /system/app/AsusFMRadio/AsusFMRadio.apk

to fix it.


To catch errors from a script executed by Magisk you might use this technique:

Bash:
# redirect STDERR of all commands in the script to a file
#
exec 2>/data/script_stderr.log
set -x

... rest of your script

To remove all installed Magisk Modules using the official method use:

Code:
magisk --remove-modules

to remove all modules (but not the new init scripts!) and reboot the phone

According to the FAQ Magisk will not start if the phone is booted into safe mode (see
https://topjohnwu.github.io/Magisk/faq.html)

Be aware that after rebooting the phone again in normal mode all Magisk Modules are disabled and must be enabled again using either the Magisk App or a CLI command:

To reenable all Magisk Modules via shell command do
Bash:
adb shell rm /data/adb/modules/*/disable


HIstory

07.08.2022 /bs

Added additional infos about the permissions for new files for /system.
Added additional commands to the script for catching the OS logs while booting the phone
Added infos about a workaround to add new files to /product, /vendor, or /system_ext
Added infos about how to access file replaced by a Magisk Module

20.09.2022 /bs
Added new links to posts about configuring swap devices via Magisk script
Added a link to the post about how to use Magisk to unpack and repack the boot image

28.09.2022 /bs
Added infos about the backups of the boot partitions created by Magisk

30.09.2022 /bs
Added a short info about using Magisk Overlays to change files in the root filesystem
Added the URL for the post with how to change the active slot using the Magisk App

02.10.2022 /bs
Added a short info about Root Directory Overlay system from Magisk

04.10.2022 /bs
Add an URL to another post to use the Root Directory Overlay system from Magsik
Fixed some spelling errors and also some errors in the code examples
Added more details about changing files in /system

26.10.2022/bs
Added the section Miscellaneous

28.10.2022/bs

Added the section Start/Stop the Magisk App
Added the section Start/Stop the Magisk Daemon

02.11.2022 /bs


added the infos about the x86 version of the magiskboot executables in the Magisk apk file
fixed some spelling and formatting errors

04.11.2022/bs

add the link to the Howto about making a file in /system writable
corrected some formatting errors

06.11.2022/bs

added more details about the boot partition backups created by Magisk
added missing "su - -c" to some adb shell commands

07.11.2022/bs

added more details about the boot partition backups created by Magisk
added the section about the temporary Magisk config directory

08.11.2022/bs

added the section about how to get the Magisk App installation directory

25.11.2022/bs

added infos about how to build Magisk using a local copy of the repository

02.12.2022 /bs

added the infos about sing the magisk binary while the phone is booted into TWRP

06.12.2022 /bs

added the section Magisk root access configuration details
added infos about the files used to store the settings for the Magisk App

30.12.2022 /bs

added more infos about how to add new start / stop services in Android
 
Last edited:

LEENO

Senior Member
Oct 7, 2008
343
170
What do you mean with "Automatic Response"?
Screenshot_20210130-092709.jpg
 

Top Liked Posts

  • There are no posts matching your filters.
  • 3
    In this post I summarize everything I found out about using Magisk (https://topjohnwu.github.io/Magisk) until now. A lot of the infos in this post are already in my other posts in this board but hopefully this summary is useful anyway.
    My main purpose is to configure Magisk as much as possible via scripts so this tutorial is mostly about using Magisk via CLI commands in an adb shell or from within scripts.

    Please note that I mirror all my HowTos for Android on my web page:

    http://bnsmb.de/My_HowTos_for_Android.html

    I will update this post when I found something new and interesting. A history of changes in this post is at the end of the post.


    PreRequisites

    Most of the instructions below need an enabled adb access for the phone and root permissions for the adb shell. In addition, a working Recovery image that is able to mount the /data partition (like for example TWRP) is strongly recommended before starting to play with Magisk.

    The Magisk version used for this tutorial is Magisk 25.1 and Magisk 25.2; the ROM used was OmniROM (Android 12 based).
    The phone used was an ASUS Zenfone 8 but the instructions should work on other phones also.


    Installation

    Magisk consists out of two parts:

    The Magisk App and the Magisk files in the boot partition. Without the files in the boot partition Magisk can do more or less nothing.

    The Magisk App can be installed using the standard Android tools for installing apps.

    The installation of the Magisk files into the boot partition can then be done using the Magisk App.

    The official instructions to install Magisk into the boot partition are here:

    https://topjohnwu.github.io/Magisk/install.html

    Magisk can also be installed via script without user intervention into the boot partition -- see How to install Magisk into the boot partition using a script

    Note that the Magisk files for the boot partition must be reinstalled after an OS upgrade but this can be done from within the Magisk App.


    Uninstalling Magisk

    Use the Button "Uninstall Magisk" in the Magisk App to uninstall Magisk.
    The Magisk App can also remove the Magisk files from the boot partition.

    To uninstall the Magisk App only via script do

    Bash:
    adb shell pm uninstall com.topjohnwu.magisk

    To remove Magisk from the boot partition manually I suggest to flash the image of the original boot partition.


    Installing Magisk Modules

    Magisk Modules are extensions for Magisk to for example replace or add files to /system (and much more ... I suggest to study the documentation for Magisk for those that are interested in using Magisk)

    Magisk Modules are distributed via ZIP files.

    As of Magisk v25 or newer the official method to install Magisk Modules is to manually copy the ZIP file with the Magisk Module to the phone and then use the button "Install from storage" in the "Modules" sub menu in the Magisk App.

    In previous versions of Magisk a Module browser to list and install Magisk Modules was part of the Magisk App but unfortunately the developer dropped that feature. Therefor you must search and download the available Magisk Modules using a browser on the phone or a PC.

    Repositories with Magisk Modules are for example:

    https://github.com/Magisk-Modules-Repo/

    and

    https://github.com/Magisk-Modules-Alt-Repo

    A XDA thread about Magisk Modules (including a list of Magisk Modules) is here:

    https://forum.xda-developers.com/t/collection-of-magisk-modules-v2.3575758/

    There is now a new App for Android called "Fox's Magisk Module Manager" that can be used to list and download Magisk Modules to the phone (see https://github.com/Fox2Code/FoxMagiskModuleManager).


    It's also possible to install a Magisk Module via script. The commands to install an Magisk Module via script are:

    Bash:
    # copy the Magisk Module to the phone
    
    adb push /data/backup/Android/MagiskModules/Nano_for_Android_NDK-6_3-6300.zip /sdcard/Download/
    
    # install the Module
    #
    # Note:
    #
    # The command can also be executed in a script runnning on the phone (without "adb shell")
    #
    adb shell magisk --install-module  /sdcard/Download/Nano_for_Android_NDK-6_3-6300.zip
    
    # reboot the phone
    
    adb reboot


    Example:

    Code:
    [[email protected] ~]$ adb push  /data/backup/Android/MagiskModules/Nano_for_Android_NDK-6_3-6300.zip /sdcard/Download/
    /data/backup/Android/MagiskModules/Nano_for_Android_NDK-6_3-6300.zip: 1 file pushed, 0 skipped. 37.6 MB/s (380554 bytes in 0.010s)
    
    [[email protected] ~]$ adb shell magisk --install-module     /sdcard/Download/Nano_for_Android_NDK-6_3-6300.zip
    - Current boot slot: _a
    - Device is system-as-root
    *****************************
     Nano for Android NDK
     by osm0sis @ xda-developers
    *****************************
    *******************
     Powered by Magisk
    *******************
    Archive:  /storage/emulated/0/Download/Nano_for_Android_NDK-6_3-6300.zip
      inflating: diffusion_config.sh
      inflating: module.prop
     
    Mounting...
     
    Extracting files...
    Archive:  /storage/emulated/0/Download/Nano_for_Android_NDK-6_3-6300.zip
      inflating: META-INF/com/google/android/updater-script
      inflating: META-INF/com/google/android/update-binary
      inflating: sbin/nano
    ...
      inflating: etc/terminfo/l/linux
      inflating: customize.sh
      inflating: update.json
      inflating: bin/nano
      inflating: bin/nano.bin
      inflating: README.md
      inflating: diffusion_config.sh
      inflating: module.prop
     
    Installing...
     
    Installing nano to /data/adb/modules_update/nano-ndk/system/bin ...
    Installing terminfo to /data/adb/modules_update/nano-ndk/system/etc ...
     
    Unmounting...
     
    Done!
    [[email protected] ~]$  adb reboot
    [[email protected] ~]$


    Uninstalling a Magisk Module

    Magisk Modules should be uninstalled via Magisk App if possible because there is no parameter for the magisk binary to uninstall a Magisk Module.

    To force Magisk via shell command to remove the module after the next reboot create the file

    remove

    in the module directory.

    If uninstalling the Magisk Module via Magisk does not work or if you want to uninstall a Magisk Module via script you can just delete the directory for the Magisk Module in /data/adb/modules and reboot the phone. This can be done in an adb shell or if that does not work anymore after rebooting the phone from a Recovery Image like TWRP, e.g.

    Bash:
    # uninstall the module "dummy_module" via adb shell commands
    #
    
    # check for an uninstall script for this module
    #
    if [ -x /data/adb/modules/dummy_module/uninstall.sh ] ; then
      echo "Executing the module uninstall script ...."
     
      /data/adb/modules/dummy_module/uninstall.sh
    fi
    
    adb shell rm -rf /data/adb/modules/dummy_module/
    
    adb reboot

    Note:

    You should reboot the phone immediately after removing the directory with the Module.
    This method is not really recommended.


    List all installed Magisk Modules

    The Magisk App will list all installed Magisk Modules

    To list the installed Magisk Modules via CLI command use either

    Bash:
    adb shell ls -d /data/adb/modules/* | cut -f5 -d "/"


    e.g.

    Code:
    [[email protected] ~]$ adb shell ls -d /data/adb/modules/* | cut -f5 -d "/"
    PlayStore_for_MicroG
    ccbins
    dummy_module
    initshell
    nano-ndk
    terminalmods
    [[email protected] ~]$
    
    # or
    
    [[email protected] /]$ for i in $( adb shell  su - -c ls -d /data/adb/modules/* ); do printf "%-30s %s\n"  "${i##*/}" "$(  adb shell su - -c grep name= $i/module.prop 2>/dev/null | cut -f2 -d "=" | tr -s " " )" ; done
    MiXplorer                      MiXplorer
    PlayStore_for_MicroG           Patched Playstore from NanoDroid for MicroG (for ARM64 CPUs only)
    ccbins                         Cross Compiled Binaries
    dummy_module                   Dummy Module for testing a new module
    initshell                      Create writable config files (/etc/profile) for sh
    nano-ndk                       Nano for Android NDK
    terminalmods                   Terminal Modifications
    [[email protected] /]$

    or on the phone:

    Code:
    [email protected]_I006D:/ # echo; for i in /data/adb/modules/*; do printf "%-30s %s\n"  "${i##*/}" "$(  grep name= $i/module.prop 2>/dev/null | cut -f2 -d "=" | tr -s " " )" ; done
    
    PlayStore_for_MicroG           Patched Playstore from NanoDroid for MicroG (for ARM64 CPUs only)
    ccbins                         Cross Compiled Binaries
    dummy_module
    initshell                      Create writable config files (/etc/profile) for sh
    nano-ndk                       Nano for Android NDK
    terminalmods                   Terminal Modifications
    [email protected]_I006D:/ #


    How to disable a Magisk Module

    To disable a Magisk Module via script create a file called disable in the Module directory, e.g.:

    Bash:
    touch  /data/adb/modules/dummy_module/disable
    The Magisk Module will then be disabled after the next reboot.

    To re-enable the Magisk Module just delete the file disable in the Module directory and reboot the phone.

    To list all disabled Magisk Modules do
    Bash:
     adb shell ls /data/adb/modules/*/disable | cut -f5 -d "/"


    Replacing files in /system using a Dummy Magisk Module

    One feature of Magisk Modules is the possibility to change files in the sub directories in the directory /system or also add new files to the sub directories in the directory /system. /system is mounted read-only and in the current Android version it is not possible to remount /system read-write anymore so without Magisk it's very difficult to change files in /system.
    Please note that you can not create new files or directories in the directory /system using this Magisk feature.

    To test this feature you do not need to create a Magisk Module : It's sufficient to simulate a Magisk Module.

    For that just create the necessary directory structure and files manually.

    Magisk Modules are are installed in the directory /data/adb/modules. Each Magisk Module use an uniqe sub directory in that directory. To simulate a Magisk Module open an adb shell as user root and create the directories for your Dummy Magisk Module, e.g.:

    Bash:
    mkdir /data/adb/modules/dummy_module
    
    # Next create the sub directory system in that new directory
    
    mkdir /data/adb/modules/dummy_module/system

    Now copy the files for /system to that directory: The files in that directory will overwrite existing files in /system after the next reboot. Files in that directory that not already exist in /system will be created in /system.

    e.g.

    Code:
    # contents of my Dummy Magisk Module
    #
    [email protected]_I006D:/data/adb/modules/dummy_module/system # pwd
    /data/adb/modules/dummy_module/system
    
    [email protected]_I006D:/data/adb/modules/dummy_module/system # find .
    .
    ./bin
    ./bin/my_new_binary
    ./etc
    ./etc/my_new_file_for_systme
    [email protected]_I006D:/data/adb/modules/dummy_module/system #


    After rebooting the phone the files are visible in /system:

    Code:
    [email protected]_I006D:/ # ls -l /system/etc/my_new_file_for_systme
    -rw-rw-rw- 1 root root 20 2022-07-20 16:55 /system/etc/my_new_file_for_systme
    
    [email protected]_I006D:/ # cat /system/etc/my_new_file_for_systme
    This is my new file
    [email protected]_I006D:/ #
    
    [email protected]_I006D:/ # ls -l /system/bin/my_new_binary
    -rwxr-xr-x 1 root root 41 2022-07-20 16:57 /system/bin/my_new_binary
    
    [email protected]_I006D:/ # my_new_binary                                                                                                
    Hello world from my dummy binary
    [email protected]_I006D:/ #

    The permissions for the new files in /system are equal to the permissions of the original files in
    /data/adb/modules/dummy_module so if the original files are writable you can also edit the new files in /system, e.g

    Code:
    [email protected]_I006D:/ # cat /system/etc/my_new_file_for_systme
    This is my new file
    [email protected]_I006D:/ #
    
    [email protected]_I006D:/ # echo "Test Test" >> /system/etc/my_new_file_for_systme                                                       
    [email protected]_I006D:/ # cat /system/etc/my_new_file_for_systme
    This is my new file
    Test Test
    [email protected]_I006D:/ #

    These changes are persistent (because they change the original file in /data/adb/modules/<modulename>). You can also edit the files in /data/adb/modules/<modulename> but be aware that you can not use tools that create temporary files for changing the files like for example sed: Changes done with these kind of tools are only visible after a reboot of the phone.

    To change the file via script I recommend to create a new file and then replace the existing file with the new file using cp.

    This Magisk feature can also be used to make files in sub directories in /system writable -- see How to make files in system writable for detailed instructions.

    Make sure that the new files for /system are readable for the user using them; e.g some files (like for example apk files) are used by the user system). IMHO it's recommended to add the read permission (chmod o+r) to all new files for /system.

    Notes:

    Magisk does not really change the files in /system - instead it uses "bind mounts" to replace the files with others. Therefor you can always restore the original files by deleting the files in /data/adb/modules/<module_name> and rebooting the phone. Another big advantage of this technique is that you do not have to take care about an update of the OS:
    changes done via Magisk will also work after an OS upgrade (assuming you reinstalled Magisk to the boot partition after installing the OS update)

    Please be careful when changing existing files in /system.

    To add the necessary infos for the Magisk App to list your dummy module properly just create the file module.prop for your Dummy Magisk Module, e.g.

    Code:
    [email protected]_I006D:/ # cat /data/adb/modules/dummy_module/module.prop
    id=dummy-module
    name=Dummy Module for testing a new module
    version=1.0
    versionCode=1000
    [email protected]
    description=Dummy Module ..
    [email protected]_I006D:/ #


    For some examples for this technique see

    How to change files in the directory /system with Magisk

    How to replace the Fake Store from OmniROM with MicroG with a patched Playstore

    How to change the home directory for the user root on an Android phone


    How to use this technique to disable an app that can not be uninstalled

    Apps that can not be uninstalled can be disabled by creating empty files for the app.

    Example:

    My Magisk Module for the patched Playstore must disable the FakeStore installed in the OmniROM with MicroG by default.

    That's done by creating an empty file in the Magisk Module for the apk file for the FakeStore, the result looks like this:

    Code:
    [email protected]_I006D:/ # ls -l /data/adb/modules/PlayStore_for_MicroG/system/priv-app/FakeStore/FakeStore.apk                         
    -rw-r--r-- 1 root root 1 2022-07-15 11:54 /data/adb/modules/PlayStore_for_MicroG/system/priv-app/FakeStore/FakeStore.apk
    [email protected]_I006D:/ #
    
    [email protected]_I006D:/ # ls -l /system/priv-app/FakeStore/FakeStore.apk                                                               
    -rw-r--r-- 1 root root 1 2022-07-15 11:54 /system/priv-app/FakeStore/FakeStore.apk
    [email protected]_I006D:/ #

    In case there are multiple files in the folder for the app you can also hide the entire folder:

    From the original documentation from https://topjohnwu.github.io/Magisk/guides.html:

    If you place a file named .replace in any of the folders, instead of merging its contents, that folder will directly replace the one in the real system. This can be very handy for swapping out an entire folder.


    How to access the files replaced by Magisk

    Use another bind mount to access the files replaced by Magisk, e.g:

    Code:
    [email protected]_I006D:/ # head /data/adb/modules/fmradio/system/etc/public.libraries.txt                           
    # See https://android.googlesource.com/platform/ndk/+/master/docs/PlatformApis.md
    #
    # 04.08.2022 /bs
    #  added the library libqcomfm_jni.so
    #
    libandroid.so
    libaaudio.so
    libamidi.so
    libbinder_ndk.so
    libc.so
    [email protected]_I006D:/ #
    [email protected]_I006D:/ #
    
    
    [email protected]_I006D:/ # head /system/etc/public.libraries.txt                                                                                                
    # See https://android.googlesource.com/platform/ndk/+/master/docs/PlatformApis.md
    #
    # 04.08.2022 /bs
    #  added the library libqcomfm_jni.so
    #
    libandroid.so
    libaaudio.so
    libamidi.so
    libbinder_ndk.so
    libc.so
    [email protected]_I006D:/ #
    
    
    # -> The file /system/etc/public.libraries.txt is replaced by a file from a Magisk Module
    
    # To access the original version of the file /system/etc/public.libraries.txt do
    
    [email protected]_I006D:/ #
    [email protected]_I006D:/ # mkdir -p /data/test
    [email protected]_I006D:/ #
    [email protected]_I006D:/ # mount -o bind /system /data/test
    
    #
    # -> /data/test is now bind mounted to /system
    #
    # -> /data/test/etc/public.libraries.txt is the original version of that file:
    #
    
    [email protected]_I006D:/ #
    [email protected]_I006D:/ # head /data/test/etc/public.libraries.txt                                                                                             
    # See https://android.googlesource.com/platform/ndk/+/master/docs/PlatformApis.md
    libandroid.so
    libaaudio.so
    libamidi.so
    libbinder_ndk.so
    libc.so
    libcamera2ndk.so
    libdl.so
    libEGL.so
    libGLESv1_CM.so
    [email protected]_I006D:/ #


    Replacing files in /vendor, /product, or /system_ext using a Dummy Magisk Module

    The dummy Magisk Module can also be used to replace files in the directories /vendor, /product, or /system_ext:

    from the Magisk documentation at https://topjohnwu.github.io/Magisk/guides.html:

    If you want to replace files in /vendor, /product, or /system_ext, please place them under system/vendor, system/product, and system/system_ext respectively. Magisk will transparently handle whether these partitions are in a separate partition or not.

    Note that this works only to replace existing files in these directories - you can not add new files to these directories using this method.

    Example:

    Code:
    [email protected]_I006D:/ # cd /data/adb/modules/dummy_module/system
    #
    # files in the Magisk Module
    #
    [email protected]_I006D:/data/adb/modules/dummy_module/system # find . -type f
    ./bin/my_new_binary
    ./etc/my_new_file_for_systme
    ./product/mynewfile
    ./product/media/audio/alarms/Krypton.ogg
    ./vendor/mynewfile
    ./vendor/etc/sap.conf
    ./system_ext/mynewfile
    ./system_ext/etc/dpm/dpm.conf
    [email protected]_I006D:/data/adb/modules/dummy_module/system #
    #
    #  the new files for /product, /vendor, and /system_ext in the Magisk Module do not exist:
    #
    [email protected]_I006D:/data/adb/modules/dummy_module/system # ls -l /product/mynewfile /vendor/mynewfile /system_ext/mynewfile
    ls: /product/mynewfile: No such file or directory
    ls: /vendor/mynewfile: No such file or directory
    ls: /system_ext/mynewfile: No such file or directory
    
    #
    # The existing files in /product, /vendor, and /system_ext are replaced with the files from the Magisk Moduel
    #
    [email protected]_I006D:/data/adb/modules/dummy_module/system # cksum ./product/media/audio/alarms/Krypton.ogg  /product/media/audio/alarms/Krypton.ogg
    4294967295 0 ./product/media/audio/alarms/Krypton.ogg
    4294967295 0 /product/media/audio/alarms/Krypton.ogg
    [email protected]_I006D:/data/adb/modules/dummy_module/system #
    
    [email protected]_I006D:/data/adb/modules/dummy_module/system # cksum ./vendor/etc/sap.conf /vendor/etc/sap.conf
    1967598015 7121 ./vendor/etc/sap.conf
    1967598015 7121 /vendor/etc/sap.conf
    [email protected]_I006D:/data/adb/modules/dummy_module/system #
    
    [email protected]_I006D:/data/adb/modules/dummy_module/system # cksum  ./system_ext/etc/dpm/dpm.conf /system_ext/etc/dpm/dpm.conf
    1970692378 2925 ./system_ext/etc/dpm/dpm.conf
    1970692378 2925 /system_ext/etc/dpm/dpm.conf
    [email protected]_I006D:/data/adb/modules/dummy_module/system #
    
    [email protected]_I006D:/data/adb/modules/dummy_module/system # grep mynewfile /cache/magisk.log                       
    01-01 00:11:51.764   767   769 W : Unable to add: /product/mynewfile, skipped
    01-01 00:11:51.771   767   769 W : Unable to add: /system_ext/mynewfile, skipped
    01-01 00:11:51.771   767   769 W : Unable to add: /vendor/mynewfile, skipped
    [email protected]_I006D:/data/adb/modules/dummy_module/system #

    A work around to create new files in sub directories in /product, /vendor, or /system_ext:

    Copy the complete existing folder to the sub directory in

    /data/adb/modules/<magisk_module>/system/[product|vendor|system_ext]/

    and create the file .replace in that directory and add the new file(s) to that directory.

    Example:

    Code:
    [email protected]_I006D:/ # find /data/adb/modules/testmodule/      
    /data/adb/modules/testmodule/
    /data/adb/modules/testmodule/system
    /data/adb/modules/testmodule/system/product
    /data/adb/modules/testmodule/system/product/lib
    /data/adb/modules/testmodule/system/product/lib/.replace
    /data/adb/modules/testmodule/system/product/lib/libframesequence.so
    /data/adb/modules/testmodule/system/product/lib/libgiftranscode.so
    /data/adb/modules/testmodule/system/product/lib/newfile001
    /data/adb/modules/testmodule/system/vendor
    /data/adb/modules/testmodule/system/vendor/app
    /data/adb/modules/testmodule/system/vendor/app/TimeService
    /data/adb/modules/testmodule/system/vendor/app/TimeService/TimeService.apk
    /data/adb/modules/testmodule/system/vendor/app/TimeService/oat
    /data/adb/modules/testmodule/system/vendor/app/TimeService/oat/arm64
    /data/adb/modules/testmodule/system/vendor/app/TimeService/oat/arm64/TimeService.vdex
    /data/adb/modules/testmodule/system/vendor/app/TimeService/oat/arm64/TimeService.odex
    /data/adb/modules/testmodule/system/vendor/app/TimeService/newfile002
    /data/adb/modules/testmodule/system/vendor/app/TimeService/.replace
    /data/adb/modules/testmodule/system/system_ext
    /data/adb/modules/testmodule/system/system_ext/app
    /data/adb/modules/testmodule/system/system_ext/app/FM2
    /data/adb/modules/testmodule/system/system_ext/app/FM2/.replace
    /data/adb/modules/testmodule/system/system_ext/app/FM2/FM2.apk
    /data/adb/modules/testmodule/system/system_ext/app/FM2/lib
    /data/adb/modules/testmodule/system/system_ext/app/FM2/lib/arm64
    /data/adb/modules/testmodule/system/system_ext/app/FM2/lib/arm64/libqcomfm_jni.so
    /data/adb/modules/testmodule/system/system_ext/app/FM2/oat
    /data/adb/modules/testmodule/system/system_ext/app/FM2/oat/arm64
    /data/adb/modules/testmodule/system/system_ext/app/FM2/oat/arm64/FM2.odex
    /data/adb/modules/testmodule/system/system_ext/app/FM2/oat/arm64/FM2.vdex
    /data/adb/modules/testmodule/system/system_ext/app/FM2/newfile003
    [email protected]_I006D:/ #
    
    [email protected]_I006D:/ #   find /data/adb/modules/testmodule/system | grep newfile
    /data/adb/modules/testmodule/system/product/lib/newfile001
    /data/adb/modules/testmodule/system/vendor/app/TimeService/newfile002
    /data/adb/modules/testmodule/system/system_ext/app/FM2/newfile003
    [email protected]_I006D:/ #
    
    [email protected]_I006D:/ # pwd
    /
    [email protected]_I006D:/ # ls -l $( find /data/adb/modules/testmodule/system | grep newfile | cut -f6- -d "/" )
    -rw-r--r-- 1 root root 0 2022-08-07 14:34 system/product/lib/newfile001
    -rw-r--r-- 1 root root 0 2022-08-07 14:24 system/system_ext/app/FM2/newfile003
    -rw-r--r-- 1 root root 0 2022-08-07 14:36 system/vendor/app/TimeService/newfile002
    [email protected]_I006D:/ #


    See How to change any file or directory using Magisk for another approach to change files on read-only mounted filesystems.


    Executing scripts while booting the phone

    Magisk also supports executing additional scripts while booting the phone.

    The scripts to be executed must be copied to one of these directories

    /data/adb/post-fs-data.d/

    /data/adb/service.d/


    see the description in the original Magisk documentation: https://topjohnwu.github.io/Magisk/details.html

    Working examples for this technique are described in these posts:

    How to run a script atevery boot using Magisk

    How to disable or change the swap device in the Android 12 from ASUS for the Zenfone 8

    How to create or change a swap device in the OmniROM 12 using Magisk


    Another example for using this technique I found here

    https://gist.github.com/niikoo/3f6bd13a69f2d68f3dd51cc667e79bdc :

    Bash:
    # Boot logging
    # Create the file: /data/adb/post-fs-data.d/0001logcatboot
    
    #!/system/bin/sh
    mkdir -p /cache/logs
    /system/bin/logcat -r 1024 -n 9 -v threadTime -f /cache/logs/log >info.log 2>err.log &

    Note that I added commands to create / cleanup the log directory and changed the logcat command on my phone:

    Bash:
    #!/system/bin/sh
     mkdir -p /cache/logs
    rm -rf /cache/logs/*
    /system/bin/logcat -r 102400 -n 9 -v threadTime -f /cache/logs/log >/cache/logs/info.log 2>/cache/logs/err.log &

    To execute additional scripts earlier in the boot process you must add them to the boot image -- see the section Using Magisk to unpack and repack the boot image below for details.


    Creating Magisk Modules

    The official documentation for creating a Magisk Module is here: https://topjohnwu.github.io/Magisk/guides.html

    Creating Magisk Modules that only use the standard features isn't that difficult and the official documentation should be sufficient.

    I suggest to download an existing simple Magisk Module; unzip the ZIP file and study the contents.


    Using Magisk to unpack and repack the boot image

    The binary magiskboot that is part of the Magisk package can be used to unpack and repack the boot partition for every phone supported by Magisk.

    For details see here: How to change files in the boot image using Magisk

    Magisk also supports changing files in the root directory via Root Directory Overlays (see https://github.com/topjohnwu/Magisk/blob/master/docs/guides.md) :

    This feature can be used to create additional start or stop services for the Android OS:

    Android uses init *rc files to define the services to start when booting and also to define the services to run when doing the shutdown (like the systemd or initd in other Linux implementations).
    These files are read early in the boot process and therefore reside only in the ramdisk on the boot partition. To add new init* rc files the boot image must be modified. This can be done with Magisk:

    Just add the new init*rc files and optimal other scripts or files to the boot image using Magisk . Magisk will then take care of processing the new init*rc files by the Android operating system when booting the phone.
    See these posts:

    How to run a script at shutdown

    How to trigger an action when a property is changed

    How to enable root access using Magisk in a script

    for examples for using that feature.


    There are also magiskboot binaries for x86 in the Magisk apk file that can be used on a PC running the Linux OS:
    see How to process Android boot image files on a PC running the Linux OS for more details about this feature.


    Using Magisk to change the active slot

    The Magisk App can also be used to change the active slot on phones with A/B slots -- for details see here :

    How to manually switch the active slot



    Directories and files used by Magisk

    The directories and files used by Magisk are documented here https://topjohnwu.github.io/Magisk/guides.html

    Some important directories and files for developing and trouble shooting Magisk Modules are:

    The logfile used by Magisk is

    /cache/magisk.log

    In case something goes wrong with a Magisk Module you should first check that file.

    The base directory for the data files for Magisk is

    /data/adb

    The config setttings for Magisk are stored in the SQLite database

    /data/adb/magisk.db

    To view (or probably) change the database entries via script you can either use sqlite3 binary (if installed)

    Code:
    ASUS_I006D:/ # sqlite3 /data/adb/magisk.db
    SQLite version 3.7.6.3-Titanium
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    
    sqlite> .headers on
    sqlite> .mode column
    sqlite>
    sqlite> .tables
    denylist  policies  settings  strings
    sqlite>
     sqlite> .schema
    CREATE TABLE denylist (package_name TEXT, process TEXT, PRIMARY KEY(package_name, process));
    CREATE TABLE policies (uid INT, policy INT, until INT, logging INT, notification INT, PRIMARY KEY(uid));
    CREATE TABLE settings (key TEXT, value INT, PRIMARY KEY(key));
    CREATE TABLE strings (key TEXT, value TEXT, PRIMARY KEY(key));
    sqlite>
       sqlite> select * from denylist ;
    sqlite>
    sqlite> select * from policies ;
    uid         policy      until       logging     notification
    ----------  ----------  ----------  ----------  ------------
    2000        2           0           1           1
    10134       1           0           1           1
    sqlite>
    sqlite> select * from settings ;
    key         value
    ----------  ----------
    denylist    0
    su_biometr  0
    sqlite>
    sqlite> select * from strings ;
    sqlite>

    or the magisk binary, e.g:

    Code:
    ASUS_I006D:/ # magisk --sqlite  'select * from policies'                                                                         
    logging=1|notification=1|policy=2|uid=2000|until=0
    ASUS_I006D:/ #
    
    ASUS_I006D:/ # magisk --sqlite  'select * from settings'                                                                         
    key=denylist|value=0
    key=su_biometric|value=0
    ASUS_I006D:/ #

    There is a handy little script to list all apps with root access in the XDA thread https://forum.xda-developers.com/t/magisk-general-support-discussion.3432382/page-2681 .


    Magisk root access configuration details

    Magisk uses the table policies in the sqlite database /data/adb/magisk.db to store the list of root enabled apps.

    See this post https://forum.xda-developers.com/t/how-to-enable-root-access-using-magisk-in-a-script.4527035/ for details about this feature and how to enable root access via Magisk using a script.



    Magisk App installation directory

    Use
    Bash:
    pm list packages -f | grep magisk
    to get the Magisk App installation directory.

    Credits: https://forum.xda-developers.com/t/magisk-general-support-discussion.3432382/page-2689#post-87694851



    The Magisk App Configuration files

    The Magisk App stores the configuration (e.g. the app settings) in the default directory for App Settings, on my phone this is

    /data/user_de/0/com.topjohnwu.magisk/shared_prefs

    The file in that directory used to store the settings is

    com.topjohnwu.magisk_preferences.xml

    For more details about the file see the post Where does the Magisk App store the settings?.


    Temporary Magisk config directory

    While running Magisk uses a temporary directory for the configuration.

    The path to the config directory can be retrieved via magisk binary:

    Code:
    ASUS_I006D:/dev/hP3B # magisk --path
    /dev/hP3B
    ASUS_I006D:/dev/hP3B#

    The contents of that directory look like :

    Code:
    ASUS_I006D:/dev/hP3B # ls -al /dev/hP3B/
    total 568
    drwx------  3 root root    200 1970-01-01 04:08 .
    drwxr-xr-x 27 root root   5480 2022-11-06 18:32 ..
    drwxr-xr-x  8 root root    180 1970-01-01 04:08 .magisk
    lrwxrwxrwx  1 root root     10 1970-01-01 04:08 magisk -> ./magisk64
    -rwxr-xr-x  1 root root      0 1970-01-01 04:08 magisk32
    -rwxr-xr-x  1 root root 247168 1970-01-01 04:08 magisk64
    -rwxr-xr-x  1 root root 328240 1970-01-01 04:08 magiskpolicy
    lrwxrwxrwx  1 root root      8 1970-01-01 04:08 resetprop -> ./magisk
    lrwxrwxrwx  1 root root      8 1970-01-01 04:08 su -> ./magisk
    lrwxrwxrwx  1 root root     14 1970-01-01 04:08 supolicy -> ./magiskpolicy
    
    ASUS_I006D:/dev/hP3B # ls -al /dev/hP3B/.magisk/
    total 7
    drwxr-xr-x 8 root root  180 1970-01-01 04:08 .
    drwx------ 3 root root  200 1970-01-01 04:08 ..
    d--------- 2 root root  160 1970-01-01 04:08 block
    drwxr-xr-x 2 root root 7240 1970-01-01 04:08 busybox
    ---------- 1 root root  127 1970-01-01 04:08 config
    d--------- 7 root root  220 1970-01-01 04:08 mirror
    drwxr-xr-x 3 root root 3452 2022-11-06 18:32 modules
    drwxr-xr-x 2 root root    0 1970-01-01 04:08 pts
    d--------- 2 root root   80 1970-01-01 04:08 selinux
    
    ASUS_I006D:/dev/hP3B # cat /dev/hP3B/.magisk/config
    KEEPVERITY=false
    KEEPFORCEENCRYPT=false
    PATCHVBMETAFLAG=false
    RECOVERYMODE=false
    SHA1=1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
    ASUS_I006D:/dev/hP3B #


    Backup of the boot partitions

    Magisk creates backups of the boot partitions in sub directories in /data/adb with filenames starting with magisk_backup_, e.g.:

    Code:
    [email protected]_I006D:/data/adb # ls -l /data/magisk_backup_*
    /data/magisk_backup_79f3370cd83d03441325998a8875888780c3182f:
    total 31712
    -rwxr-xr-x 1 root root 32436260 2022-09-26 12:20 boot.img.gz
    
    /data/magisk_backup_a0c712541fd002c331c25772a3b8609ae2fba546:
    total 31712
    -rwxr-xr-x 1 root root 32436965 2022-09-27 19:30 boot.img.gz
    [email protected]_I006D:/data/adb #

    The uniq string after the second underscore in the name of the directory with the backup is the SHA-1 from the boot image that was patched to install Magisk:

    Code:
    [[email protected] /data/develop/android/scripts_on_linux]$ ./install_magisk_via_twrp.sh
    install_magisk_via_twrp.sh version - v2.0.0.1 - add Magisk to the boot partition of a phone running Android using TWRP
    ....
    Creating the boot image file "/sdcard/Download/boot_b.1086412.img" from the partition "/dev/block/by-name/boot_b" ...
    196608+0 records in
    196608+0 records out
    100663296 bytes (96 M) copied, 0.313082 s, 307 M/s
    
    Checking the result ...
    -rw-rw---- 1 root media_rw 100663296 2022-11-06 16:01 /sdcard/Download/boot_b.1086412.img
    ...
    OK, patching the boot partition "/dev/block/by-name/boot_b" was successfull
    ....
    [[email protected] /data/develop/android/scripts_on_linux]$

    The image file patched by Magisk in this example is /sdcard/Download/boot_b.1086412.img.

    The backup of the boot partition on the phone created by Magisk for this installation is:
    Code:
    ASUS_I006D:/ # ls -ld /data/magisk_backup*                                  
    drwxr-xr-x 2 root root 3452 2022-11-06 17:14 /data/magisk_backup_1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
    ASUS_I006D:/ #
    
    ASUS_I006D:/ # ls -l /data/magisk_backup_1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
    total 50692
    -rw-r--r-- 1 root root 51852324 2022-11-06 17:14 boot.img.gz
    ASUS_I006D:/ #

    1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb is the SHA-1 from the image file used for the installation of Magisk:

    Code:
    ASUS_I006D:/ # sha1sum /sdcard/Download/boot_b.1086412.img
    1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb  /sdcard/Download/boot_b.1086412.img
    ASUS_I006D:/ #

    or

    Code:
    ASUS_I006D:/data/adb/workdir/unpack/ramdisk # /data/adb/magisk/magiskboot  sha1 /sdcard/Download/boot_b.1086412.img
    1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
    ASUS_I006D:/data/adb/workdir/unpack/ramdisk #

    The SHA1 from the previous boot image is stored in the file /dev/hP3B/.magisk/config used by Magisk while running, e.g.:

    Code:
    ASUS_I006D:/data/adb/workdir/unpack/ramdisk # cat /dev/hP3B/.magisk/config
    KEEPVERITY=false
    KEEPFORCEENCRYPT=false
    PATCHVBMETAFLAG=false
    RECOVERYMODE=false
    SHA1=1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
    ASUS_I006D:/data/adb/workdir/unpack/ramdisk #

    /dev/hP3B is a directory on the temporary ramdisk used by Magisk while it is running.

    Use the command magisk --path to retrieve the path for the current ramdisk while Magisk is running, e.g.:

    Code:
    ASUS_I006D:/data/adb/workdir/unpack/ramdisk # magisk --path
    /dev/hP3B
    ASUS_I006D:/data/adb/workdir/unpack/ramdisk #

    The SHA1 from the previous boot image is also stored in the file .backup/.magisk in the ramdisk of a boot image, e.g:

    Code:
    # Note: unpack the boot image and the ramdisk from the boot image to get that file
    #
    ASUS_I006D:/data/adb/workdir/unpack/ramdisk # cat .backup/.magisk
    KEEPVERITY=false
    KEEPFORCEENCRYPT=false
    PATCHVBMETAFLAG=false
    RECOVERYMODE=false
    SHA1=1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
     ASUS_I006D:/data/adb/workdir/unpack/ramdisk #

    To do it all in once use:

    Bash:
    grep "^SHA1=" $( magisk --path )/.magisk/config | cut -f2 -d "="
    e.g.:

    Code:
    ASUS_I006D:/data/adb/workdir/unpack/ramdisk # grep "^SHA1=" $( magisk --path )/.magisk/config | cut -f2 -d "="
    1a05ccb9844d3ad4f6d1873dfbf76ebf83a5bdeb
    ASUS_I006D:/data/adb/workdir/unpack/ramdisk # #


    Backup the Magisk config

    To backup the Magisk config just copy the directories in /data/adb except the directory /data/adb/magisk (that directory is used for the binaries only)

    Code:
    adb shell tar --exclude data/adb/magisk/ -czf /sdcard/Download/magisk_config_$( date +%Y-%m-%d).$$.tar /data/adb/

    To restore the backup unpack the tar file on the phone and reboot the phone.

    To also create a backup the settings from the Magisk App create a backup of the directory with the Magisk App Settings (see above for details).



    Start/Stop the Magisk App

    To start the Magisk App via CLI command use

    Bash:
    am start -n com.topjohnwu.magisk/.ui.MainActivity


    To stop the Magisk App via CLI command use:

    Bash:
    am force-stop  com.topjohnwu.magisk


    Start/Stop the Magisk Daemon

    To stop the Magisk Daemon use

    Bash:
    magisk --stop

    Be aware that stopping the magisk daemon will remove all bind mounts for files in /system. To re-enable these bind mounts a reboot is required.

    To start the Magisk Daemon use

    Bash:
    /data/adb/magisk/magisk64 --daemon

    To check if the Magisk Daemon is running use

    Bash:
    /data/adb/magisk/magisk64 -v

    Example output:

    Code:
    # Magisk Daemon is running
    
    ASUS_I006D:/ # /data/adb/magisk/magisk64 -v
    25.2:MAGISK:R
    ASUS_I006D:/ #
    
    # Magisk Daemon is not running
    
    |ASUS_I006D:/ # /data/adb/magisk/magisk64 -v
    No daemon is currently running!
    1|ASUS_I006D:/ #


    Building Magisk

    The Magisk source code is available at

    https://github.com/topjohnwu/Magisk

    There are also instructions how to create a local copy of the repository and compile Magisk on that page. I've successfully build Magisk using these instructions.


    Miscellaneous

    magiskboot
    can also be used compress or decompress files:

    Code:
    1|ASUS_I006D:/data/adb/magisk # ./magiskboot      
    MagiskBoot - Boot Image Modification Tool
    
    Usage: ./magiskboot <action> [args...]
    
    Supported actions:
    ...
    
     compress[=format] <infile> [outfile]
       Compress <infile> with [format] to [outfile].
       <infile>/[outfile] can be '-' to be STDIN/STDOUT.
       If [format] is not specified, then gzip will be used.
       If [outfile] is not specified, then <infile> will be replaced
       with another file suffixed with a matching file extension.
       Supported formats: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg
    
     decompress <infile> [outfile]
       Detect format and decompress <infile> to [outfile].
       <infile>/[outfile] can be '-' to be STDIN/STDOUT.
       If [outfile] is not specified, then <infile> will be replaced
       with another file removing its archive format file extension.
       Supported formats: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg
    
    1|ASUS_I006D:/data/adb/magisk #

    magiskboot is also used in TWRP to unpack and repack the boot image for installing Magisk


    Using the magisk binary while the phone is booted into TWRP

    If the used TWRP can mount the volume for /data you can also use the binary magisk while in TWRP. The magisk binary is not in the path while booted into TWRP - therefor you must use the fully qualified filename:

    This is

    /data/adb/magisk/magisk64

    for 64 Bit CPUs and

    /data/adb/magisk/magisk32

    for 32 Bit CPUs.

    Some functions of Magisk are only usable if the Magisk daemon is running. To start the Magisk daemon the Magisk binary can also be used - example:

    Code:
    # read the policies table from the Magisk squlite database
    #
    ASUS_I006D:/ # /data/adb/magisk/magisk64 --sqlite "select * from policies ;"                                                                         
    No daemon is currently running!
    
    #
    # -> the Magisk daemon is not running -> start it
    #
    1|ASUS_I006D:/ # /data/adb/magisk/magisk64 --daemon
    ASUS_I006D:/ #
    
    ASUS_I006D:/ # /data/adb/magisk/magisk64 --sqlite "select * from policies ;"                                                                           
    logging=1|notification=1|policy=2|uid=2000|until=0
    logging=1|notification=1|policy=2|uid=10135|until=0
    logging=1|notification=1|policy=2|uid=10143|until=0
    logging=1|notification=1|policy=2|uid=10055|until=0
    logging=1|notification=1|policy=2|uid=10142|until=0
    ASUS_I006D:/ #

    Use

    Bash:
    /data/adb/magisk/magisk64 -V

    to check if the Magisk daemon is running

    Use

    Bash:
    /data/adb/magisk/magisk64 --stop

    to stop the Magisk Daemon, e.g.:

    Code:
    ASUS_I006D:/ # /data/adb/magisk/magisk64 -V
    25200
    
    # -> The Magisk Daemon is running
    
    ASUS_I006D:/ # /data/adb/magisk/magisk64 --stop                                                                                                          
    ASUS_I006D:/ #
    
    ASUS_I006D:/ # /data/adb/magisk/magisk64 -V                                                                                                              
    No daemon is currently running!
    1|ASUS_I006D:/ # 2D


    Trouble Shooting

    If something went wrong and booting the phone does not work anymore after installing a Magisk Module just remove the files in /data/adb/modules/<modulename> and reboot the phone :

    Either connect via adb to the not booting phone (this should be possible in most cases even if the boot process does not finish), delete the files, and reboot the phone. Or reboot the phone from a Recovery image like TWRP, delete the files in /data/adb/modules/<modulename>, and reboot the phone.

    The same procedure can be used if booting the phone does not work anymore after adding another init script - just delete the new script in /data/adb/post-fs-data.d or /data/adb/service.d and reboot the phone

    An error like this

    Code:
    08-06 18:41:39.341 +0000  1356  1726 W ziparchive: Unable to open '/system/app/AsusFMRadio/AsusFMRadio.apk': Permission denied
    08-06 18:41:39.341 +0000  1356  1726 E system_server: Failed to open APK '/system/app/AsusFMRadio/AsusFMRadio.apk': I/O error
    08-06 18:41:39.354 +0000  1356  1356 W PackageManager: Failed to parse /system/app/AsusFMRadio: Failed to parse /system/app/AsusFMRadio/AsusFMRadio.apk

    is most of the time caused by missing read permissions for the file.

    Use

    Bash:
    chmod o+r /system/app/AsusFMRadio/AsusFMRadio.apk

    to fix it.


    To catch errors from a script executed by Magisk you might use this technique:

    Bash:
    # redirect STDERR of all commands in the script to a file
    #
    exec 2>/data/script_stderr.log
    set -x
    
    ... rest of your script

    To remove all installed Magisk Modules using the official method use:

    Code:
    magisk --remove-modules

    to remove all modules (but not the new init scripts!) and reboot the phone

    According to the FAQ Magisk will not start if the phone is booted into safe mode (see
    https://topjohnwu.github.io/Magisk/faq.html)

    Be aware that after rebooting the phone again in normal mode all Magisk Modules are disabled and must be enabled again using either the Magisk App or a CLI command:

    To reenable all Magisk Modules via shell command do
    Bash:
    adb shell rm /data/adb/modules/*/disable


    HIstory

    07.08.2022 /bs

    Added additional infos about the permissions for new files for /system.
    Added additional commands to the script for catching the OS logs while booting the phone
    Added infos about a workaround to add new files to /product, /vendor, or /system_ext
    Added infos about how to access file replaced by a Magisk Module

    20.09.2022 /bs
    Added new links to posts about configuring swap devices via Magisk script
    Added a link to the post about how to use Magisk to unpack and repack the boot image

    28.09.2022 /bs
    Added infos about the backups of the boot partitions created by Magisk

    30.09.2022 /bs
    Added a short info about using Magisk Overlays to change files in the root filesystem
    Added the URL for the post with how to change the active slot using the Magisk App

    02.10.2022 /bs
    Added a short info about Root Directory Overlay system from Magisk

    04.10.2022 /bs
    Add an URL to another post to use the Root Directory Overlay system from Magsik
    Fixed some spelling errors and also some errors in the code examples
    Added more details about changing files in /system

    26.10.2022/bs
    Added the section Miscellaneous

    28.10.2022/bs

    Added the section Start/Stop the Magisk App
    Added the section Start/Stop the Magisk Daemon

    02.11.2022 /bs


    added the infos about the x86 version of the magiskboot executables in the Magisk apk file
    fixed some spelling and formatting errors

    04.11.2022/bs

    add the link to the Howto about making a file in /system writable
    corrected some formatting errors

    06.11.2022/bs

    added more details about the boot partition backups created by Magisk
    added missing "su - -c" to some adb shell commands

    07.11.2022/bs

    added more details about the boot partition backups created by Magisk
    added the section about the temporary Magisk config directory

    08.11.2022/bs

    added the section about how to get the Magisk App installation directory

    25.11.2022/bs

    added infos about how to build Magisk using a local copy of the repository

    02.12.2022 /bs

    added the infos about sing the magisk binary while the phone is booted into TWRP

    06.12.2022 /bs

    added the section Magisk root access configuration details
    added infos about the files used to store the settings for the Magisk App

    30.12.2022 /bs

    added more infos about how to add new start / stop services in Android
    1
    Most probably yes ... I will check that