#!/usr/bin/env bash ################################################################ # AVD Magisk Setup ################################################################ # # This script will setup an environment with minimal Magisk that # Magisk Manager will be happy to run properly within the official # emulator bundled with Android Studio (AVD). # # ONLY use this script for developing Magisk Manager or root apps # in the emulator. The constructed Magisk environment is not a # fully functional one as if it is running on an actual device. # # The script assumes you are using x86/x64 emulator images. # Build binaries with `./build.py binary` before running this script. # ################################################################ abort() { echo "$@" exit 1 } mount_sbin() { mount -t tmpfs -o 'mode=0755' tmpfs /sbin $SELINUX && chcon u:object_r:rootfs:s0 /sbin } if [ ! -f /system/build.prop ]; then # Running on PC cd "`dirname "$0"`/.." adb push native/out/x86/busybox scripts/emulator.sh /data/local/tmp emu_arch=`adb shell uname -m` if [ $emu_arch = "x86_64" ]; then adb push native/out/x86/magiskinit64 /data/local/tmp/magiskinit else adb push native/out/x86/magiskinit /data/local/tmp fi adb root || abort 'adb root failed' adb shell sh /data/local/tmp/emulator.sh exit 0 fi cd /data/local/tmp chmod 777 busybox chmod 777 magiskinit # Emulator's adb shell should have root [ `./busybox id -u` -eq 0 ] || abort 'ADB shell should have root access' # Check whether already setup [ -f /sbin/magisk ] && abort "Magisk is already setup" ./busybox pgrep magiskd && abort "Magisk is already setup" # First setup a good env to work with rm -rf bin ./busybox mkdir bin ./busybox --install -s bin OLD_PATH="$PATH" PATH="/data/local/tmp/bin:$PATH" # SELinux stuffs [ -e /sys/fs/selinux ] && SELINUX=true || SELINUX=false if $SELINUX; then ln -sf ./magiskinit magiskpolicy ./magiskpolicy --live --magisk 'allow magisk * * *' fi # Setup sbin overlay if mount | grep -q rootfs; then mount -o rw,remount / rm -rf /root mkdir /root chmod 750 /root ln /sbin/* /root mount -o ro,remount / mount_sbin ln -s /root/* /sbin else mount_sbin mkdir -p /sbin/.magisk/mirror/system_root block=`mount | grep ' / ' | awk '{ print $1 }'` [ $block = "/dev/root" ] && block=/dev/block/dm-0 mount -o ro $block /sbin/.magisk/mirror/system_root for file in /sbin/.magisk/mirror/system_root/sbin/*; do [ ! -e $file ] && break if [ -L $file ]; then cp -af $file /sbin else sfile=/sbin/`basename $file` touch $sfile mount -o bind $file $sfile fi done fi # Magisk stuffs if [ -e /apex ]; then ./magiskinit -x magisk /sbin/magisk.bin [ -e /system/lib64 ] && LIB=lib64 || LIB=lib cat <<EOF > /sbin/magisk #!/system/bin/sh export LD_LIBRARY_PATH="\$LD_LIBRARY_PATH:/apex/com.android.runtime/$LIB" exec /sbin/magisk.bin "\$0" "\$@" EOF else ./magiskinit -x magisk /sbin/magisk fi chmod 755 /sbin/magisk ln -s ./magisk /sbin/su ln -s ./magisk /sbin/resetprop ln -s ./magisk /sbin/magiskhide mkdir -p /sbin/.magisk/busybox cp -af ./busybox /sbin/.magisk/busybox/busybox /sbin/.magisk/busybox/busybox --install -s /sbin/.magisk/busybox mkdir -p /data/adb/modules 2>/dev/null mkdir /data/adb/post-fs-data.d 2>/dev/null mkdir /data/adb/services.d 2>/dev/null /sbin/magisk --daemon