- abstract out execution directory as $home to fascilitate testing individual scripts (defaults to /tmp/anykernel) - general script clean ups for uniformity, readability, speed and simplicity - simplify consecutive `ui_print` commands where possible Backend only fixes: - use busybox umount and mount whenever possible to avoid linker warnings in stderr during system-as-root setup - use `busybox --install -s` for bin/* setup - consolidate setup to abort earlier if there are issues - add backwards compatible symlinks for those who might not have updated their anykernel.sh with ak3-core.sh (to be renamed in subsequent commit) Tools only fixes: - add magiskboot to replace separate support for AOSP and PXA-AOSP formats, with MTK headers, BLOB, DHTB, SEAndroid and Nook signing - add magiskpolicy to allow for easy sepolicy patching - remove xz and lz4 since magiskboot supports these AK3 Core only fixes: - use full `ui_print` function implementation like the backend - add `abort` function to simplify exit on errors - fix $patch directory being excluded from `reset_ak` - update $ramdisk_compression handling for magiskboot - magiskboot also resolves long-standing request for built-in Bump support (#18) - update Sony ELF and related support for initial repack as AOSP by using mkbootimg as plug-and-play optional add-in binary - update Sony ELF MTK header support using mkmtkhdr only when ELF is initially unpacked by unpackelf - add support for MTK RECOVERY ramdisk header type with Sony ELF - simplify U-Boot dumpimage/mkimage and Sony ELF unpackelf/mkbootimg split_img file handling - update patch_cmdline to handle both magiskboot as header prop file, and unpackelf or mboot as cmdline.txt - use `cp -fp` for `backup_file` and `restore_file` to hopefully better preserve attributes if used outside of the ramdisk - refactor setup into `setup_ak` to simplify `reset_ak` trigger to find slot and block again - add fallback to busybox for compression formats (i.e. lzop) which magiskboot cannot handle IMPORTANT NOTES: 1) forcing repack with uncompressed cpio ramdisk is not currently supported by magiskboot 2) forcing repack with lzop ramdisk when previously another format is not currently supported by magiskboot
220 lines
5.8 KiB
Bash
Executable File
220 lines
5.8 KiB
Bash
Executable File
#!/sbin/sh
|
|
# AnyKernel3 Backend (DO NOT CHANGE)
|
|
# osm0sis @ xda-developers
|
|
|
|
OUTFD=/proc/self/fd/$2;
|
|
ZIPFILE="$3";
|
|
DIR=$(dirname "$ZIPFILE");
|
|
|
|
test "$home" || home=/tmp/anykernel;
|
|
parent=$(dirname $home);
|
|
|
|
ui_print() {
|
|
until [ ! "$1" ]; do
|
|
echo -e "ui_print $1\nui_print" > $OUTFD;
|
|
shift;
|
|
done;
|
|
}
|
|
show_progress() { echo "progress $1 $2" > $OUTFD; }
|
|
file_getprop() { $bb grep "^$2=" "$1" | $bb cut -d= -f2-; }
|
|
int2ver() {
|
|
if [ "$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;
|
|
}
|
|
cleanup() {
|
|
cd $parent;
|
|
rm -rf $home;
|
|
}
|
|
debugging() {
|
|
case $(basename "$ZIPFILE" .zip) in
|
|
*-debugging)
|
|
ui_print " " "Creating debugging archive in zip directory...";
|
|
$bb tar -czvf "$DIR/anykernel3-$(date +%Y-%m-%d_%H%M%S)-debug.tgz" $parent/*;
|
|
;;
|
|
esac;
|
|
}
|
|
is_mounted() { $bb mount | $bb grep " $1 "; }
|
|
unmount_all() {
|
|
($bb umount /system;
|
|
if [ -d /system_root -a ! -f /system/build.prop ]; then
|
|
$bb umount /system_root;
|
|
fi;
|
|
$bb umount /system;
|
|
$bb umount /vendor;
|
|
$bb umount /data) 2>/dev/null;
|
|
}
|
|
abort() {
|
|
ui_print "$*";
|
|
debugging;
|
|
if [ ! -f anykernel.sh -o "$(file_getprop anykernel.sh do.cleanuponabort 2>/dev/null)" == 1 ]; then
|
|
cleanup;
|
|
fi;
|
|
unmount_all;
|
|
exit 1;
|
|
}
|
|
|
|
show_progress 1.34 4;
|
|
ui_print " ";
|
|
cleanup;
|
|
mkdir -p $home/bin;
|
|
cd $home;
|
|
unzip -o "$ZIPFILE";
|
|
if [ $? != 0 -o ! "$(ls tools)" ]; then
|
|
abort "Unzip failed. Aborting...";
|
|
fi;
|
|
bb=$home/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
|
|
while IFS='' read -r line || $bb [[ -n "$line" ]]; do
|
|
ui_print "$line";
|
|
done < banner;
|
|
ui_print " " " ";
|
|
fi;
|
|
|
|
ui_print "$(file_getprop anykernel.sh kernel.string)";
|
|
if [ -f version ]; then
|
|
ui_print " ";
|
|
while IFS='' read -r line || $bb [[ -n "$line" ]]; do
|
|
ui_print "$line";
|
|
done < version;
|
|
ui_print " ";
|
|
fi;
|
|
ui_print " " "AnyKernel3 by osm0sis @ xda-developers" " " " ";
|
|
|
|
unmount_all;
|
|
if [ ! "$(is_mounted /system)" ]; then
|
|
$bb mount -o ro -t auto /system;
|
|
fi;
|
|
($bb mount -o ro -t auto /vendor;
|
|
$bb mount /data) 2>/dev/null;
|
|
if [ -f /system/system/build.prop ]; then
|
|
$bb umount /system;
|
|
($bb umount /system;
|
|
mkdir /system_root) 2>/dev/null;
|
|
$bb mount -o ro -t auto /dev/block/bootdevice/by-name/system /system_root;
|
|
$bb mount -o bind /system_root/system /system;
|
|
fi;
|
|
savedpath="$LD_LIBRARY_PATH";
|
|
savedpre="$LD_PRELOAD";
|
|
unset LD_LIBRARY_PATH;
|
|
unset LD_PRELOAD;
|
|
|
|
if [ ! "$(getprop 2>/dev/null)" ]; then
|
|
getprop() {
|
|
local propval="$(file_getprop /default.prop $1 2>/dev/null)";
|
|
test "$propval" || local propval="$(file_getprop /system/build.prop $1 2>/dev/null)";
|
|
test "$propval" && echo "$propval" || echo "";
|
|
}
|
|
elif [ ! "$(getprop ro.product.device 2>/dev/null)" -a ! "$(getprop ro.build.product 2>/dev/null)" ]; then
|
|
getprop() {
|
|
($(which getprop) | $bb grep "$1" | $bb cut -d[ -f3 | $bb cut -d] -f1) 2>/dev/null;
|
|
}
|
|
fi;
|
|
|
|
if [ "$(file_getprop anykernel.sh do.devicecheck)" == 1 ]; then
|
|
ui_print "Checking device...";
|
|
device="$(getprop ro.product.device)";
|
|
product="$(getprop ro.build.product)";
|
|
for testname in $(file_getprop anykernel.sh 'device.name.*'); do
|
|
if [ "$device" == "$testname" -o "$product" == "$testname" ]; then
|
|
ui_print "$testname";
|
|
match=1;
|
|
break;
|
|
fi;
|
|
done;
|
|
ui_print " ";
|
|
if [ ! "$match" ]; then
|
|
abort "Unsupported device. Aborting...";
|
|
fi;
|
|
fi;
|
|
|
|
supported_ver="$(file_getprop anykernel.sh supported.versions | $bb tr -d '[:space:]')";
|
|
if [ "$supported_ver" ]; then
|
|
ui_print "Checking Android version...";
|
|
android_ver="$(file_getprop /system/build.prop ro.build.version.release)";
|
|
if [ "$(echo $supported_ver | $bb grep -)" ]; then
|
|
lo_ver=$(echo $supported_ver | $bb cut -d- -f1);
|
|
hi_ver=$(echo $supported_ver | $bb cut -d- -f2);
|
|
if [ "$(echo -e "$(int2ver $hi_ver)\n$(int2ver $lo_ver)\n$(int2ver $android_ver)" | $bb sort -g | $bb grep -n "$(int2ver $android_ver)" | $bb grep '^2:')" ]; then
|
|
supported=1;
|
|
fi;
|
|
else
|
|
for ver in $(echo $supported_ver | $bb sed 's;,; ;g'); do
|
|
if [ "$(int2ver $ver)" == "$(int2ver $android_ver)" ]; then
|
|
supported=1;
|
|
break;
|
|
fi;
|
|
done;
|
|
fi;
|
|
if [ "$supported" ]; then
|
|
ui_print "$android_ver" " ";
|
|
else
|
|
ui_print " ";
|
|
abort "Unsupported Android version. Aborting...";
|
|
fi;
|
|
fi;
|
|
|
|
ui_print "Installing...";
|
|
core=$($bb grep -oE 'ak.*core.sh' anykernel.sh);
|
|
test -f tools/$core || $bb ln -s $home/tools/ak*-core.sh $home/tools/$core;
|
|
PATH="$home/bin:$PATH" home=$home $bb ash anykernel.sh $2;
|
|
if [ $? != 0 ]; then
|
|
abort;
|
|
fi;
|
|
|
|
if [ "$(file_getprop anykernel.sh do.modules)" == 1 ]; then
|
|
ui_print " " "Pushing modules...";
|
|
$bb mount -o rw,remount -t auto /system;
|
|
$bb mount -o rw,remount -t auto /vendor 2>/dev/null;
|
|
cd $home/modules;
|
|
for module in $(find . -name '*.ko'); do
|
|
modtarget=$(echo $module | $bb cut -c2-);
|
|
if [ ! -e $modtarget ]; then
|
|
case $module in
|
|
*/vendor/*) modcon=vendor;;
|
|
*) modcon=system;;
|
|
esac;
|
|
fi;
|
|
if [ "$(is_mounted $modtarget)" ]; then
|
|
$bb mount -o rw,remount -t auto $modtarget;
|
|
fi;
|
|
mkdir -p $(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;
|
|
cd $home;
|
|
$bb mount -o ro,remount -t auto /system;
|
|
$bb mount -o ro,remount -t auto /vendor 2>/dev/null;
|
|
fi;
|
|
|
|
debugging;
|
|
|
|
if [ "$(file_getprop anykernel.sh do.cleanup)" == 1 ]; then
|
|
cleanup;
|
|
fi;
|
|
|
|
test "$savedpath" && export LD_LIBRARY_PATH="$savedpath";
|
|
test "$savedpre" && export LD_PRELOAD="$savedpre";
|
|
|
|
unmount_all;
|
|
|
|
ui_print " " " " "Done!";
|