Files
anykernel3-rhode/tools/ak2-core.sh
T
osm0sis befe258b96 AK2: repair unpackelf support on repeat dirty flashes
- 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)
2017-02-27 17:25:29 -04:00

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