- ro.vendor.build.product (from #44) doesn't appear to actually exist in nature, so replace it with ro.product.vendor.device for API 28+ devices, per https://github.com/phhusson/vendor_hardware_overlay/issues/25 - no need to check so many props for getprop parsing fallback check, simply look for ro.build.type which all devices should have in antiquity
298 lines
8.3 KiB
Bash
Executable File
298 lines
8.3 KiB
Bash
Executable File
#!/sbin/sh
|
|
# AnyKernel3 Backend (DO NOT CHANGE)
|
|
# osm0sis @ xda-developers
|
|
|
|
OUTFD=/proc/self/fd/$2;
|
|
ZIPFILE="$3";
|
|
|
|
ps | grep zygote | grep -v grep >/dev/null && BOOTMODE=true || BOOTMODE=false;
|
|
$BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -v grep >/dev/null && BOOTMODE=true;
|
|
|
|
$BOOTMODE && DIR=/sdcard || DIR=$(dirname "$ZIPFILE");
|
|
|
|
test "$ANDROID_ROOT" || ANDROID_ROOT=/system;
|
|
test "$home" || home=/tmp/anykernel;
|
|
|
|
ui_print() {
|
|
until [ ! "$1" ]; do
|
|
echo -e "ui_print $1\nui_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 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 $(dirname $home);
|
|
rm -rf $home;
|
|
}
|
|
debugging() {
|
|
case $(basename "$ZIPFILE" .zip) in
|
|
*-debugging)
|
|
ui_print " " "Creating debugging archive in $DIR...";
|
|
test -f /tmp/recovery.log && log=/tmp/recovery.log;
|
|
$bb tar -czf "$DIR/anykernel3-$(date +%Y-%m-%d_%H%M%S)-debug.tgz" $home $log;
|
|
;;
|
|
esac;
|
|
}
|
|
setup_mountpoint() {
|
|
test -L $1 && $bb mv -f $1 ${1}_link;
|
|
if [ ! -d $1 ]; then
|
|
rm -f $1;
|
|
mkdir $1;
|
|
fi;
|
|
}
|
|
is_mounted() { $bb mount | $bb grep -q " $1 "; }
|
|
umount_all() {
|
|
($bb umount /system;
|
|
$bb umount -l /system;
|
|
if [ -e /system_root ]; then
|
|
$bb umount /system_root;
|
|
$bb umount -l /system_root;
|
|
fi;
|
|
umount /vendor;
|
|
umount -l /vendor;
|
|
if [ "$umount_data" ]; then
|
|
$bb umount /data;
|
|
$bb umount -l /data;
|
|
fi) 2>/dev/null;
|
|
}
|
|
restore_env() {
|
|
test "$savedpath" && export LD_LIBRARY_PATH="$savedpath";
|
|
test "$savedpre" && export LD_PRELOAD="$savedpre";
|
|
umount_all;
|
|
($bb mv -f /system_link /system;
|
|
$bb mv -f /system_root_link /system_root;
|
|
$bb umount -l /dev/random) 2>/dev/null;
|
|
}
|
|
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;
|
|
}
|
|
|
|
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;
|
|
for arch32 in x86 arm; do
|
|
if [ -d $home/tools/$arch32 ]; then
|
|
bb=$home/tools/$arch32/busybox;
|
|
chmod 755 $bb;
|
|
$bb >/dev/null 2>&1;
|
|
if [ $? == 0 ]; then
|
|
$bb mv -f $home/tools/$arch32/* $home/tools;
|
|
break;
|
|
fi;
|
|
fi;
|
|
done;
|
|
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
|
|
ui_printfile banner;
|
|
ui_print " " " ";
|
|
fi;
|
|
|
|
ui_print "$(file_getprop anykernel.sh kernel.string)";
|
|
if [ -f version ]; then
|
|
ui_print " ";
|
|
ui_printfile version;
|
|
ui_print " ";
|
|
fi;
|
|
ui_print " " "AnyKernel3 by osm0sis @ xda-developers" " " " ";
|
|
|
|
$BOOTMODE || $bb mount -o bind /dev/urandom /dev/random;
|
|
umount_all;
|
|
setup_mountpoint $ANDROID_ROOT;
|
|
if ! is_mounted $ANDROID_ROOT; then
|
|
$bb mount -o ro -t auto $ANDROID_ROOT;
|
|
fi;
|
|
case $ANDROID_ROOT in
|
|
/system_root) setup_mountpoint /system;;
|
|
/system)
|
|
if [ -f /system/system/build.prop ]; then
|
|
setup_mountpoint /system_root;
|
|
$bb mount --move /system /system_root;
|
|
if [ $? != 0 ]; then
|
|
$bb umount /system;
|
|
$bb umount -l /system 2>/dev/null;
|
|
$bb mount -o ro -t auto /dev/block/bootdevice/by-name/system /system_root;
|
|
fi;
|
|
fi;
|
|
;;
|
|
esac;
|
|
if is_mounted /system_root; then
|
|
$bb mount -o bind /system_root/system /system;
|
|
fi;
|
|
$bb mount -o ro -t auto /vendor 2>/dev/null;
|
|
if ! is_mounted /data; then
|
|
$bb mount /data;
|
|
umount_data=1;
|
|
fi;
|
|
|
|
savedpath="$LD_LIBRARY_PATH";
|
|
savedpre="$LD_PRELOAD";
|
|
unset LD_LIBRARY_PATH;
|
|
unset LD_PRELOAD;
|
|
|
|
if [ ! "$(getprop 2>/dev/null)" ]; then
|
|
getprop() {
|
|
local propdir propfile propval;
|
|
for propdir in / /system_root /system /vendor /odm /product; do
|
|
for propfile in default.prop build.prop; do
|
|
test "$propval" && break 2 || propval="$(file_getprop $propdir/$propfile $1 2>/dev/null)";
|
|
done;
|
|
done;
|
|
test "$propval" && echo "$propval" || echo "";
|
|
}
|
|
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;
|
|
|
|
if [ "$(file_getprop anykernel.sh do.devicecheck)" == 1 ]; then
|
|
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 $(file_getprop anykernel.sh 'device.name.*'); 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;
|
|
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);
|
|
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;
|
|
fi;
|
|
|
|
supported_lvl=$(file_getprop anykernel.sh supported.patchlevels | $bb grep -oE '[0-9]{4}-[0-9]{2}|-');
|
|
if [ "$supported_lvl" ]; then
|
|
ui_print "Checking Android security patch level...";
|
|
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;
|
|
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;
|
|
restore_env;
|
|
|
|
if [ "$(file_getprop anykernel.sh do.cleanup)" == 1 ]; then
|
|
cleanup;
|
|
fi;
|
|
|
|
ui_print " " " " "Done!";
|