- on Sony devices supporting standard boot.img on unloacked bootloaders first AK2 flash would convert from ELF to boot.img, but second flash would attempt to use unpackelf again and fail, so fallback to unpackbootimg - requires updated unpackelf binary for Sony ELF devices (see: https://github.com/osm0sis/unpackelf)
275 lines
8.8 KiB
Bash
Executable File
275 lines
8.8 KiB
Bash
Executable File
## AnyKernel methods (DO NOT CHANGE)
|
|
# set up extracted files and directories
|
|
ramdisk=/tmp/anykernel/ramdisk;
|
|
bin=/tmp/anykernel/tools;
|
|
split_img=/tmp/anykernel/split_img;
|
|
patch=/tmp/anykernel/patch;
|
|
|
|
chmod -R 755 $bin;
|
|
mkdir -p $ramdisk $split_img;
|
|
|
|
if [ "$is_slot_device" == 1 ]; then
|
|
slot=$(getprop ro.boot.slot_suffix 2>/dev/null);
|
|
test ! "$slot" && slot=$(grep -o 'androidboot.slot_suffix=.*$' /proc/cmdline | cut -d\ -f1 | cut -d= -f2);
|
|
test "$slot" && block=$block$slot;
|
|
if [ $? != 0 -o ! -e "$block" ]; then
|
|
ui_print " "; ui_print "Unable to determine active boot slot. Aborting..."; exit 1;
|
|
fi;
|
|
fi;
|
|
|
|
OUTFD=/proc/self/fd/$1;
|
|
|
|
# ui_print <text>
|
|
ui_print() { echo -e "ui_print $1\nui_print" > $OUTFD; }
|
|
|
|
# contains <string> <substring>
|
|
contains() { test "${1#*$2}" != "$1" && return 0 || return 1; }
|
|
|
|
# dump boot and extract ramdisk
|
|
dump_boot() {
|
|
if [ -f "$bin/nanddump" ]; then
|
|
$bin/nanddump -f /tmp/anykernel/boot.img $block;
|
|
else
|
|
dd if=$block of=/tmp/anykernel/boot.img;
|
|
fi;
|
|
if [ -f "$bin/unpackelf" -a "$($bin/unpackelf -i /tmp/anykernel/boot.img -h -q; echo $?)" != 0 ]; then
|
|
$bin/unpackelf -i /tmp/anykernel/boot.img -o $split_img;
|
|
mv -f $split_img/boot.img-ramdisk.cpio.gz $split_img/boot.img-ramdisk.gz;
|
|
else
|
|
$bin/unpackbootimg -i /tmp/anykernel/boot.img -o $split_img;
|
|
fi;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "Dumping/splitting image failed. Aborting..."; exit 1;
|
|
fi;
|
|
if [ -f "$bin/mkmtkhdr" ]; then
|
|
dd bs=512 skip=1 conv=notrunc if=$split_img/boot.img-ramdisk.gz of=$split_img/temprd;
|
|
mv -f $split_img/temprd $split_img/boot.img-ramdisk.gz;
|
|
fi;
|
|
if [ -f "$bin/unpackelf" -a -f "$split_img/boot.img-dtb" ]; then
|
|
case $(od -ta -An -N4 $split_img/boot.img-dtb | sed -e 's/del //' -e 's/ //g') in
|
|
QCDT|ELF) ;;
|
|
*) gzip $split_img/boot.img-zImage;
|
|
mv -f $split_img/boot.img-zImage.gz $split_img/boot.img-zImage;
|
|
cat $split_img/boot.img-dtb >> $split_img/boot.img-zImage;
|
|
rm -f $split_img/boot.img-dtb;;
|
|
esac;
|
|
fi;
|
|
mv -f $ramdisk /tmp/anykernel/rdtmp;
|
|
mkdir -p $ramdisk;
|
|
cd $ramdisk;
|
|
gunzip -c $split_img/boot.img-ramdisk.gz | cpio -i;
|
|
if [ $? != 0 -o -z "$(ls $ramdisk)" ]; then
|
|
ui_print " "; ui_print "Unpacking ramdisk failed. Aborting..."; exit 1;
|
|
fi;
|
|
cp -af /tmp/anykernel/rdtmp/* $ramdisk;
|
|
}
|
|
|
|
# repack ramdisk then build and write image
|
|
write_boot() {
|
|
cd $split_img;
|
|
if [ -f *-cmdline ]; then
|
|
cmdline=`cat *-cmdline`;
|
|
fi;
|
|
if [ -f *-board ]; then
|
|
board=`cat *-board`;
|
|
fi;
|
|
base=`cat *-base`;
|
|
pagesize=`cat *-pagesize`;
|
|
kerneloff=`cat *-kerneloff`;
|
|
ramdiskoff=`cat *-ramdiskoff`;
|
|
if [ -f *-tagsoff ]; then
|
|
tagsoff=`cat *-tagsoff`;
|
|
fi;
|
|
if [ -f *-osversion ]; then
|
|
osver=`cat *-osversion`;
|
|
fi;
|
|
if [ -f *-oslevel ]; then
|
|
oslvl=`cat *-oslevel`;
|
|
fi;
|
|
if [ -f *-second ]; then
|
|
second=`ls *-second`;
|
|
second="--second $split_img/$second";
|
|
secondoff=`cat *-secondoff`;
|
|
secondoff="--second_offset $secondoff";
|
|
fi;
|
|
for i in zImage zImage-dtb Image.gz Image Image-dtb 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 /tmp/anykernel/$i ]; then
|
|
kernel=/tmp/anykernel/$i;
|
|
break;
|
|
fi;
|
|
done;
|
|
if [ ! "$kernel" ]; then
|
|
kernel=`ls *-zImage`;
|
|
kernel=$split_img/$kernel;
|
|
fi;
|
|
if [ -f /tmp/anykernel/dtb ]; then
|
|
dtb="--dt /tmp/anykernel/dtb";
|
|
elif [ -f *-dtb ]; then
|
|
dtb=`ls *-dtb`;
|
|
dtb="--dt $split_img/$dtb";
|
|
fi;
|
|
if [ -f "$bin/mkbootfs" ]; then
|
|
$bin/mkbootfs /tmp/anykernel/ramdisk | gzip > /tmp/anykernel/ramdisk-new.cpio.gz;
|
|
else
|
|
cd $ramdisk;
|
|
find . | cpio -H newc -o | gzip > /tmp/anykernel/ramdisk-new.cpio.gz;
|
|
fi;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "Repacking ramdisk failed. Aborting..."; exit 1;
|
|
fi;
|
|
cd /tmp/anykernel;
|
|
if [ -f "$bin/mkmtkhdr" ]; then
|
|
$bin/mkmtkhdr --rootfs ramdisk-new.cpio.gz;
|
|
mv -f ramdisk-new.cpio.gz-mtk ramdisk-new.cpio.gz;
|
|
case $kernel in
|
|
$split_img/*) ;;
|
|
*) $bin/mkmtkhdr --kernel $kernel; kernel=$kernel-mtk;;
|
|
esac;
|
|
fi;
|
|
$bin/mkbootimg --kernel $kernel --ramdisk ramdisk-new.cpio.gz $second --cmdline "$cmdline" --board "$board" --base $base --pagesize $pagesize --kernel_offset $kerneloff --ramdisk_offset $ramdiskoff $secondoff --tags_offset "$tagsoff" --os_version "$osver" --os_patch_level "$oslvl" $dtb --output boot-new.img;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "Repacking image failed. Aborting..."; exit 1;
|
|
elif [ `wc -c < boot-new.img` -gt `wc -c < boot.img` ]; then
|
|
ui_print " "; ui_print "New image larger than boot partition. Aborting..."; exit 1;
|
|
fi;
|
|
if [ -f "$bin/futility" -a -d "$bin/chromeos" ]; then
|
|
$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;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "Signing image failed. Aborting..."; exit 1;
|
|
fi;
|
|
mv -f boot-new-signed.img boot-new.img;
|
|
fi;
|
|
if [ -f "/data/custom_boot_image_patch.sh" ]; then
|
|
ash /data/custom_boot_image_patch.sh /tmp/anykernel/boot-new.img;
|
|
if [ $? != 0 ]; then
|
|
ui_print " "; ui_print "User script execution failed. Aborting..."; exit 1;
|
|
fi;
|
|
fi;
|
|
if [ -f "$bin/flash_erase" -a -f "$bin/nandwrite" ]; then
|
|
$bin/flash_erase $block 0 0;
|
|
$bin/nandwrite -p $block /tmp/anykernel/boot-new.img;
|
|
else
|
|
dd if=/dev/zero of=$block;
|
|
dd if=/tmp/anykernel/boot-new.img of=$block;
|
|
fi;
|
|
}
|
|
|
|
# backup_file <file>
|
|
backup_file() { test ! -f $1~ && cp $1 $1~; }
|
|
|
|
# replace_string <file> <if search string> <original string> <replacement string>
|
|
replace_string() {
|
|
if [ -z "$(grep "$2" $1)" ]; then
|
|
sed -i "s;${3};${4};" $1;
|
|
fi;
|
|
}
|
|
|
|
# replace_section <file> <begin search string> <end search string> <replacement string>
|
|
replace_section() {
|
|
begin=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
|
|
for end in `grep -n "$3" $1 | cut -d: -f1`; do
|
|
if [ "$begin" -lt "$end" ]; then
|
|
sed -i "/${2//\//\\/}/,/${3//\//\\/}/d" $1;
|
|
sed -i "${begin}s;^;${4}\n;" $1;
|
|
break;
|
|
fi;
|
|
done;
|
|
}
|
|
|
|
# remove_section <file> <begin search string> <end search string>
|
|
remove_section() {
|
|
begin=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
|
|
for end in `grep -n "$3" $1 | cut -d: -f1`; do
|
|
if [ "$begin" -lt "$end" ]; then
|
|
sed -i "/${2//\//\\/}/,/${3//\//\\/}/d" $1;
|
|
break;
|
|
fi;
|
|
done;
|
|
}
|
|
|
|
# insert_line <file> <if search string> <before|after> <line match string> <inserted line>
|
|
insert_line() {
|
|
if [ -z "$(grep "$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 [ "$(wc -l $1 | cut -d\ -f1)" -le "$line" ]; then
|
|
echo "$5" >> $1;
|
|
else
|
|
sed -i "${line}s;^;${5}\n;" $1;
|
|
fi;
|
|
fi;
|
|
}
|
|
|
|
# replace_line <file> <line replace string> <replacement line>
|
|
replace_line() {
|
|
if [ ! -z "$(grep "$2" $1)" ]; then
|
|
line=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
|
|
sed -i "${line}s;.*;${3};" $1;
|
|
fi;
|
|
}
|
|
|
|
# remove_line <file> <line match string>
|
|
remove_line() {
|
|
if [ ! -z "$(grep "$2" $1)" ]; then
|
|
line=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
|
|
sed -i "${line}d" $1;
|
|
fi;
|
|
}
|
|
|
|
# prepend_file <file> <if search string> <patch file>
|
|
prepend_file() {
|
|
if [ -z "$(grep "$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() {
|
|
if [ -z "$(grep "$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 [ -z "$(grep "$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() {
|
|
entry=$(grep "$2" $1 | grep "$3");
|
|
if [ -z "$(echo "$entry" | grep "$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;
|
|
newentry=$(echo "$entry" | sed "s;${part};${6};");
|
|
sed -i "s;${entry};${newentry};" $1;
|
|
fi;
|
|
}
|
|
|
|
## end methods
|
|
|