aboutsummaryrefslogtreecommitdiff
path: root/AnyKernel3
diff options
context:
space:
mode:
authorGtrCraft <nickvanbokhorst@hotmail.com>2022-07-11 16:33:42 +0200
committerGtrCraft <nickvanbokhorst@hotmail.com>2022-07-12 10:07:20 +0200
commit032a1dc1ddc2c7a2c95da6dca71eef615ae621ed (patch)
tree8a35eaccf7d937c4fc64e2d2c71b67a25e669ffb /AnyKernel3
parent4d0a8ab2c01d8c1e6f3d010f4906cb52c9e5cb84 (diff)
surya: Add Optimus scripts & defconfigHEADs12.1
Diffstat (limited to 'AnyKernel3')
-rwxr-xr-xAnyKernel3/META-INF/com/google/android/update-binary501
-rw-r--r--AnyKernel3/META-INF/com/google/android/updater-script6
-rwxr-xr-xAnyKernel3/anykernel.sh48
-rwxr-xr-xAnyKernel3/tools/ak3-core.sh825
-rwxr-xr-xAnyKernel3/tools/busyboxbin0 -> 1399484 bytes
-rwxr-xr-xAnyKernel3/tools/magiskbootbin0 -> 315336 bytes
-rwxr-xr-xAnyKernel3/tools/magiskpolicybin0 -> 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
new file mode 100755
index 000000000000..0df546b295cd
--- /dev/null
+++ b/AnyKernel3/tools/busybox
Binary files differ
diff --git a/AnyKernel3/tools/magiskboot b/AnyKernel3/tools/magiskboot
new file mode 100755
index 000000000000..61c1c10f4b19
--- /dev/null
+++ b/AnyKernel3/tools/magiskboot
Binary files differ
diff --git a/AnyKernel3/tools/magiskpolicy b/AnyKernel3/tools/magiskpolicy
new file mode 100755
index 000000000000..a12ad87eed7f
--- /dev/null
+++ b/AnyKernel3/tools/magiskpolicy
Binary files differ