diff options
Diffstat (limited to 'AnyKernel3')
| -rwxr-xr-x | AnyKernel3/META-INF/com/google/android/update-binary | 501 | ||||
| -rw-r--r-- | AnyKernel3/META-INF/com/google/android/updater-script | 6 | ||||
| -rwxr-xr-x | AnyKernel3/anykernel.sh | 48 | ||||
| -rwxr-xr-x | AnyKernel3/tools/ak3-core.sh | 825 | ||||
| -rwxr-xr-x | AnyKernel3/tools/busybox | bin | 0 -> 1399484 bytes | |||
| -rwxr-xr-x | AnyKernel3/tools/magiskboot | bin | 0 -> 315336 bytes | |||
| -rwxr-xr-x | AnyKernel3/tools/magiskpolicy | bin | 0 -> 336544 bytes |
7 files changed, 1380 insertions, 0 deletions
diff --git a/AnyKernel3/META-INF/com/google/android/update-binary b/AnyKernel3/META-INF/com/google/android/update-binary new file mode 100755 index 000000000000..a6c6e43c4484 --- /dev/null +++ b/AnyKernel3/META-INF/com/google/android/update-binary @@ -0,0 +1,501 @@ +#!/sbin/sh +# AnyKernel3 Backend (DO NOT CHANGE) +# osm0sis @ xda-developers + +OUTFD=/proc/self/fd/$2; +ZIPFILE="$3"; + +BOOTMODE=false; +ps | grep zygote | grep -v grep >/dev/null && BOOTMODE=true; +$BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -v grep >/dev/null && BOOTMODE=true; + +DIR=/sdcard; +$BOOTMODE || DIR=$(dirname "$ZIPFILE"); + +[ -d /postinstall/tmp ] && POSTINSTALL=/postinstall; +[ "$AKHOME" ] || AKHOME=$POSTINSTALL/tmp/anykernel; +[ "$ANDROID_ROOT" ] || ANDROID_ROOT=/system; + +ui_print() { + until [ ! "$1" ]; do + echo "ui_print $1 + ui_print" >> $OUTFD; + shift; + done; +} +ui_printfile() { + while IFS='' read -r line || $BB [[ -n "$line" ]]; do + ui_print "$line"; + done < $1; +} +show_progress() { echo "progress $1 $2" >> $OUTFD; } +file_getprop() { $BB grep "^$2=" "$1" | $BB tail -n1 | $BB cut -d= -f2-; } +find_slot() { + local slot=$(getprop ro.boot.slot_suffix 2>/dev/null); + [ "$slot" ] || slot=$($BB grep -o 'androidboot.slot_suffix=.*$' /proc/cmdline | $BB cut -d\ -f1 | $BB cut -d= -f2); + if [ ! "$slot" ]; then + slot=$(getprop ro.boot.slot 2>/dev/null); + [ "$slot" ] || slot=$($BB grep -o 'androidboot.slot=.*$' /proc/cmdline | $BB cut -d\ -f1 | $BB cut -d= -f2); + [ "$slot" ] && slot=_$slot; + fi; + [ "$slot" ] && echo "$slot"; +} +setup_mountpoint() { + [ -L $1 ] && $BB mv -f $1 ${1}_link; + if [ ! -d $1 ]; then + $BB rm -f $1; + $BB mkdir -p $1; + fi; +} +is_mounted() { $BB mount | $BB grep -q " $1 "; } +mount_apex() { + [ -d /system_root/system/apex ] || return 1; + local apex dest loop minorx num var; + setup_mountpoint /apex; + $BB mount -t tmpfs tmpfs /apex -o mode=755 && $BB touch /apex/apextmp; + minorx=1; + [ -e /dev/block/loop1 ] && minorx=$($BB ls -l /dev/block/loop1 | $BB awk '{ print $6 }'); + num=0; + for apex in /system_root/system/apex/*; do + dest=/apex/$($BB basename $apex | $BB sed -E -e 's;\.apex$|\.capex$;;' -e 's;\.current$|\.release$;;'); + $BB mkdir -p $dest; + case $apex in + *.apex|*.capex) + $BB unzip -qo $apex original_apex -d /apex; + [ -f /apex/original_apex ] && apex=/apex/original_apex; + $BB unzip -qo $apex apex_payload.img -d /apex; + $BB mv -f /apex/original_apex $dest.apex 2>/dev/null; + $BB mv -f /apex/apex_payload.img $dest.img; + $BB mount -t ext4 -o ro,noatime $dest.img $dest 2>/dev/null; + if [ $? != 0 ]; then + while [ $num -lt 64 ]; do + loop=/dev/block/loop$num; + [ -e $loop ] || $BB mknod $loop b 7 $((num * minorx)); + $BB losetup $loop $dest.img 2>/dev/null; + num=$((num + 1)); + $BB losetup $loop | $BB grep -q $dest.img && break; + done; + $BB mount -t ext4 -o ro,loop,noatime $loop $dest; + if [ $? != 0 ]; then + $BB losetup -d $loop 2>/dev/null; + fi; + fi; + ;; + *) $BB mount -o bind $apex $dest;; + esac; + done; + for var in $($BB grep -o 'export .* /.*' /system_root/init.environ.rc | $BB awk '{ print $2 }'); do + eval OLD_${var}=\$$var; + done; + $($BB grep -o 'export .* /.*' /system_root/init.environ.rc | $BB sed 's; /;=/;'); unset export; +} +umount_apex() { + [ -d /apex ] || return 1; + local dest loop var; + for var in $($BB grep -o 'export .* /.*' /system_root/init.environ.rc 2>/dev/null | $BB awk '{ print $2 }'); do + if [ "$(eval echo \$OLD_$var)" ]; then + eval $var=\$OLD_${var}; + else + eval unset $var; + fi; + unset OLD_${var}; + done; + for dest in $($BB find /apex -type d -mindepth 1 -maxdepth 1); do + loop=$($BB mount | $BB grep $dest | $BB grep loop | $BB cut -d\ -f1); + $BB umount -l $dest; + [ "$loop" ] && $BB losetup -d $loop; + done; + [ -f /apex/apextmp ] && $BB umount /apex; + $BB rm -rf /apex 2>/dev/null; +} +mount_all() { + local byname mount slot system; + if ! is_mounted /cache; then + $BB mount /cache 2>/dev/null && UMOUNT_CACHE=1; + fi; + if ! is_mounted /data; then + $BB mount /data && UMOUNT_DATA=1; + fi; + (for mount in /vendor /product /system_ext /persist; do + $BB mount -o ro -t auto $mount; + done) 2>/dev/null; + setup_mountpoint $ANDROID_ROOT; + if ! is_mounted $ANDROID_ROOT; then + $BB mount -o ro -t auto $ANDROID_ROOT 2>/dev/null; + fi; + byname=bootdevice/by-name; + [ -d /dev/block/$byname ] || byname=$($BB find /dev/block/platform -type d -name by-name 2>/dev/null | $BB head -n1 | $BB cut -d/ -f4-); + [ -d /dev/block/mapper ] && byname=mapper; + [ -e /dev/block/$byname/system ] || slot=$(find_slot); + case $ANDROID_ROOT in + /system_root) setup_mountpoint /system;; + /system) + if ! is_mounted /system && ! is_mounted /system_root; then + setup_mountpoint /system_root; + $BB mount -o ro -t auto /system_root; + elif [ -f /system/system/build.prop ]; then + setup_mountpoint /system_root; + $BB mount --move /system /system_root; + fi; + if [ $? != 0 ]; then + ($BB umount /system; + $BB umount -l /system) 2>/dev/null; + $BB mount -o ro -t auto /dev/block/$byname/system$slot /system_root; + fi; + ;; + esac; + [ -f /system_root/system/build.prop ] && system=/system; + for mount in /vendor /product /system_ext; do + if ! is_mounted $mount && [ -L /system$mount -o -L /system_root$system$mount ]; then + setup_mountpoint $mount; + $BB mount -o ro -t auto /dev/block/$byname$mount$slot $mount; + fi; + done; + if is_mounted /system_root; then + mount_apex; + $BB mount -o bind /system_root$system /system; + fi; + if ! is_mounted /persist && [ -e /dev/block/bootdevice/by-name/persist ]; then + setup_mountpoint /persist; + $BB mount -o ro -t auto /dev/block/bootdevice/by-name/persist /persist; + fi; +} +umount_all() { + local mount; + (if [ ! -d /postinstall/tmp ]; then + $BB umount /system; + $BB umount -l /system; + fi) 2>/dev/null; + umount_apex; + (if [ ! -d /postinstall/tmp ]; then + $BB umount /system_root; + $BB umount -l /system_root; + fi; + umount /vendor; # busybox umount /vendor breaks recovery on some hacky devices + umount -l /vendor; + for mount in /mnt/system /mnt/vendor /product /mnt/product /system_ext /mnt/system_ext /persist; do + $BB umount $mount; + $BB umount -l $mount; + done; + if [ "$UMOUNT_DATA" ]; then + $BB umount /data; + $BB umount -l /data; + fi; + if [ "$UMOUNT_CACHE" ]; then + $BB umount /cache; + $BB umount -l /cache; + fi) 2>/dev/null; +} +setup_env() { + $BOOTMODE && return 1; + $BB mount -o bind /dev/urandom /dev/random; + if [ -L /etc ]; then + setup_mountpoint /etc; + $BB cp -af /etc_link/* /etc; + $BB sed -i 's; / ; /system_root ;' /etc/fstab; + fi; + umount_all; + mount_all; + OLD_LD_PATH=$LD_LIBRARY_PATH; + OLD_LD_PRE=$LD_PRELOAD; + OLD_LD_CFG=$LD_CONFIG_FILE; + unset LD_LIBRARY_PATH LD_PRELOAD LD_CONFIG_FILE; + if [ ! "$(getprop 2>/dev/null)" ]; then + getprop() { + local propdir propfile propval; + for propdir in / /system_root /system /vendor /product /system_ext /odm; do + for propfile in default.prop build.prop; do + if [ "$propval" ]; then + break 2; + else + propval="$(file_getprop $propdir/$propfile $1 2>/dev/null)"; + fi; + done; + done; + if [ "$propval" ]; then + echo "$propval"; + else + echo ""; + fi; + } + elif [ ! "$(getprop ro.build.type 2>/dev/null)" ]; then + getprop() { + ($(which getprop) | $BB grep "$1" | $BB cut -d[ -f3 | $BB cut -d] -f1) 2>/dev/null; + } + fi; +} +restore_env() { + $BOOTMODE && return 1; + local dir; + unset -f getprop; + [ "$OLD_LD_PATH" ] && export LD_LIBRARY_PATH=$OLD_LD_PATH; + [ "$OLD_LD_PRE" ] && export LD_PRELOAD=$OLD_LD_PRE; + [ "$OLD_LD_CFG" ] && export LD_CONFIG_FILE=$OLD_LD_CFG; + unset OLD_LD_PATH OLD_LD_PRE OLD_LD_CFG; + umount_all; + [ -L /etc_link ] && $BB rm -rf /etc/*; + (for dir in /etc /apex /system_root /system /vendor /product /system_ext /persist; do + if [ -L "${dir}_link" ]; then + rmdir $dir; + $BB mv -f ${dir}_link $dir; + fi; + done; + $BB umount -l /dev/random) 2>/dev/null; +} +debugging() { + case $($BB basename "$ZIPFILE" .zip) in + *-debugging) + ui_print " " "Creating debugging archive in $DIR..."; + [ -f /tmp/recovery.log ] && local log=/tmp/recovery.log; + $BB tar -czf "$DIR/anykernel3-$(date +%Y-%m-%d_%H%M%S)-debug.tgz" $AKHOME $log; + ;; + esac; +} +cleanup() { + cd $(dirname $AKHOME); + rm -rf $AKHOME; +} +abort() { + ui_print "$@"; + debugging; + restore_env; + if [ ! -f anykernel.sh -o "$(file_getprop anykernel.sh do.cleanuponabort 2>/dev/null)" == 1 ]; then + cleanup; + fi; + exit 1; +} +do_devicecheck() { + [ "$(file_getprop anykernel.sh do.devicecheck)" == 1 ] || return 1; + local device devicename match product testname vendordevice vendorproduct; + ui_print "Checking device..."; + device=$(getprop ro.product.device 2>/dev/null); + product=$(getprop ro.build.product 2>/dev/null); + vendordevice=$(getprop ro.product.vendor.device 2>/dev/null); + vendorproduct=$(getprop ro.vendor.product.device 2>/dev/null); + for testname in $($BB grep '^device.name.*=' anykernel.sh | $BB cut -d= -f2-); do + for devicename in $device $product $vendordevice $vendorproduct; do + if [ "$devicename" == "$testname" ]; then + ui_print "$testname" " "; + match=1; + break 2; + fi; + done; + done; + if [ ! "$match" ]; then + abort " " "Unsupported device. Aborting..."; + fi; +} +int2ver() { + if $BB [ "$1" -eq "$1" ] 2>/dev/null; then + echo "$1.0.0"; + elif [ ! "$(echo "$1" | $BB cut -d. -f3)" ]; then + echo "$1.0"; + else + echo "$1"; + fi; +} +do_versioncheck() { + [ "$(file_getprop anykernel.sh supported.versions)" ] || return 1; + local android_ver hi_ver lo_ver parsed_ver supported supported_ver; + ui_print "Checking Android version..."; + supported_ver=$(file_getprop anykernel.sh supported.versions | $BB tr -d '[:space:]'); + android_ver=$(file_getprop /system/build.prop ro.build.version.release); + parsed_ver=$(int2ver $android_ver); + if echo $supported_ver | $BB grep -q '-'; then + lo_ver=$(int2ver "$(echo $supported_ver | $BB cut -d- -f1)"); + hi_ver=$(int2ver "$(echo $supported_ver | $BB cut -d- -f2)"); + if echo -e "$hi_ver\n$lo_ver\n$parsed_ver" | $BB sort -g | $BB grep -n "$parsed_ver" | $BB grep -q '^2:'; then + supported=1; + fi; + else + for ver in $(echo $supported_ver | $BB sed 's;,; ;g'); do + if [ "$(int2ver $ver)" == "$parsed_ver" ]; then + supported=1; + break; + fi; + done; + fi; + if [ "$supported" ]; then + ui_print "$android_ver" " "; + else + abort " " "Unsupported Android version. Aborting..."; + fi; +} +do_levelcheck() { + [ "$(file_getprop anykernel.sh supported.patchlevels)" ] || return 1; + local android_lvl hi_lvl lo_lvl parsed_lvl supported_lvl; + ui_print "Checking Android security patch level..."; + supported_lvl=$(file_getprop anykernel.sh supported.patchlevels | $BB grep -oE '[0-9]{4}-[0-9]{2}|-'); + android_lvl=$(file_getprop /system/build.prop ro.build.version.security_patch); + parsed_lvl=$(echo $android_lvl | $BB grep -oE '[0-9]{4}-[0-9]{2}'); + if echo $supported_lvl | $BB grep -q '^\-'; then + lo_lvl=0000-00; + hi_lvl=$(echo $supported_lvl | $BB awk '{ print $2 }'); + elif echo $supported_lvl | $BB grep -q ' - '; then + lo_lvl=$(echo $supported_lvl | $BB awk '{ print $1 }'); + hi_lvl=$(echo $supported_lvl | $BB awk '{ print $3 }'); + elif echo $supported_lvl | $BB grep -q '\-$'; then + lo_lvl=$(echo $supported_lvl | $BB awk '{ print $1 }'); + hi_lvl=9999-99; + fi; + if echo -e "$hi_lvl\n$lo_lvl\n$parsed_lvl" | $BB sort -g | $BB grep -n "$parsed_lvl" | $BB grep -q '^2:'; then + ui_print "$android_lvl" " "; + else + abort " " "Unsupported Android security patch level. Aborting..."; + fi; +} +dump_moduleinfo() { +$BB cat <<EOF > $1; +name=AK3 Helper Module +version=$($BB awk '{ print $3 }' $AKHOME/vertmp) $($BB grep -oE '#.[0-9]' $AKHOME/vertmp) +versionCode=1 +author=AnyKernel3 +description=$KERNEL_STRING +EOF +} +dump_moduleremover() { +$BB cat <<'EOF' > $1; +#!/system/bin/sh +MODDIR=${0%/*}; +if [ "$(cat /proc/version)" != "$(cat $MODDIR/version)" ]; then + rm -rf $MODDIR; +fi; +EOF +} +do_modules() { + [ "$(file_getprop anykernel.sh do.modules)" == 1 ] || return 1; + local block modcon moddir modtarget module slot umask; + if [ "$(file_getprop anykernel.sh do.systemless)" == 1 ]; then + cd $AKHOME/modules; + ui_print " " "Creating kernel helper Magisk module..."; + if [ -d /data/adb/magisk -a -f $AKHOME/magisk_patched ]; then + umask=$(umask); + umask 022; + moddir=/data/adb/modules/ak3-helper; + $BB rm -rf $moddir; + $BB mkdir -p system $moddir; + ($BB mv -f product system; + $BB mv -f vendor system) 2>/dev/null; + $BB cp -rLf * $moddir; + dump_moduleinfo $moddir/module.prop; + dump_moduleremover $moddir/post-fs-data.sh; + $BB cp -f $AKHOME/vertmp $moddir/version; + umask $umask; + else + ui_print "Magisk installation not found. Skipped!"; + fi; + else + cd $AKHOME/modules; + ui_print " " "Pushing modules..."; + if [ -d /dev/block/mapper ]; then + for block in system vendor product; do + for slot in "" _a _b; do + $BB blockdev --setrw /dev/block/mapper/$block$slot 2>/dev/null; + done; + done; + fi; + if [ ! -d /postinstall/tmp ]; then + $BB mount -o rw,remount -t auto /system; + ($BB mount -o rw,remount -t auto /vendor; + $BB mount -o rw,remount -t auto /product) 2>/dev/null; + fi; + for module in $($BB find . -name '*.ko'); do + modtarget=$POSTINSTALL$(echo $module | $BB cut -c2-); + if [ ! -e $modtarget ]; then + case $module in + */vendor/*) modcon=vendor;; + */product/*) modcon=product;; + *) modcon=system;; + esac; + fi; + if is_mounted $modtarget; then + $BB mount -o rw,remount -t auto $modtarget; + fi; + $BB mkdir -p $($BB dirname $modtarget); + $BB cp -rLf $module $modtarget; + $BB chown 0:0 $modtarget; + $BB chmod 644 $modtarget; + if [ "$modcon" ]; then + chcon "u:object_r:${modcon}_file:s0" $modtarget; + fi; + if is_mounted $modtarget; then + $BB mount -o ro,remount -t auto $modtarget; + fi; + done; + if [ ! -d /postinstall/tmp ]; then + $BB mount -o ro,remount -t auto /system; + ($BB mount -o ro,remount -t auto /vendor; + $BB mount -o ro,remount -t auto /product) 2>/dev/null; + fi; + fi; + cd $AKHOME; +} + +show_progress 1.34 4; +ui_print " "; +cleanup; +mkdir -p $AKHOME/bin; +cd $AKHOME; +unzip -o "$ZIPFILE"; +if [ $? != 0 -o ! "$(ls tools)" ]; then + abort "Unzip failed. Aborting..."; +fi; +for ARCH32 in x86 arm; do + if [ -d $AKHOME/tools/$ARCH32 ]; then + BB=$AKHOME/tools/$ARCH32/busybox; + chmod 755 $BB; + $BB >/dev/null 2>&1; + if [ $? == 0 ]; then + $BB mv -f $AKHOME/tools/$ARCH32/* $AKHOME/tools; + break; + fi; + fi; +done; +BB=$AKHOME/tools/busybox; +chmod 755 $BB; +$BB chmod -R 755 tools bin; +$BB --install -s bin; +if [ $? != 0 -o -z "$(ls bin)" ]; then + abort "Busybox setup failed. Aborting..."; +fi; + +if [ -f banner ]; then + ui_printfile banner; + ui_print " " " "; +fi; + +KERNEL_STRING="$(file_getprop anykernel.sh kernel.string)"; +ui_print "$KERNEL_STRING"; +if [ -f version ]; then + ui_print " "; + ui_printfile version; + ui_print " "; +fi; +ui_print " " "AnyKernel3 by osm0sis @ xda-developers" " "; +$BB grep -oE 'AK_BASE.*' META-INF/com/google/android/updater-script >&2; +ui_print " "; + +setup_env; + +do_devicecheck; +do_versioncheck; +do_levelcheck; + +ui_print "Installing..."; +CORE=$($BB grep -oE 'ak.*core.sh' anykernel.sh); +[ -f tools/$CORE ] || $BB ln -s $AKHOME/tools/ak*-core.sh $AKHOME/tools/$CORE; +PATH="$AKHOME/bin:$PATH" home=$AKHOME $BB ash anykernel.sh $2; +if [ $? != 0 ]; then + abort; +fi; + +do_modules; + +debugging; +restore_env; + +if [ "$(file_getprop anykernel.sh do.cleanup)" == 1 ]; then + cleanup; +fi; + +ui_print " " " " "Done!"; diff --git a/AnyKernel3/META-INF/com/google/android/updater-script b/AnyKernel3/META-INF/com/google/android/updater-script new file mode 100644 index 000000000000..d26cf458ebe9 --- /dev/null +++ b/AnyKernel3/META-INF/com/google/android/updater-script @@ -0,0 +1,6 @@ +#FLASHAFTERUPDATEV2 +# +# Dummy file; update-binary is a shell script (DO NOT CHANGE) +# +# +# AK_BASE_VERSION=20220403 diff --git a/AnyKernel3/anykernel.sh b/AnyKernel3/anykernel.sh new file mode 100755 index 000000000000..17e75d3ad90d --- /dev/null +++ b/AnyKernel3/anykernel.sh @@ -0,0 +1,48 @@ +# AnyKernel3 Ramdisk Mod Script +# osm0sis @ xda-developers + +## AnyKernel setup +# begin properties +properties() { ' +kernel.string=Optimus Drunk Kernel by GtrCraft +do.devicecheck=1 +do.modules=0 +do.cleanup=1 +do.cleanuponabort=0 +device.name1=surya +device.name2=karna +device.name3= +device.name4= +device.name5= +supported.versions= +'; } # end properties + +# shell variables +block=/dev/block/bootdevice/by-name/boot; +is_slot_device=auto; +ramdisk_compression=auto; + + +## AnyKernel methods (DO NOT CHANGE) +# import patching functions/variables - see for reference +. tools/ak3-core.sh; + + +## AnyKernel file attributes +# set permissions/ownership for included ramdisk files +set_perm_recursive 0 0 750 750 $ramdisk/*; + + +## AnyKernel install +dump_boot; + +# Begin Ramdisk Changes + +# migrate from /overlay to /overlay.d to enable SAR Magisk +if [ -d $ramdisk/overlay ]; then + rm -rf $ramdisk/overlay; +fi; + +write_boot; +## end install + diff --git a/AnyKernel3/tools/ak3-core.sh b/AnyKernel3/tools/ak3-core.sh new file mode 100755 index 000000000000..5e592ca062c8 --- /dev/null +++ b/AnyKernel3/tools/ak3-core.sh @@ -0,0 +1,825 @@ +### AnyKernel methods (DO NOT CHANGE) +## osm0sis @ xda-developers + +OUTFD=$1; + +# set up working directory variables +[ "$home" ] || home=$PWD; +bootimg=$home/boot.img; +bin=$home/tools; +patch=$home/patch; +ramdisk=$home/ramdisk; +split_img=$home/split_img; + +### output/testing functions: +# ui_print "<text>" [...] +ui_print() { + until [ ! "$1" ]; do + echo "ui_print $1 + ui_print" >> /proc/self/fd/$OUTFD; + shift; + done; +} + +# abort ["<text>" [...]] +abort() { + ui_print " " "$@"; + exit 1; +} + +# contains <string> <substring> +contains() { + [ "${1#*$2}" != "$1" ]; +} + +# file_getprop <file> <property> +file_getprop() { + grep "^$2=" "$1" | tail -n1 | cut -d= -f2-; +} +### + +### file/directory attributes functions: +# set_perm <owner> <group> <mode> <file> [<file2> ...] +set_perm() { + local uid gid mod; + uid=$1; gid=$2; mod=$3; + shift 3; + chown $uid:$gid "$@" || chown $uid.$gid "$@"; + chmod $mod "$@"; +} + +# set_perm_recursive <owner> <group> <dir_mode> <file_mode> <dir> [<dir2> ...] +set_perm_recursive() { + local uid gid dmod fmod; + uid=$1; gid=$2; dmod=$3; fmod=$4; + shift 4; + while [ "$1" ]; do + chown -R $uid:$gid "$1" || chown -R $uid.$gid "$1"; + find "$1" -type d -exec chmod $dmod {} +; + find "$1" -type f -exec chmod $fmod {} +; + shift; + done; +} +### + +### dump_boot functions: +# split_boot (dump and split image only) +split_boot() { + local dumpfail; + + if [ ! -e "$(echo $block | cut -d\ -f1)" ]; then + abort "Invalid partition. Aborting..."; + fi; + if [ "$(echo $block | grep ' ')" ]; then + block=$(echo $block | cut -d\ -f1); + customdd=$(echo $block | cut -d\ -f2-); + elif [ ! "$customdd" ]; then + local customdd="bs=1048576"; + fi; + if [ -f "$bin/nanddump" ]; then + $bin/nanddump -f $bootimg $block; + else + dd if=$block of=$bootimg $customdd; + fi; + [ $? != 0 ] && dumpfail=1; + + mkdir -p $split_img; + cd $split_img; + if [ -f "$bin/unpackelf" ] && $bin/unpackelf -i $bootimg -h -q 2>/dev/null; then + if [ -f "$bin/elftool" ]; then + mkdir elftool_out; + $bin/elftool unpack -i $bootimg -o elftool_out; + fi; + $bin/unpackelf -i $bootimg; + [ $? != 0 ] && dumpfail=1; + mv -f boot.img-kernel kernel.gz; + mv -f boot.img-ramdisk ramdisk.cpio.gz; + mv -f boot.img-cmdline cmdline.txt 2>/dev/null; + if [ -f boot.img-dt -a ! -f "$bin/elftool" ]; then + case $(od -ta -An -N4 boot.img-dt | sed -e 's/ del//' -e 's/ //g') in + QCDT|ELF) mv -f boot.img-dt dt;; + *) + gzip -c kernel.gz > kernel.gz-dtb; + cat boot.img-dt >> kernel.gz-dtb; + rm -f boot.img-dt kernel.gz; + ;; + esac; + fi; + elif [ -f "$bin/mboot" ]; then + $bin/mboot -u -f $bootimg; + elif [ -f "$bin/dumpimage" ]; then + dd bs=$(($(printf '%d\n' 0x$(hexdump -n 4 -s 12 -e '16/1 "%02x""\n"' $bootimg)) + 64)) count=1 conv=notrunc if=$bootimg of=boot-trimmed.img; + $bin/dumpimage -l boot-trimmed.img > header; + grep "Name:" header | cut -c15- > boot.img-name; + grep "Type:" header | cut -c15- | cut -d\ -f1 > boot.img-arch; + grep "Type:" header | cut -c15- | cut -d\ -f2 > boot.img-os; + grep "Type:" header | cut -c15- | cut -d\ -f3 | cut -d- -f1 > boot.img-type; + grep "Type:" header | cut -d\( -f2 | cut -d\) -f1 | cut -d\ -f1 | cut -d- -f1 > boot.img-comp; + grep "Address:" header | cut -c15- > boot.img-addr; + grep "Point:" header | cut -c15- > boot.img-ep; + $bin/dumpimage -p 0 -o kernel.gz boot-trimmed.img; + [ $? != 0 ] && dumpfail=1; + case $(cat boot.img-type) in + Multi) $bin/dumpimage -p 1 -o ramdisk.cpio.gz boot-trimmed.img;; + RAMDisk) mv -f kernel.gz ramdisk.cpio.gz;; + esac; + elif [ -f "$bin/rkcrc" ]; then + dd bs=4096 skip=8 iflag=skip_bytes conv=notrunc if=$bootimg of=ramdisk.cpio.gz; + else + $bin/magiskboot unpack -h $bootimg; + case $? in + 1) dumpfail=1;; + 2) touch chromeos;; + esac; + fi; + + if [ $? != 0 -o "$dumpfail" ]; then + abort "Dumping/splitting image failed. Aborting..."; + fi; + cd $home; +} + +# unpack_ramdisk (extract ramdisk only) +unpack_ramdisk() { + local comp; + + cd $split_img; + if [ -f ramdisk.cpio.gz ]; then + if [ -f "$bin/mkmtkhdr" ]; then + mv -f ramdisk.cpio.gz ramdisk.cpio.gz-mtk; + dd bs=512 skip=1 conv=notrunc if=ramdisk.cpio.gz-mtk of=ramdisk.cpio.gz; + fi; + mv -f ramdisk.cpio.gz ramdisk.cpio; + fi; + + if [ -f ramdisk.cpio ]; then + comp=$($bin/magiskboot decompress ramdisk.cpio 2>&1 | grep -v 'raw' | sed -n 's;.*\[\(.*\)\];\1;p'); + else + abort "No ramdisk found to unpack. Aborting..."; + fi; + if [ "$comp" ]; then + mv -f ramdisk.cpio ramdisk.cpio.$comp; + $bin/magiskboot decompress ramdisk.cpio.$comp ramdisk.cpio; + if [ $? != 0 ]; then + echo "Attempting ramdisk unpack with busybox $comp..." >&2; + $comp -dc ramdisk.cpio.$comp > ramdisk.cpio; + fi; + fi; + + [ -d $ramdisk ] && mv -f $ramdisk $home/rdtmp; + mkdir -p $ramdisk; + chmod 755 $ramdisk; + + cd $ramdisk; + EXTRACT_UNSAFE_SYMLINKS=1 cpio -d -F $split_img/ramdisk.cpio -i; + if [ $? != 0 -o ! "$(ls)" ]; then + abort "Unpacking ramdisk failed. Aborting..."; + fi; + if [ -d "$home/rdtmp" ]; then + cp -af $home/rdtmp/* .; + fi; +} +### dump_boot (dump and split image, then extract ramdisk) +dump_boot() { + split_boot; + unpack_ramdisk; +} +### + +### write_boot functions: +# repack_ramdisk (repack ramdisk only) +repack_ramdisk() { + local comp packfail mtktype; + + cd $home; + case $ramdisk_compression in + auto|"") comp=$(ls $split_img/ramdisk.cpio.* 2>/dev/null | grep -v 'mtk' | rev | cut -d. -f1 | rev);; + none|cpio) comp="";; + gz) comp=gzip;; + lzo) comp=lzop;; + bz2) comp=bzip2;; + lz4-l) comp=lz4_legacy;; + *) comp=$ramdisk_compression;; + esac; + + if [ -f "$bin/mkbootfs" ]; then + $bin/mkbootfs $ramdisk > ramdisk-new.cpio; + else + cd $ramdisk; + find . | cpio -H newc -o > $home/ramdisk-new.cpio; + fi; + [ $? != 0 ] && packfail=1; + + cd $home; + $bin/magiskboot cpio ramdisk-new.cpio test; + magisk_patched=$?; + [ $((magisk_patched & 3)) -eq 1 ] && $bin/magiskboot cpio ramdisk-new.cpio "extract .backup/.magisk $split_img/.magisk"; + if [ "$comp" ]; then + $bin/magiskboot compress=$comp ramdisk-new.cpio; + if [ $? != 0 ]; then + echo "Attempting ramdisk repack with busybox $comp..." >&2; + $comp -9c ramdisk-new.cpio > ramdisk-new.cpio.$comp; + [ $? != 0 ] && packfail=1; + rm -f ramdisk-new.cpio; + fi; + fi; + if [ "$packfail" ]; then + abort "Repacking ramdisk failed. Aborting..."; + fi; + + if [ -f "$bin/mkmtkhdr" -a -f "$split_img/boot.img-base" ]; then + mtktype=$(od -ta -An -N8 -j8 $split_img/ramdisk.cpio.gz-mtk | sed -e 's/ nul//g' -e 's/ //g' | tr '[:upper:]' '[:lower:]'); + case $mtktype in + rootfs|recovery) $bin/mkmtkhdr --$mtktype ramdisk-new.cpio*;; + esac; + fi; +} + +# flash_boot (build, sign and write image only) +flash_boot() { + local varlist i kernel ramdisk fdt cmdline comp part0 part1 nocompflag signfail pk8 cert avbtype; + + cd $split_img; + if [ -f "$bin/mkimage" ]; then + varlist="name arch os type comp addr ep"; + elif [ -f "$bin/mkbootimg" -a -f "$bin/unpackelf" -a -f boot.img-base ]; then + mv -f cmdline.txt boot.img-cmdline 2>/dev/null; + varlist="cmdline base pagesize kernel_offset ramdisk_offset tags_offset"; + fi; + for i in $varlist; do + if [ -f boot.img-$i ]; then + eval local $i=\"$(cat boot.img-$i)\"; + fi; + done; + + cd $home; + for i in zImage zImage-dtb Image Image-dtb Image.gz Image.gz-dtb Image.bz2 Image.bz2-dtb Image.lzo Image.lzo-dtb Image.lzma Image.lzma-dtb Image.xz Image.xz-dtb Image.lz4 Image.lz4-dtb Image.fit; do + if [ -f $i ]; then + kernel=$home/$i; + break; + fi; + done; + if [ "$kernel" ]; then + if [ -f "$bin/mkmtkhdr" -a -f "$split_img/boot.img-base" ]; then + $bin/mkmtkhdr --kernel $kernel; + kernel=$kernel-mtk; + fi; + elif [ "$(ls $split_img/kernel* 2>/dev/null)" ]; then + kernel=$(ls $split_img/kernel* | grep -v 'kernel_dtb' | tail -n1); + fi; + if [ "$(ls ramdisk-new.cpio* 2>/dev/null)" ]; then + ramdisk=$home/$(ls ramdisk-new.cpio* | tail -n1); + elif [ -f "$bin/mkmtkhdr" -a -f "$split_img/boot.img-base" ]; then + ramdisk=$split_img/ramdisk.cpio.gz-mtk; + else + ramdisk=$(ls $split_img/ramdisk.cpio* 2>/dev/null | tail -n1); + fi; + for fdt in dt recovery_dtbo dtb; do + for i in $home/$fdt $home/$fdt.img $split_img/$fdt; do + if [ -f $i ]; then + eval local $fdt=$i; + break; + fi; + done; + done; + + cd $split_img; + if [ -f "$bin/mkimage" ]; then + [ "$comp" == "uncompressed" ] && comp=none; + part0=$kernel; + case $type in + Multi) part1=":$ramdisk";; + RAMDisk) part0=$ramdisk;; + esac; + $bin/mkimage -A $arch -O $os -T $type -C $comp -a $addr -e $ep -n "$name" -d $part0$part1 $home/boot-new.img; + elif [ -f "$bin/elftool" ]; then + [ "$dt" ] && dt="$dt,rpm"; + [ -f cmdline.txt ] && cmdline="cmdline.txt@cmdline"; + $bin/elftool pack -o $home/boot-new.img header=elftool_out/header $kernel $ramdisk,ramdisk $dt $cmdline; + elif [ -f "$bin/mboot" ]; then + cp -f $kernel kernel; + cp -f $ramdisk ramdisk.cpio.gz; + $bin/mboot -d $split_img -f $home/boot-new.img; + elif [ -f "$bin/rkcrc" ]; then + $bin/rkcrc -k $ramdisk $home/boot-new.img; + elif [ -f "$bin/mkbootimg" -a -f "$bin/unpackelf" -a -f boot.img-base ]; then + [ "$dt" ] && dt="--dt $dt"; + $bin/mkbootimg --kernel $kernel --ramdisk $ramdisk --cmdline "$cmdline" --base $base --pagesize $pagesize --kernel_offset $kernel_offset --ramdisk_offset $ramdisk_offset --tags_offset "$tags_offset" $dt --output $home/boot-new.img; + else + [ "$kernel" ] && cp -f $kernel kernel; + [ "$ramdisk" ] && cp -f $ramdisk ramdisk.cpio; + [ "$dt" -a -f extra ] && cp -f $dt extra; + for i in dtb recovery_dtbo; do + [ "$(eval echo \$$i)" -a -f $i ] && cp -f $(eval echo \$$i) $i; + done; + case $kernel in + *Image*) + if [ ! "$magisk_patched" ]; then + $bin/magiskboot cpio ramdisk.cpio test; + magisk_patched=$?; + fi; + if [ $((magisk_patched & 3)) -eq 1 ]; then + ui_print " " "Magisk detected! Patching kernel so reflashing Magisk is not necessary..."; + comp=$($bin/magiskboot decompress kernel 2>&1 | grep -vE 'raw|zimage' | sed -n 's;.*\[\(.*\)\];\1;p'); + ($bin/magiskboot split $kernel || $bin/magiskboot decompress $kernel kernel) 2>/dev/null; + if [ $? != 0 -a "$comp" ] && $comp --help 2>/dev/null; then + echo "Attempting kernel unpack with busybox $comp..." >&2; + $comp -dc $kernel > kernel; + fi; + $bin/magiskboot hexpatch kernel 736B69705F696E697472616D667300 77616E745F696E697472616D667300; + if [ "$(file_getprop $home/anykernel.sh do.systemless)" == 1 ]; then + strings kernel | grep -E -m1 'Linux version.*#' > $home/vertmp; + fi; + if [ "$comp" ]; then + $bin/magiskboot compress=$comp kernel kernel.$comp; + if [ $? != 0 ] && $comp --help 2>/dev/null; then + echo "Attempting kernel repack with busybox $comp..." >&2; + $comp -9c kernel > kernel.$comp; + fi; + mv -f kernel.$comp kernel; + fi; + [ ! -f .magisk ] && $bin/magiskboot cpio ramdisk.cpio "extract .backup/.magisk .magisk"; + export $(cat .magisk); + [ $((magisk_patched & 8)) -ne 0 ] && export TWOSTAGEINIT=true; + for fdt in dtb extra kernel_dtb recovery_dtbo; do + [ -f $fdt ] && $bin/magiskboot dtb $fdt patch; + done; + else + case $kernel in + *-dtb) rm -f kernel_dtb;; + esac; + fi; + unset magisk_patched KEEPFORCEENCRYPT KEEPVERITY SHA1 TWOSTAGEINIT; # leave PATCHVBMETAFLAG set for repack + ;; + esac; + case $ramdisk_compression in + none|cpio) nocompflag="-n";; + esac; + case $patch_vbmeta_flag in + auto|"") [ "$PATCHVBMETAFLAG" ] || export PATCHVBMETAFLAG=false;; + 1) export PATCHVBMETAFLAG=true;; + *) export PATCHVBMETAFLAG=false;; + esac; + $bin/magiskboot repack $nocompflag $bootimg $home/boot-new.img; + unset PATCHVBMETAFLAG; + fi; + if [ $? != 0 ]; then + abort "Repacking image failed. Aborting..."; + fi; + [ -f .magisk ] && touch $home/magisk_patched; + + cd $home; + if [ -f "$bin/futility" -a -d "$bin/chromeos" ]; then + if [ -f "$split_img/chromeos" ]; then + echo "Signing with CHROMEOS..." >&2; + $bin/futility vbutil_kernel --pack boot-new-signed.img --keyblock $bin/chromeos/kernel.keyblock --signprivate $bin/chromeos/kernel_data_key.vbprivk --version 1 --vmlinuz boot-new.img --bootloader $bin/chromeos/empty --config $bin/chromeos/empty --arch arm --flags 0x1; + fi; + [ $? != 0 ] && signfail=1; + fi; + if [ -f "$bin/boot_signer-dexed.jar" -a -d "$bin/avb" ]; then + pk8=$(ls $bin/avb/*.pk8); + cert=$(ls $bin/avb/*.x509.*); + case $block in + *recovery*|*SOS*) avbtype=recovery;; + *) avbtype=boot;; + esac; + if [ "$(/system/bin/dalvikvm -Xnoimage-dex2oat -cp $bin/boot_signer-dexed.jar com.android.verity.BootSignature -verify boot.img 2>&1 | grep VALID)" ]; then + echo "Signing with AVBv1..." >&2; + /system/bin/dalvikvm -Xnoimage-dex2oat -cp $bin/boot_signer-dexed.jar com.android.verity.BootSignature /$avbtype boot-new.img $pk8 $cert boot-new-signed.img; + fi; + fi; + if [ $? != 0 -o "$signfail" ]; then + abort "Signing image failed. Aborting..."; + fi; + mv -f boot-new-signed.img boot-new.img 2>/dev/null; + + if [ ! -f boot-new.img ]; then + abort "No repacked image found to flash. Aborting..."; + elif [ "$(wc -c < boot-new.img)" -gt "$(wc -c < boot.img)" ]; then + abort "New image larger than target partition. Aborting..."; + fi; + blockdev --setrw $block 2>/dev/null; + if [ -f "$bin/flash_erase" -a -f "$bin/nandwrite" ]; then + $bin/flash_erase $block 0 0; + $bin/nandwrite -p $block boot-new.img; + elif [ "$customdd" ]; then + dd if=/dev/zero of=$block $customdd 2>/dev/null; + dd if=boot-new.img of=$block $customdd; + else + cat boot-new.img /dev/zero > $block 2>/dev/null || true; + fi; + if [ $? != 0 ]; then + abort "Flashing image failed. Aborting..."; + fi; +} + +# flash_generic <name> +flash_generic() { + local file img imgblock isro path; + + cd $home; + for file in $1 $1.img; do + if [ -f $file ]; then + img=$file; + break; + fi; + done; + + if [ "$img" -a ! -f ${1}_flashed ]; then + for path in /dev/block/bootdevice/by-name /dev/block/mapper; do + for file in $1 $1$slot; do + if [ -e $path/$file ]; then + imgblock=$path/$file; + break 2; + fi; + done; + done; + if [ ! "$imgblock" ]; then + abort "$1 partition could not be found. Aborting..."; + fi; + # TODO: add dynamic partition resizing using lptools_static instead of aborting + if [ "$(wc -c < $img)" -gt "$(wc -c < $imgblock)" ]; then + abort "New $1 image larger than $1 partition. Aborting..."; + fi; + isro=$(blockdev --getro $imgblock 2>/dev/null); + blockdev --setrw $imgblock 2>/dev/null; + if [ ! "$no_block_display" ]; then + ui_print " " "$imgblock"; + fi; + if [ -f "$bin/flash_erase" -a -f "$bin/nandwrite" ]; then + $bin/flash_erase $imgblock 0 0; + $bin/nandwrite -p $imgblock $img; + elif [ "$customdd" ]; then + dd if=/dev/zero of=$imgblock 2>/dev/null; + dd if=$img of=$imgblock; + else + cat $img /dev/zero > $imgblock 2>/dev/null || true; + fi; + if [ $? != 0 ]; then + abort "Flashing $1 failed. Aborting..."; + fi; + if [ "$isro" != 0 ]; then + blockdev --setro $imgblock 2>/dev/null; + fi; + touch ${1}_flashed; + fi; +} + +# flash_dtbo (backwards compatibility for flash_generic) +flash_dtbo() { flash_generic dtbo; } + +### write_boot (repack ramdisk then build, sign and write image, vendor_dlkm and dtbo) +write_boot() { + flash_generic vendor_dlkm; # TODO: move below boot once resizing is supported + repack_ramdisk; + flash_boot; + flash_generic vendor_boot; # temporary until hdr v4 can be unpacked/repacked fully by magiskboot + flash_generic dtbo; +} +### + +### file editing functions: +# backup_file <file> +backup_file() { [ ! -f $1~ ] && cp -fp $1 $1~; } + +# restore_file <file> +restore_file() { [ -f $1~ ] && cp -fp $1~ $1; rm -f $1~; } + +# replace_string <file> <if search string> <original string> <replacement string> <scope> +replace_string() { + [ "$5" == "global" ] && local scope=g; + if ! grep -q "$2" $1; then + sed -i "s;${3};${4};${scope}" $1; + fi; +} + +# replace_section <file> <begin search string> <end search string> <replacement string> +replace_section() { + local begin endstr last end; + begin=$(grep -n -m1 "$2" $1 | cut -d: -f1); + if [ "$begin" ]; then + if [ "$3" == " " -o ! "$3" ]; then + endstr='^[[:space:]]*$'; + last=$(wc -l $1 | cut -d\ -f1); + else + endstr="$3"; + fi; + for end in $(grep -n "$endstr" $1 | cut -d: -f1) $last; do + if [ "$end" ] && [ "$begin" -lt "$end" ]; then + sed -i "${begin},${end}d" $1; + [ "$end" == "$last" ] && echo >> $1; + sed -i "${begin}s;^;${4}\n;" $1; + break; + fi; + done; + fi; +} + +# remove_section <file> <begin search string> <end search string> +remove_section() { + local begin endstr last end; + begin=$(grep -n -m1 "$2" $1 | cut -d: -f1); + if [ "$begin" ]; then + if [ "$3" == " " -o ! "$3" ]; then + endstr='^[[:space:]]*$'; + last=$(wc -l $1 | cut -d\ -f1); + else + endstr="$3"; + fi; + for end in $(grep -n "$endstr" $1 | cut -d: -f1) $last; do + if [ "$end" ] && [ "$begin" -lt "$end" ]; then + sed -i "${begin},${end}d" $1; + break; + fi; + done; + fi; +} + +# insert_line <file> <if search string> <before|after> <line match string> <inserted line> +insert_line() { + local offset line; + if ! grep -q "$2" $1; then + case $3 in + before) offset=0;; + after) offset=1;; + esac; + line=$((`grep -n -m1 "$4" $1 | cut -d: -f1` + offset)); + if [ -f $1 -a "$line" ] && [ "$(wc -l $1 | cut -d\ -f1)" -lt "$line" ]; then + echo "$5" >> $1; + else + sed -i "${line}s;^;${5}\n;" $1; + fi; + fi; +} + +# replace_line <file> <line replace string> <replacement line> <scope> +replace_line() { + local lines line; + if grep -q "$2" $1; then + lines=$(grep -n "$2" $1 | cut -d: -f1 | sort -nr); + [ "$4" == "global" ] || lines=$(echo "$lines" | tail -n1); + for line in $lines; do + sed -i "${line}s;.*;${3};" $1; + done; + fi; +} + +# remove_line <file> <line match string> <scope> +remove_line() { + local lines line; + if grep -q "$2" $1; then + lines=$(grep -n "$2" $1 | cut -d: -f1 | sort -nr); + [ "$3" == "global" ] || lines=$(echo "$lines" | tail -n1); + for line in $lines; do + sed -i "${line}d" $1; + done; + fi; +} + +# prepend_file <file> <if search string> <patch file> +prepend_file() { + if ! grep -q "$2" $1; then + echo "$(cat $patch/$3 $1)" > $1; + fi; +} + +# insert_file <file> <if search string> <before|after> <line match string> <patch file> +insert_file() { + local offset line; + if ! grep -q "$2" $1; then + case $3 in + before) offset=0;; + after) offset=1;; + esac; + line=$((`grep -n -m1 "$4" $1 | cut -d: -f1` + offset)); + sed -i "${line}s;^;\n;" $1; + sed -i "$((line - 1))r $patch/$5" $1; + fi; +} + +# append_file <file> <if search string> <patch file> +append_file() { + if ! grep -q "$2" $1; then + echo -ne "\n" >> $1; + cat $patch/$3 >> $1; + echo -ne "\n" >> $1; + fi; +} + +# replace_file <file> <permissions> <patch file> +replace_file() { + cp -pf $patch/$3 $1; + chmod $2 $1; +} + +# patch_fstab <fstab file> <mount match name> <fs match type> block|mount|fstype|options|flags <original string> <replacement string> +patch_fstab() { + local entry part newpart newentry; + entry=$(grep "$2[[:space:]]" $1 | grep "$3"); + if [ ! "$(echo "$entry" | grep "$6")" -o "$6" == " " -o ! "$6" ]; then + case $4 in + block) part=$(echo "$entry" | awk '{ print $1 }');; + mount) part=$(echo "$entry" | awk '{ print $2 }');; + fstype) part=$(echo "$entry" | awk '{ print $3 }');; + options) part=$(echo "$entry" | awk '{ print $4 }');; + flags) part=$(echo "$entry" | awk '{ print $5 }');; + esac; + newpart=$(echo "$part" | sed -e "s;${5};${6};" -e "s; ;;g" -e 's;,\{2,\};,;g' -e 's;,*$;;g' -e 's;^,;;g'); + newentry=$(echo "$entry" | sed "s;${part};${newpart};"); + sed -i "s;${entry};${newentry};" $1; + fi; +} + +# patch_cmdline <cmdline entry name> <replacement string> +patch_cmdline() { + local cmdfile cmdtmp match; + if [ -f "$split_img/cmdline.txt" ]; then + cmdfile=$split_img/cmdline.txt; + else + cmdfile=$home/cmdtmp; + grep "^cmdline=" $split_img/header | cut -d= -f2- > $cmdfile; + fi; + if ! grep -q "$1" $cmdfile; then + cmdtmp=$(cat $cmdfile); + echo "$cmdtmp $2" > $cmdfile; + sed -i -e 's; *; ;g' -e 's;[ \t]*$;;' $cmdfile; + else + match=$(grep -o "$1.*$" $cmdfile | cut -d\ -f1); + sed -i -e "s;${match};${2};" -e 's; *; ;g' -e 's;[ \t]*$;;' $cmdfile; + fi; + if [ -f "$home/cmdtmp" ]; then + sed -i "s|^cmdline=.*|cmdline=$(cat $cmdfile)|" $split_img/header; + rm -f $cmdfile; + fi; +} + +# patch_prop <prop file> <prop name> <new prop value> +patch_prop() { + if ! grep -q "^$2=" $1; then + echo -ne "\n$2=$3\n" >> $1; + else + local line=$(grep -n -m1 "^$2=" $1 | cut -d: -f1); + sed -i "${line}s;.*;${2}=${3};" $1; + fi; +} + +# patch_ueventd <ueventd file> <device node> <permissions> <chown> <chgrp> +patch_ueventd() { + local file dev perm user group newentry line; + file=$1; dev=$2; perm=$3; user=$4; + shift 4; + group="$@"; + newentry=$(printf "%-23s %-4s %-8s %s\n" "$dev" "$perm" "$user" "$group"); + line=$(grep -n -m1 "$dev" $file | cut -d: -f1); + if [ "$line" ]; then + sed -i "${line}s;.*;${newentry};" $file; + else + echo -ne "\n$newentry\n" >> $file; + fi; +} +### + +### configuration/setup functions: +# reset_ak [keep] +reset_ak() { + local current i; + + current=$(dirname $home/*-files/current); + if [ -d "$current" ]; then + for i in $bootimg $home/boot-new.img; do + [ -e $i ] && cp -af $i $current; + done; + for i in $current/*; do + [ -f $i ] && rm -f $home/$(basename $i); + done; + fi; + [ -d $split_img ] && rm -rf $ramdisk; + rm -rf $bootimg $split_img $home/*-new* $home/*-files/current; + + if [ "$1" == "keep" ]; then + [ -d $home/rdtmp ] && mv -f $home/rdtmp $ramdisk; + else + rm -rf $patch $home/rdtmp; + fi; + if [ ! "$no_block_display" ]; then + ui_print " "; + fi; + setup_ak; +} + +# setup_ak +setup_ak() { + local blockfiles parttype name part mtdmount mtdpart mtdname target; + + # slot detection enabled by is_slot_device=1 or auto (from anykernel.sh) + case $is_slot_device in + 1|auto) + slot=$(getprop ro.boot.slot_suffix 2>/dev/null); + [ "$slot" ] || slot=$(grep -o 'androidboot.slot_suffix=.*$' /proc/cmdline | cut -d\ -f1 | cut -d= -f2); + if [ ! "$slot" ]; then + slot=$(getprop ro.boot.slot 2>/dev/null); + [ "$slot" ] || slot=$(grep -o 'androidboot.slot=.*$' /proc/cmdline | cut -d\ -f1 | cut -d= -f2); + [ "$slot" ] && slot=_$slot; + fi; + if [ "$slot" ]; then + if [ -d /postinstall/tmp -a ! "$slot_select" ]; then + slot_select=inactive; + fi; + case $slot_select in + inactive) + case $slot in + _a) slot=_b;; + _b) slot=_a;; + esac; + ;; + esac; + fi; + if [ ! "$slot" -a "$is_slot_device" == 1 ]; then + abort "Unable to determine active slot. Aborting..."; + fi; + ;; + esac; + + # automate simple multi-partition setup for boot_img_hdr_v3 + vendor_boot + cd $home; + if [ -e "/dev/block/bootdevice/by-name/vendor_boot$slot" -a ! -f vendor_setup ] && [ -f dtb -o -d vendor_ramdisk -o -d vendor_patch ]; then + echo "Setting up for simple automatic vendor_boot flashing..." >&2; + (mkdir boot-files; + mv -f Image* ramdisk patch boot-files; + mkdir vendor_boot-files; + mv -f dtb vendor_boot-files; + mv -f vendor_ramdisk vendor_boot-files/ramdisk; + mv -f vendor_patch vendor_boot-files/patch) 2>/dev/null; + touch vendor_setup; + fi; + + # allow multi-partition ramdisk modifying configurations (using reset_ak) + if [ "$block" ] && [ ! -d "$ramdisk" -a ! -d "$patch" ]; then + blockfiles=$home/$(basename $block)-files; + if [ "$(ls $blockfiles 2>/dev/null)" ]; then + cp -af $blockfiles/* $home; + else + mkdir $blockfiles; + fi; + touch $blockfiles/current; + fi; + + # target block partition detection enabled by block=boot recovery or auto (from anykernel.sh) + case $block in + auto|"") block=boot;; + esac; + case $block in + boot|recovery|vendor_boot) + case $block in + boot) parttype="ramdisk init_boot boot BOOT LNX android_boot bootimg KERN-A kernel KERNEL";; + recovery) parttype="ramdisk_recovery recovery RECOVERY SOS android_recovery";; + vendor_boot) parttype="vendor_boot";; + esac; + for name in $parttype; do + for part in $name$slot $name; do + if [ "$(grep -w "$part" /proc/mtd 2> /dev/null)" ]; then + mtdmount=$(grep -w "$part" /proc/mtd); + mtdpart=$(echo $mtdmount | cut -d\" -f2); + if [ "$mtdpart" == "$part" ]; then + mtdname=$(echo $mtdmount | cut -d: -f1); + else + abort "Unable to determine mtd $block partition. Aborting..."; + fi; + if [ -e /dev/mtd/$mtdname ]; then + target=/dev/mtd/$mtdname; + fi; + elif [ -e /dev/block/by-name/$part ]; then + target=/dev/block/by-name/$part; + elif [ -e /dev/block/bootdevice/by-name/$part ]; then + target=/dev/block/bootdevice/by-name/$part; + elif [ -e /dev/block/platform/*/by-name/$part ]; then + target=/dev/block/platform/*/by-name/$part; + elif [ -e /dev/block/platform/*/*/by-name/$part ]; then + target=/dev/block/platform/*/*/by-name/$part; + elif [ -e /dev/$part ]; then + target=/dev/$part; + fi; + [ "$target" ] && break 2; + done; + done; + if [ "$target" ]; then + block=$(ls $target 2>/dev/null); + else + abort "Unable to determine $block partition. Aborting..."; + fi; + ;; + *) + if [ "$slot" ]; then + [ -e "$block$slot" ] && block=$block$slot; + fi; + ;; + esac; + if [ ! "$no_block_display" ]; then + ui_print "$block"; + fi; +} +### + +### end methods + +setup_ak; diff --git a/AnyKernel3/tools/busybox b/AnyKernel3/tools/busybox Binary files differnew file mode 100755 index 000000000000..0df546b295cd --- /dev/null +++ b/AnyKernel3/tools/busybox diff --git a/AnyKernel3/tools/magiskboot b/AnyKernel3/tools/magiskboot Binary files differnew file mode 100755 index 000000000000..61c1c10f4b19 --- /dev/null +++ b/AnyKernel3/tools/magiskboot diff --git a/AnyKernel3/tools/magiskpolicy b/AnyKernel3/tools/magiskpolicy Binary files differnew file mode 100755 index 000000000000..a12ad87eed7f --- /dev/null +++ b/AnyKernel3/tools/magiskpolicy |
