Magisk/scripts/emulator.sh
2019-10-11 01:45:06 -04:00

120 lines
3.3 KiB
Bash
Executable File

#!/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