Magisk/scripts/avd_magisk.sh

170 lines
4.4 KiB
Bash
Raw Normal View History

#####################################################################
2019-09-03 17:06:14 -04:00
# AVD Magisk Setup
#####################################################################
2019-09-03 17:06:14 -04:00
#
2023-03-17 20:08:31 +08:00
# Support API level: 23 - 33
2019-09-03 17:06:14 -04:00
#
2022-01-19 05:12:11 -08:00
# With an emulator booted and accessible via ADB, usage:
# ./build.py emulator
#
2021-08-26 03:09:56 -07:00
# This script will stop zygote, simulate the Magisk start up process
# that would've happened before zygote was started, and finally
# restart zygote. This is useful for setting up the emulator for
# developing Magisk, testing modules, and developing root apps using
# the official Android emulator (AVD) instead of a real device.
2019-09-03 17:06:14 -04:00
#
2022-01-19 05:12:11 -08:00
# This only covers the "core" features of Magisk. For testing
2022-01-19 20:28:01 -08:00
# magiskinit, please checkout avd_patch.sh.
2021-08-26 03:09:56 -07:00
#
#####################################################################
2019-09-03 17:06:14 -04:00
mount_sbin() {
2023-02-28 14:54:33 +08:00
mount -t tmpfs -o 'mode=0755' magisk /sbin
2021-08-18 03:44:32 -07:00
chcon u:object_r:rootfs:s0 /sbin
}
2019-09-03 17:06:14 -04:00
if [ ! -f /system/build.prop ]; then
# Running on PC
echo 'Please run `./build.py emulator` instead of directly executing the script!'
exit 1
2019-09-03 17:06:14 -04:00
fi
cd /data/local/tmp
2021-08-26 03:09:56 -07:00
chmod 755 busybox
2019-09-03 17:06:14 -04:00
2020-07-27 03:32:54 -07:00
if [ -z "$FIRST_STAGE" ]; then
export FIRST_STAGE=1
export ASH_STANDALONE=1
if [ $(./busybox id -u) -ne 0 ]; then
2020-07-27 03:32:54 -07:00
# Re-exec script with root
exec /system/xbin/su 0 ./busybox sh $0
else
# Re-exec script with busybox
exec ./busybox sh $0
fi
fi
2019-09-03 17:06:14 -04:00
pm install -r $(pwd)/magisk.apk
2021-08-26 03:09:56 -07:00
# Extract files from APK
2022-12-26 15:59:56 -08:00
unzip -oj magisk.apk 'assets/util_functions.sh' 'assets/stub.apk'
. ./util_functions.sh
api_level_arch_detect
unzip -oj magisk.apk "lib/$ABI/*" "lib/$ABI32/libmagisk32.so" -x "lib/$ABI/libbusybox.so"
2021-08-26 03:09:56 -07:00
for file in lib*.so; do
chmod 755 $file
mv "$file" "${file:3:${#file}-6}"
done
# Stop zygote (and previous setup if exists)
magisk --stop 2>/dev/null
stop
if [ -d /dev/avd-magisk ]; then
umount -l /dev/avd-magisk 2>/dev/null
rm -rf /dev/avd-magisk 2>/dev/null
2021-08-18 03:44:32 -07:00
fi
2023-04-04 02:04:49 -07:00
# Mount /cache if not already mounted
if ! grep -q ' /cache ' /proc/mounts; then
mount -t tmpfs -o 'mode=0755' tmpfs /cache
2021-08-26 03:09:56 -07:00
fi
2019-09-03 17:06:14 -04:00
2021-08-26 03:09:56 -07:00
MAGISKTMP=/sbin
2020-07-27 03:32:54 -07:00
# Setup bin overlay
if mount | grep -q rootfs; then
2020-07-27 03:32:54 -07:00
# Legacy rootfs
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
2020-07-27 03:32:54 -07:00
elif [ -e /sbin ]; then
# Legacy SAR
mount_sbin
2021-08-26 03:09:56 -07:00
mkdir -p /dev/sysroot
block=$(mount | grep ' / ' | awk '{ print $1 }')
[ $block = "/dev/root" ] && block=/dev/block/dm-0
mount -o ro $block /dev/sysroot
for file in /dev/sysroot/sbin/*; do
[ ! -e $file ] && break
if [ -L $file ]; then
cp -af $file /sbin
else
2021-04-09 21:29:42 -07:00
sfile=/sbin/$(basename $file)
touch $sfile
mount -o bind $file $sfile
fi
done
2021-08-26 03:09:56 -07:00
umount -l /dev/sysroot
rm -rf /dev/sysroot
2020-07-27 03:32:54 -07:00
else
2021-08-26 03:09:56 -07:00
# Android Q+ without sbin
MAGISKTMP=/dev/avd-magisk
mkdir /dev/avd-magisk
2023-05-09 17:33:20 -07:00
# If a file name 'magisk' is in current directory, mount will fail
rm magisk
2023-02-28 14:54:33 +08:00
mount -t tmpfs -o 'mode=0755' magisk /dev/avd-magisk
fi
# Magisk stuff
mkdir -p $MAGISKBIN 2>/dev/null
unzip -oj magisk.apk 'assets/*.sh' -d $MAGISKBIN
mkdir $NVBASE/modules 2>/dev/null
mkdir $NVBASE/post-fs-data.d 2>/dev/null
mkdir $NVBASE/service.d 2>/dev/null
2021-08-26 03:09:56 -07:00
2022-12-26 15:59:56 -08:00
for file in magisk32 magisk64 magiskpolicy stub.apk; do
2021-08-26 03:09:56 -07:00
chmod 755 ./$file
cp -af ./$file $MAGISKTMP/$file
cp -af ./$file $MAGISKBIN/$file
2021-08-26 03:09:56 -07:00
done
cp -af ./magiskboot $MAGISKBIN/magiskboot
2022-03-17 03:15:39 -07:00
cp -af ./magiskinit $MAGISKBIN/magiskinit
cp -af ./busybox $MAGISKBIN/busybox
2021-08-26 03:09:56 -07:00
if $IS64BIT; then
ln -s ./magisk64 $MAGISKTMP/magisk
else
ln -s ./magisk32 $MAGISKTMP/magisk
fi
2021-08-26 03:09:56 -07:00
ln -s ./magisk $MAGISKTMP/su
ln -s ./magisk $MAGISKTMP/resetprop
ln -s ./magisk $MAGISKTMP/magiskhide
2022-03-17 03:15:39 -07:00
ln -s ./magiskpolicy $MAGISKTMP/supolicy
2021-08-26 03:09:56 -07:00
mkdir -p $MAGISKTMP/.magisk/mirror
mkdir $MAGISKTMP/.magisk/block
2023-03-31 17:20:32 -07:00
mkdir $MAGISKTMP/.magisk/worker
2021-08-26 03:09:56 -07:00
touch $MAGISKTMP/.magisk/config
2023-03-31 17:20:32 -07:00
export MAGISKTMP
2023-04-04 02:04:49 -07:00
MAKEDEV=1 $MAGISKTMP/magisk --preinit-device 2>&1
RULESCMD=""
for r in $MAGISKTMP/.magisk/preinit/*/sepolicy.rule; do
[ -f "$r" ] || continue
RULESCMD="$RULESCMD --apply $r"
done
# SELinux stuffs
if [ -d /sys/fs/selinux ]; then
if [ -f /vendor/etc/selinux/precompiled_sepolicy ]; then
./magiskpolicy --load /vendor/etc/selinux/precompiled_sepolicy --live --magisk $RULESCMD 2>&1
elif [ -f /sepolicy ]; then
./magiskpolicy --load /sepolicy --live --magisk $RULESCMD 2>&1
else
./magiskpolicy --live --magisk $RULESCMD 2>&1
fi
fi
# Boot up
2021-08-26 03:09:56 -07:00
$MAGISKTMP/magisk --post-fs-data
start
$MAGISKTMP/magisk --service