- loops would fail only in LOS Recovery from direct mount .img and losetup .img+loop mount with, e.g. "mount: mounting /dev/block/loop0 on /apex/com.android.adbd failed: Invalid argument" - this started ~LOS19, I believe, though I haven't tracked down the specific change yet - confusing to diagnose, since it always works in recovery adb shell, until I realized there was a context difference: "su" for adb shell and "recovery" for zip flashes - switch shell context temporarily to "su" to do apex mounts, then return to original context (currently only necessary for mounting loops)
520 lines
16 KiB
Bash
Executable File
520 lines
16 KiB
Bash
Executable File
#!/sbin/sh
|
|
# AnyKernel3 Backend (DO NOT CHANGE)
|
|
# osm0sis @ xda-developers
|
|
|
|
export OUTFD=$2;
|
|
export 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");
|
|
[ $DIR == "/sideload" ] && DIR=/tmp;
|
|
|
|
[ -d /postinstall/tmp ] && POSTINSTALL=/postinstall;
|
|
[ "$AKHOME" ] || export AKHOME=$POSTINSTALL/tmp/anykernel;
|
|
[ "$ANDROID_ROOT" ] || ANDROID_ROOT=/system;
|
|
|
|
ui_print() {
|
|
until [ ! "$1" ]; do
|
|
echo "ui_print $1
|
|
ui_print" >> /proc/self/fd/$OUTFD;
|
|
shift;
|
|
done;
|
|
}
|
|
ui_printfile() {
|
|
local line losrpad;
|
|
$BOOTMODE || [ -e /twres ] || losrpad='| '; # work around LOS Recovery eating leading whitespace
|
|
while IFS='' read -r line || [[ -n "$line" ]]; do
|
|
ui_print "$losrpad$line";
|
|
done < $1;
|
|
}
|
|
show_progress() { echo "progress $1 $2" >> /proc/self/fd/$OUTFD; }
|
|
file_getprop() { grep "^$2=" "$1" | tail -n1 | cut -d= -f2-; }
|
|
find_slot() {
|
|
local 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;
|
|
[ "$slot" == "normal" ] && unset slot;
|
|
[ "$slot" ] && echo "$slot";
|
|
}
|
|
setup_mountpoint() {
|
|
[ -L $1 ] && mv -f $1 ${1}_link;
|
|
if [ ! -d $1 ]; then
|
|
rm -f $1;
|
|
mkdir -p $1;
|
|
fi;
|
|
}
|
|
is_mounted() { mount | grep -q " $1 "; }
|
|
mount_apex() {
|
|
[ -d /system_root/system/apex ] || return 1;
|
|
local apex dest loop minorx num shcon var;
|
|
setup_mountpoint /apex;
|
|
mount -t tmpfs tmpfs /apex -o mode=755 && touch /apex/apextmp;
|
|
shcon=$(cat /proc/self/attr/current);
|
|
echo "u:r:su:s0" > /proc/self/attr/current; # work around LOS Recovery not allowing loop mounts in recovery context
|
|
minorx=1;
|
|
[ -e /dev/block/loop1 ] && minorx=$(ls -l /dev/block/loop1 | awk '{ print $6 }');
|
|
num=0;
|
|
for apex in /system_root/system/apex/*; do
|
|
dest=/apex/$(basename $apex | sed -E -e 's;\.apex$|\.capex$;;' -e 's;\.current$|\.release$;;');
|
|
mkdir -p $dest;
|
|
case $apex in
|
|
*.apex|*.capex)
|
|
unzip -qo $apex original_apex -d /apex;
|
|
[ -f /apex/original_apex ] && apex=/apex/original_apex;
|
|
unzip -qo $apex apex_payload.img -d /apex;
|
|
mv -f /apex/original_apex $dest.apex 2>/dev/null;
|
|
mv -f /apex/apex_payload.img $dest.img;
|
|
mount -t ext4 -o ro,noatime $dest.img $dest 2>/dev/null && echo "$dest (direct)" >&2;
|
|
if [ $? != 0 ]; then
|
|
while [ $num -lt 64 ]; do
|
|
loop=/dev/block/loop$num;
|
|
[ -e $loop ] || mknod $loop b 7 $((num * minorx));
|
|
losetup $loop $dest.img 2>/dev/null;
|
|
num=$((num + 1));
|
|
losetup $loop | grep -q $dest.img && break;
|
|
done;
|
|
mount -t ext4 -o ro,loop,noatime $loop $dest && echo "$dest (loop)" >&2;
|
|
if [ $? != 0 ]; then
|
|
losetup -d $loop 2>/dev/null;
|
|
if [ $num -eq 64 -a $(losetup -f) == "/dev/block/loop0" ]; then
|
|
echo "Aborting apex mounts due to broken environment..." >&2;
|
|
break;
|
|
fi;
|
|
fi;
|
|
fi;
|
|
;;
|
|
*) mount -o bind $apex $dest && echo "$dest (bind)" >&2;;
|
|
esac;
|
|
done;
|
|
echo "$shcon" > /proc/self/attr/current;
|
|
for var in $(grep -o 'export .* /.*' /system_root/init.environ.rc | awk '{ print $2 }'); do
|
|
eval OLD_${var}=\$$var;
|
|
done;
|
|
$(grep -o 'export .* /.*' /system_root/init.environ.rc | sed 's; /;=/;'); unset export;
|
|
touch /apex/apexak3;
|
|
}
|
|
umount_apex() {
|
|
[ -f /apex/apexak3 ] || return 1;
|
|
echo "Unmounting apex..." >&2;
|
|
local dest loop var;
|
|
for var in $(grep -o 'export .* /.*' /system_root/init.environ.rc 2>/dev/null | 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 $(find /apex -type d -mindepth 1 -maxdepth 1); do
|
|
loop=$(mount | grep $dest | grep loop | cut -d\ -f1);
|
|
umount -l $dest;
|
|
losetup $loop >/dev/null 2>&1 && losetup -d $loop;
|
|
done;
|
|
[ -f /apex/apextmp ] && umount /apex;
|
|
rm -rf /apex/apexak3 /apex 2>/dev/null;
|
|
}
|
|
mount_all() {
|
|
local byname mount slot system;
|
|
echo "Mounting..." >&2;
|
|
byname=bootdevice/by-name;
|
|
[ -d /dev/block/$byname ] || byname=$(find /dev/block/platform -type d -name by-name 2>/dev/null | head -n1 | cut -d/ -f4-);
|
|
[ -e /dev/block/$byname/super -a -d /dev/block/mapper ] && byname=mapper;
|
|
[ -e /dev/block/$byname/system ] || slot=$(find_slot);
|
|
for mount in /cache /data /metadata /persist; do
|
|
if ! is_mounted $mount; then
|
|
mount $mount 2>/dev/null && echo "$mount (fstab)" >&2 && UMOUNTLIST="$UMOUNTLIST $mount";
|
|
if [ $? != 0 -a -e /dev/block/$byname$mount ]; then
|
|
setup_mountpoint $mount;
|
|
mount -o ro -t auto /dev/block/$byname$mount $mount && echo "$mount (direct)" >&2 && UMOUNTLIST="$UMOUNTLIST $mount";
|
|
fi;
|
|
fi;
|
|
done;
|
|
setup_mountpoint $ANDROID_ROOT;
|
|
if ! is_mounted $ANDROID_ROOT; then
|
|
mount -o ro -t auto $ANDROID_ROOT 2>/dev/null && echo "$ANDROID_ROOT (\$ANDROID_ROOT)" >&2;
|
|
fi;
|
|
case $ANDROID_ROOT in
|
|
/system_root) setup_mountpoint /system;;
|
|
/system)
|
|
if ! is_mounted /system && ! is_mounted /system_root; then
|
|
setup_mountpoint /system_root;
|
|
mount -o ro -t auto /system_root && echo "/system_root (fstab)" >&2;
|
|
elif [ -f /system/system/build.prop ]; then
|
|
setup_mountpoint /system_root;
|
|
mount --move /system /system_root && echo "/system_root (moved)" >&2;
|
|
fi;
|
|
if [ $? != 0 ]; then
|
|
(umount /system;
|
|
umount -l /system) 2>/dev/null;
|
|
mount -o ro -t auto /dev/block/$byname/system$slot /system_root && echo "/system_root (direct)" >&2;
|
|
fi;
|
|
;;
|
|
esac;
|
|
[ -f /system_root/system/build.prop ] && system=/system;
|
|
for mount in /vendor /product /system_ext; do
|
|
mount -o ro -t auto $mount 2>/dev/null && echo "$mount (fstab)" >&2;
|
|
if [ $? != 0 ] && [ -L /system$mount -o -L /system_root$system$mount ]; then
|
|
setup_mountpoint $mount;
|
|
mount -o ro -t auto /dev/block/$byname$mount$slot $mount && echo "$mount (direct)" >&2;
|
|
fi;
|
|
done;
|
|
if is_mounted /system_root; then
|
|
mount_apex;
|
|
mount -o bind /system_root$system /system && echo "/system (bind)" >&2;
|
|
fi;
|
|
echo " " >&2;
|
|
}
|
|
umount_all() {
|
|
local mount;
|
|
echo "Unmounting..." >&2;
|
|
(if [ ! -d /postinstall/tmp ]; then
|
|
umount /system;
|
|
umount -l /system;
|
|
fi) 2>/dev/null;
|
|
umount_apex;
|
|
(if [ ! -d /postinstall/tmp ]; then
|
|
umount /system_root;
|
|
umount -l /system_root;
|
|
fi;
|
|
PATH="$OLD_PATH" umount /vendor; # busybox umount /vendor breaks recovery on some hacky devices
|
|
PATH="$OLD_PATH" umount -l /vendor;
|
|
for mount in /mnt/system /mnt/vendor /product /mnt/product /system_ext /mnt/system_ext $UMOUNTLIST; do
|
|
umount $mount;
|
|
umount -l $mount;
|
|
done) 2>/dev/null;
|
|
}
|
|
setup_env() {
|
|
$BOOTMODE && return 1;
|
|
mount -o bind /dev/urandom /dev/random;
|
|
if [ -L /etc ]; then
|
|
setup_mountpoint /etc;
|
|
cp -af /etc_link/* /etc;
|
|
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 /product/etc /system_ext/etc /odm/etc; 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;
|
|
echo "$propval";
|
|
}
|
|
elif [ ! "$(getprop ro.build.type 2>/dev/null)" ]; then
|
|
getprop() {
|
|
($(which getprop) | grep "$1" | cut -d[ -f3 | 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;
|
|
sleep 1;
|
|
umount_all;
|
|
[ -L /etc_link ] && rm -rf /etc/*;
|
|
(for dir in /etc /apex /system_root /system /vendor /product /system_ext /metadata /persist; do
|
|
if [ -L "${dir}_link" ]; then
|
|
rmdir $dir;
|
|
mv -f ${dir}_link $dir;
|
|
fi;
|
|
done;
|
|
umount -l /dev/random) 2>/dev/null;
|
|
}
|
|
setup_bb() {
|
|
local arch32 bb;
|
|
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;
|
|
}
|
|
debugging() {
|
|
local debug log path;
|
|
case $(basename "$ZIPFILE" .zip) in
|
|
*-debugging) debug=1;;
|
|
esac;
|
|
for path in /tmp /cache /metadata /persist; do
|
|
[ -f $path/.ak3-debugging ] && debug=1;
|
|
done;
|
|
if [ "$debug" ]; then
|
|
ui_print " " "Creating debugging archive in $DIR...";
|
|
[ -f /tmp/recovery.log ] && log=/tmp/recovery.log;
|
|
tar -czf "$DIR/anykernel3-$(date +%Y-%m-%d_%H%M%S)-debug.tgz" $AKHOME $log;
|
|
fi;
|
|
}
|
|
cleanup() {
|
|
cd $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 $(grep '^device.name.*=' anykernel.sh | 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 [ "$1" -eq "$1" ] 2>/dev/null; then
|
|
echo "$1.0.0";
|
|
elif [ ! "$(echo "$1" | 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 | tr -d '[:space:]');
|
|
android_ver=$(file_getprop /system/build.prop ro.build.version.release);
|
|
parsed_ver=$(int2ver $android_ver);
|
|
if echo $supported_ver | grep -q '-'; then
|
|
lo_ver=$(int2ver "$(echo $supported_ver | cut -d- -f1)");
|
|
hi_ver=$(int2ver "$(echo $supported_ver | cut -d- -f2)");
|
|
if echo -e "$hi_ver\n$lo_ver\n$parsed_ver" | sort -g | grep -n "$parsed_ver" | grep -q '^2:'; then
|
|
supported=1;
|
|
fi;
|
|
else
|
|
for ver in $(echo $supported_ver | 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 | 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 | grep -oE '[0-9]{4}-[0-9]{2}');
|
|
if echo $supported_lvl | grep -q '^\-'; then
|
|
lo_lvl=0000-00;
|
|
hi_lvl=$(echo $supported_lvl | awk '{ print $2 }');
|
|
elif echo $supported_lvl | grep -q ' - '; then
|
|
lo_lvl=$(echo $supported_lvl | awk '{ print $1 }');
|
|
hi_lvl=$(echo $supported_lvl | awk '{ print $3 }');
|
|
elif echo $supported_lvl | grep -q '\-$'; then
|
|
lo_lvl=$(echo $supported_lvl | awk '{ print $1 }');
|
|
hi_lvl=9999-99;
|
|
fi;
|
|
if echo -e "$hi_lvl\n$lo_lvl\n$parsed_lvl" | sort -g | grep -n "$parsed_lvl" | grep -q '^2:'; then
|
|
ui_print "$android_lvl" " ";
|
|
else
|
|
abort " " "Unsupported Android security patch level. Aborting...";
|
|
fi;
|
|
}
|
|
dump_moduleinfo() {
|
|
cat <<EOF > $1;
|
|
id=ak3-helper
|
|
name=AK3 Helper Module
|
|
version=$(awk '{ print $3 }' $AKHOME/vertmp) $(grep -oE '#.[0-9]' $AKHOME/vertmp)
|
|
versionCode=1
|
|
author=AnyKernel3
|
|
description=$KERNEL_STRING
|
|
EOF
|
|
}
|
|
dump_moduleremover() {
|
|
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;
|
|
rm -rf $moddir;
|
|
mkdir -p system $moddir;
|
|
(mv -f product system;
|
|
mv -f vendor system) 2>/dev/null;
|
|
cp -rLf * $moddir;
|
|
dump_moduleinfo $moddir/module.prop;
|
|
dump_moduleremover $moddir/post-fs-data.sh;
|
|
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
|
|
blockdev --setrw /dev/block/mapper/$block$slot 2>/dev/null;
|
|
done;
|
|
done;
|
|
fi;
|
|
if [ ! -d /postinstall/tmp ]; then
|
|
mount -o rw,remount -t auto /system;
|
|
(mount -o rw,remount -t auto /vendor;
|
|
mount -o rw,remount -t auto /product) 2>/dev/null;
|
|
fi;
|
|
for module in $(find . -name '*.ko'); do
|
|
modtarget=$POSTINSTALL$(echo $module | cut -c2-);
|
|
if [ ! -e $modtarget ]; then
|
|
case $module in
|
|
*/vendor/*) modcon=vendor;;
|
|
*/product/*) modcon=product;;
|
|
*) modcon=system;;
|
|
esac;
|
|
fi;
|
|
if is_mounted $modtarget; then
|
|
mount -o rw,remount -t auto $modtarget;
|
|
fi;
|
|
mkdir -p $(dirname $modtarget);
|
|
cp -rLf $module $modtarget;
|
|
chown 0:0 $modtarget;
|
|
chmod 644 $modtarget;
|
|
if [ "$modcon" ]; then
|
|
chcon "u:object_r:${modcon}_file:s0" $modtarget;
|
|
fi;
|
|
if is_mounted $modtarget; then
|
|
mount -o ro,remount -t auto $modtarget;
|
|
fi;
|
|
done;
|
|
if [ ! -d /postinstall/tmp ]; then
|
|
mount -o ro,remount -t auto /system;
|
|
(mount -o ro,remount -t auto /vendor;
|
|
mount -o ro,remount -t auto /product) 2>/dev/null;
|
|
fi;
|
|
fi;
|
|
cd $AKHOME;
|
|
}
|
|
|
|
show_progress 1.34 25;
|
|
ui_print " ";
|
|
cleanup;
|
|
mkdir -p $AKHOME/bin;
|
|
cd $AKHOME;
|
|
unzip -o "$ZIPFILE";
|
|
if [ $? != 0 -o ! "$(ls tools)" ]; then
|
|
abort "Unzip failed. Aborting...";
|
|
fi;
|
|
setup_bb;
|
|
if [ $? != 0 -o -z "$(ls bin)" ]; then
|
|
abort "Busybox setup failed. Aborting...";
|
|
fi;
|
|
OLD_PATH="$PATH";
|
|
export PATH="$AKHOME/bin:$AKHOME/tools:$PATH";
|
|
|
|
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" " ";
|
|
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...";
|
|
# hack to maintain support for anykernel.sh files that weren't updated correctly along with the AK core
|
|
CORE=$(grep -oE 'ak.*core.sh' anykernel.sh);
|
|
[ -f tools/$CORE ] || ln -s $AKHOME/tools/ak*-core.sh $AKHOME/tools/$CORE;
|
|
ash anykernel.sh;
|
|
if [ $? != 0 ]; then
|
|
abort;
|
|
fi;
|
|
|
|
do_modules;
|
|
|
|
debugging;
|
|
ui_print " ";
|
|
restore_env;
|
|
|
|
if [ "$(file_getprop anykernel.sh do.cleanup)" == 1 ]; then
|
|
cleanup;
|
|
fi;
|
|
|
|
ui_print " " "Done!";
|
|
export PATH="$OLD_PATH";
|
|
unset OLD_PATH OUTFD ZIPFILE;
|