Initial commit

Co-authored-by: Chris Renshaw <osm0sis@outlook.com>
This commit is contained in:
Sanju0910
2023-08-18 15:52:08 +05:30
commit bb8da508c2
11 changed files with 1566 additions and 0 deletions

195
LICENSE Executable file
View File

@@ -0,0 +1,195 @@
## AnyKernel3 (AK3), and AnyKernel2/AnyKernel 2.0 (AK2) Scripts License:
AnyKernel (versions 2.0/2 and later) Android image modifying scripts.
Copyright (c) 2019 Chris Renshaw (osm0sis @ xda-developers),
and additional contributors per readily available commit history/credits.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted (subject to the limitations in the disclaimer
below) provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
## Included Binary Licenses:
magiskboot, magiskpolicy (Magisk): GPLv3+
Magisk, including all git submodules are free software:
you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation,
either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Per Section 6(d), official compiled binaries from unmodified source:
https://github.com/topjohnwu/Magisk
busybox: GPLv2
BusyBox is distributed under version 2 of the General Public
License. Version 2 is the only version of this license which this
version of BusyBox (or modified versions derived from this one) may
be distributed under.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Per Section 3(b), self-compiled binary from modified source:
https://git.busybox.net/busybox/
https://github.com/osm0sis/android-busybox-ndk
(pre-patched source tree used to build available upon request)
## Optional Binary Licenses:
mkbootfs, mkbootimg: Apache License 2.0
mkmtkhdr: Apache License 2.0, implied (AOSP mkbootimg derived)
boot_signer*.jar: Apache License 2.0
Copyright (c) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Source not required, however, respective sources are provided:
https://github.com/osm0sis/mkbootfs
https://github.com/osm0sis/mkbootimg
https://github.com/osm0sis/mkmtkhdr
https://android.googlesource.com/platform/system/extras/+/master
flash_erase, nanddump, nandwrite (mtd-utils): GPLv2
dumpimage, mkimage (U-Boot): GPLv2+
mboot: GPLv2 (Intel mboot.py derived)
Copyright their respective authors, (linked below).
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Per Section 3(b), self-compiled binaries from unmodified respective sources:
http://git.infradead.org/mtd-utils.git
https://gitlab.denx.de/u-boot/u-boot
https://github.com/osm0sis/mboot
futility: BSD 3-Clause License (Chromium OS)
unpackelf, elftool: BSD 3-Clause License, implied (Sony mkelf.py derived)
Copyright their respective authors, (linked below).
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Source not required, however, respective sources are provided:
https://github.com/osm0sis/futility
https://github.com/osm0sis/unpackelf
https://github.com/osm0sis/elftool
(https://github.com/sonyxperiadev/device-sony-lt26/tree/master/tools)
rkcrc: BSD 2-Clause License
Copyright (c) 2010, 2011 Fukaumi Naoki
Copyright (c) 2013 Ivo van Poorten
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Source not required, however, respective source is provided:
https://github.com/linux-rockchip/rkflashtool
## Additional Build Scripts for Listed Binaries (where used):
osm0sis' Odds and Ends Thread - Knowledge Base:
https://forum.xda-developers.com/showthread.php?p=53554719

4
META-INF/com/android/metadata Executable file
View File

@@ -0,0 +1,4 @@
post-build=Xiaomi/aosp_violet/violet:10/QQ1B.200105.004/e096ccb016:userdebug/release-keys
post-sdk-level=29
post-security-patch-level=2020-01-01
pre-device=violet

View File

@@ -0,0 +1,509 @@
#!/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 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
rm -f $1;
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;
setup_mountpoint /apex;
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 .apex);
[ "$dest" == /apex/com.android.runtime.release ] && dest=/apex/com.android.runtime;
$BB mkdir -p $dest;
case $apex in
*.apex)
$BB unzip -qo $apex apex_payload.img -d /apex;
$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;
($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;
export ANDROID_RUNTIME_ROOT=/apex/com.android.runtime;
export ANDROID_TZDATA_ROOT=/apex/com.android.tzdata;
export BOOTCLASSPATH=/apex/com.android.runtime/javalib/core-oj.jar:/apex/com.android.runtime/javalib/core-libart.jar:/apex/com.android.runtime/javalib/okhttp.jar:/apex/com.android.runtime/javalib/bouncycastle.jar:/apex/com.android.runtime/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/android.test.base.jar:/system/framework/telephony-ext.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.media/javalib/updatable-media.jar;
}
umount_apex() {
[ -d /apex ] || return 1;
local dest loop;
for dest in $($BB find /apex -type d -mindepth 1 -maxdepth 1); do
if [ -f $dest.img ]; then
loop=$($BB mount | $BB grep $dest | $BB cut -d\ -f1);
fi;
($BB umount -l $dest;
$BB losetup -d $loop) 2>/dev/null;
done;
$BB rm -rf /apex 2>/dev/null;
unset ANDROID_RUNTIME_ROOT ANDROID_TZDATA_ROOT BOOTCLASSPATH;
}
mount_all() {
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;
($BB mount -o ro -t auto /vendor;
$BB mount -o ro -t auto /product;
$BB mount -o ro -t auto /persist) 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;
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;
if [ -d /dev/block/mapper ]; then
[ -e /dev/block/mapper/system ] || local slot=$(find_slot);
$BB mount -o ro -t auto /dev/block/mapper/vendor$slot /vendor;
$BB mount -o ro -t auto /dev/block/mapper/product$slot /product 2>/dev/null;
$BB mount -o ro -t auto /dev/block/mapper/system$slot /system_root;
else
[ -e /dev/block/bootdevice/by-name/system ] || local slot=$(find_slot);
($BB mount -o ro -t auto /dev/block/bootdevice/by-name/vendor$slot /vendor;
$BB mount -o ro -t auto /dev/block/bootdevice/by-name/product$slot /product;
$BB mount -o ro -t auto /dev/block/bootdevice/by-name/persist$slot /persist) 2>/dev/null;
$BB mount -o ro -t auto /dev/block/bootdevice/by-name/system$slot /system_root;
fi;
fi;
;;
esac;
if is_mounted /system_root; then
mount_apex;
if [ -f /system_root/build.prop ]; then
$BB mount -o bind /system_root /system;
else
$BB mount -o bind /system_root/system /system;
fi;
fi;
}
umount_all() {
local mount;
(if [ ! -d /postinstall/tmp ]; then
$BB umount /system;
$BB umount -l /system;
if [ -e /system_root ]; then
$BB umount /system_root;
$BB umount -l /system_root;
fi;
fi;
umount_apex;
umount /vendor; # busybox umount /vendor breaks recovery on some devices
umount -l /vendor;
for mount in /mnt/system /mnt/vendor /product /mnt/product /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 /odm /product; 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;
umount_all;
[ -L /etc_link ] && $BB rm -rf /etc/*;
(for dir in /apex /system /system_root /etc; 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 $(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 " ";
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
sleep 2;
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...";
sleep 2;
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 $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() {
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() {
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/split_img/.magisk ]; then
umask=$(umask);
umask 022;
moddir=/data/adb/modules/ak3-helper;
rm -rf $moddir;
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;
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 $(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;
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;
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)";
KERNEL_VERSION_STRING="$(file_getprop anykernel.sh kernel.version.string)";
VERSION_STRING="$(file_getprop anykernel.sh version.string)";
MAINTAINER_STRING="$(file_getprop anykernel.sh maintainer.string)";
ui_print "=========================================";
ui_print "$KERNEL_STRING $VERSION_STRING";
ui_print "=========================================";
ui_print "Based on Linux Kernel KERNEL_VERSION_STRING";
ui_print "=========================================";
ui_print "Maintained by $MAINTAINER_STRING";
ui_print "Sanju0910@github.com ";
ui_print "=========================================";
ui_print "Powered by";
ui_print "AnyKernel3 by Chris Renshaw";
ui_print "osm0sis@github.com";
ui_print "=========================================";
if [ -f version ]; then
ui_print " ";
ui_printfile version;
ui_print " ";
fi;
setup_env;
do_devicecheck;
do_versioncheck;
do_levelcheck;
ui_print "=========================================";
ui_print "Installing NeverSettle Kernel...";
ui_print "=========================================";
ui_print " ";
ui_print "- Active boot slot: ";
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;
sleep 3;
do_modules;
debugging;
restore_env;
if [ "$(file_getprop anykernel.sh do.cleanup)" == 1 ]; then
cleanup;
fi;
ui_print " ";
ui_print "=========================================";
ui_print "NeverSettle Kernel installation suceeded!";
ui_print "=========================================";

View File

@@ -0,0 +1,2 @@
#FLASHAFTERUPDATEV2
# Dummy file; update-binary is a shell script.

82
anykernel.sh Executable file
View File

@@ -0,0 +1,82 @@
# AnyKernel3 Ramdisk Mod Script
# osm0sis @ xda-developers
## AnyKernel setup
# begin properties
properties() { '
kernel.string=NeverSettle Kernel
version.string=
maintainer.string=Sreeshankar K
do.devicecheck=1
do.modules=0
do.systemless=0
do.cleanup=1
do.cleanuponabort=0
device.name1=avicii
device.name2=Nord
device.name3=OnePlusNord
device.name4=OnePlus Nord
device.name5=
supported.versions=13
supported.patchlevels=
'; } # 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 install
dump_boot;
if mountpoint -q /data; then
# Optimize F2FS extension list (@arter97)
for list_path in $(find /sys/fs/f2fs* -name extension_list); do
ui_print " "
ui_print "- Optimizing F2FS extension list"
echo "Updating extension list: $list_path"
echo "Clearing extension list"
hot_count="$(grep -n 'hot file extens' $list_path | cut -d':' -f1)"
list_len="$(cat $list_path | wc -l)"
cold_count="$((list_len - hot_count))"
cold_list="$(head -n$((hot_count - 1)) $list_path | grep -v ':')"
hot_list="$(tail -n$cold_count $list_path)"
for ext in $cold_list; do
[ ! -z $ext ] && echo "[c]!$ext" > $list_path
done
for ext in $hot_list; do
[ ! -z $ext ] && echo "[h]!$ext" > $list_path
done
echo "Writing new extension list"
for ext in $(cat $home/f2fs-cold.list | grep -v '#'); do
[ ! -z $ext ] && echo "[c]$ext" > $list_path
done
for ext in $(cat $home/f2fs-hot.list); do
[ ! -z $ext ] && echo "[h]$ext" > $list_path
done
done
fi
#patch fstab for mounting data partition
patch_fstab /vendor/etc/fstab.qcom /data f2fs options "fsync_mode=nobarrier" "fsync_mode=posix,atgc,background_gc=sync"
#patch fstab for system partion
patch_fstab /vendor/etc/fstab.qcom / ext4 options "barrier=1" "nobarrier,i_version"
write_boot;
## end install

BIN
dtb.img Executable file

Binary file not shown.

BIN
dtbo.img Executable file

Binary file not shown.

774
tools/ak3-core.sh Executable file
View File

@@ -0,0 +1,774 @@
### 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" | 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-zImage kernel.gz;
mv -f boot.img-ramdisk.cpio.gz 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
echo "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
echo "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
echo "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 $home --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..."
comp=$($bin/magiskboot decompress kernel 2>&1 | grep -v 'raw' | sed -n 's;.*\[\(.*\)\];\1;p');
($bin/magiskboot split $kernel || $bin/magiskboot decompress $kernel kernel) 2>/dev/null;
if [ $? != 0 -a "$comp" ]; 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 'Linux version.*#' > $home/vertmp;
fi;
if [ "$comp" ]; then
$bin/magiskboot compress=$comp kernel kernel.$comp;
if [ $? != 0 ]; 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;
;;
esac;
case $ramdisk_compression in
none|cpio) nocompflag="-n";;
esac;
$bin/magiskboot repack $nocompflag $bootimg $home/boot-new.img;
fi;
if [ $? != 0 ]; then
abort "Repacking image failed. Aborting...";
fi;
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 boot 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_dtbo (flash dtbo only)
flash_dtbo() {
local i dtbo dtboblock;
cd $home;
for i in dtbo dtbo.img; do
if [ -f $i ]; then
dtbo=$i;
break;
fi;
done;
if [ "$dtbo" ]; then
dtboblock=/dev/block/bootdevice/by-name/dtbo$slot;
if [ ! -e "$dtboblock" ]; then
abort "dtbo partition could not be found. Aborting...";
fi;
blockdev --setrw $dtboblock 2>/dev/null;
if [ -f "$bin/flash_erase" -a -f "$bin/nandwrite" ]; then
$bin/flash_erase $dtboblock 0 0;
$bin/nandwrite -p $dtboblock $dtbo;
elif [ "$customdd" ]; then
dd if=/dev/zero of=$dtboblock 2>/dev/null;
dd if=$dtbo of=$dtboblock;
else
cat $dtbo /dev/zero > $dtboblock 2>/dev/null || true;
fi;
if [ $? != 0 ]; then
abort "Flashing dtbo failed. Aborting...";
fi;
fi;
}
### write_boot (repack ramdisk then build, sign and write image and dtbo)
write_boot() {
repack_ramdisk;
flash_boot;
flash_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 "$2" $1 | head -n1 | 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 "$2" $1 | head -n1 | 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 "$4" $1 | head -n1 | 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 "$4" $1 | head -n1 | 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" $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 "^$2=" $1 | head -n1 | 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 "$dev" $file | head -n1 | 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
rm -rf $current/ramdisk;
for i in $bootimg boot-new.img; do
[ -e $i ] && cp -af $i $current;
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;
setup_ak;
}
# setup_ak
setup_ak() {
local blockfiles parttype name part mtdmount mtdpart mtdname target;
# 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 -p $blockfiles;
fi;
touch $blockfiles/current;
fi;
# 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 boot slot. Aborting...";
fi;
;;
esac;
# 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)
case $block in
boot) parttype="ramdisk boot BOOT LNX android_boot bootimg KERN-A kernel KERNEL";;
recovery) parttype="ramdisk_recovery recovery RECOVERY SOS android_recovery";;
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;

BIN
tools/busybox Executable file

Binary file not shown.

BIN
tools/magiskboot Executable file

Binary file not shown.

BIN
tools/magiskpolicy Executable file

Binary file not shown.