diff --git a/scripts/emulator.sh b/scripts/emulator.sh index 1b2fd63bb..077da4daa 100755 --- a/scripts/emulator.sh +++ b/scripts/emulator.sh @@ -7,15 +7,11 @@ # 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 in the -# emulator. The constructed Magisk environment is not a fully -# functional one as if it is running on an actual device. -# The script only supports non system-as-root images, meaning -# AVD images that are newer than API 25 are NOT supported. -# This script is meant to be used for emulators running obscure -# Android versions; use an actual device for modern Androids. +# 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 emulator images. +# The script assumes you are using x86/x64 emulator images. # Build binaries with `./build.py binary` before running this script. # ################################################################ @@ -25,10 +21,21 @@ abort() { 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 native/out/x86/magisk scripts/emulator.sh /data/local/tmp + 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 @@ -36,15 +43,14 @@ fi cd /data/local/tmp chmod 777 busybox - -# Currently only support rootfs based emulators -./busybox mount | ./busybox grep -q rootfs || abort 'Only support non system-as-root emulators' +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 @@ -53,27 +59,61 @@ rm -rf bin OLD_PATH="$PATH" PATH="/data/local/tmp/bin:$PATH" -# Setup sbin mirror -mount -o rw,remount / -rm -rf /root -mkdir /root -chmod 750 /root -ln /sbin/* /root -mount -o ro,remount / +# 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 -mount -t tmpfs tmpfs /sbin -chmod 755 /sbin -ln -s /root/* /sbin -cp ./magisk /sbin/magisk +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 < /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 - -# Magisk stuffs 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 -magisk --daemon +/sbin/magisk --daemon