195
LICENSE
Executable file
195
LICENSE
Executable 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
4
META-INF/com/android/metadata
Executable 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
|
||||||
509
META-INF/com/google/android/update-binary
Executable file
509
META-INF/com/google/android/update-binary
Executable 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 "=========================================";
|
||||||
2
META-INF/com/google/android/updater-script
Executable file
2
META-INF/com/google/android/updater-script
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
#FLASHAFTERUPDATEV2
|
||||||
|
# Dummy file; update-binary is a shell script.
|
||||||
82
anykernel.sh
Executable file
82
anykernel.sh
Executable 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
|
||||||
|
|
||||||
774
tools/ak3-core.sh
Executable file
774
tools/ak3-core.sh
Executable 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
BIN
tools/busybox
Executable file
Binary file not shown.
BIN
tools/magiskboot
Executable file
BIN
tools/magiskboot
Executable file
Binary file not shown.
BIN
tools/magiskpolicy
Executable file
BIN
tools/magiskpolicy
Executable file
Binary file not shown.
Reference in New Issue
Block a user