evolinx-beryllium/aik/repackimg.sh
Hilledkinged e8bc1251a7 Initial Evolinx beryllium bootimage creator
// About this first creator
* Features automated bootimage creation for ebbg and tianma panels
* Creates custom ramdisk with its own init system to boot over into sdcard rootfs
* Includes some firmware blobs for ramdisk ( such as gpu, wlan and etc taht gets loaded initially )

// TODO
* Create automated rootfs flasher that can be used with twrp
2024-03-05 14:57:25 +02:00

413 lines
13 KiB
Bash
Executable File

#!/bin/bash
# AIK-Linux/repackimg: repack ramdisk and build image
# osm0sis @ xda-developers
abort() { echo "Error!"; }
case $1 in
--help) echo "usage: repackimg.sh [--local] [--original] [--origsize] [--level <0-9>] [--avbkey <name>] [--forceelf]"; exit 1;
esac;
case $(uname -s) in
Darwin|Macintosh)
plat="macos";
readlink() { perl -MCwd -e 'print Cwd::abs_path shift' "$2"; }
;;
*) plat="linux";;
esac;
arch=$plat/`uname -m`;
aik="${BASH_SOURCE:-$0}";
aik="$(dirname "$(readlink -f "$aik")")";
bin="$aik/bin";
cur="$(readlink -f "$PWD")";
case $plat in
macos)
cpio="env DYLD_LIBRARY_PATH="$bin/$arch" "$bin/$arch/cpio"";
statarg="-f %Su";
dd() { DYLD_LIBRARY_PATH="$bin/$arch" "$bin/$arch/dd" "$@"; }
lzop() { DYLD_LIBRARY_PATH="$bin/$arch" "$bin/$arch/lzop" "$@"; }
truncate() { DYLD_LIBRARY_PATH="$bin/$arch" "$bin/$arch/truncate" "$@"; }
xz() { DYLD_LIBRARY_PATH="$bin/$arch" "$bin/$arch/xz" "$@"; }
javaver=$(java -version 2>&1 | head -n1 | cut -d\" -f2);
javamaj=$(echo $javaver | cut -d. -f1);
javamin=$(echo $javaver | cut -d. -f2);
if [ "$javamaj" -lt 9 ] && [ "$javamaj" -eq 1 -a "$javamin" -lt 8 ]; then
java() { "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java" "$@"; }
fi;
;;
linux)
cpio=cpio;
[ "$(cpio --version | head -n1 | rev | cut -d\ -f1 | rev)" = "2.13" ] && cpiowarning=1;
statarg="-c %U";
;;
esac;
case $1 in
--local) shift;;
*) cd "$aik";;
esac;
chmod -R 755 "$bin" "$aik/"*.sh;
chmod 644 "$bin/magic" "$bin/androidbootimg.magic" "$bin/boot_signer.jar" "$bin/avb/"* "$bin/chromeos/"*;
if [ -z "$(ls split_img/* 2>/dev/null)" -o ! -e ramdisk ]; then
echo "No files found to be packed/built.";
abort;
exit 1;
fi;
while [ "$1" ]; do
case $1 in
--original) original=1;;
--origsize) origsize=1;;
--forceelf) repackelf=1;;
--level)
case $2 in
''|*[!0-9]*) ;;
*) level="-$2"; lvltxt=" - Level: $2"; shift;;
esac;
;;
--avbkey)
if [ "$2" ]; then
for keytest in "$2" "$cur/$2" "$aik/$2"; do
if [ ! -z "$(ls $keytest.pk8 2>/dev/null)" -a ! -z "$(ls $keytest.x509.* 2>/dev/null)" ]; then
avbkey="$keytest"; avbtxt=" - Key: $2"; shift; break;
fi;
done;
fi;
;;
esac;
shift;
done;
ramdiskcomp=`cat split_img/*-*ramdiskcomp 2>/dev/null`;
if [ -z "$(ls ramdisk/* 2>/dev/null)" ] && [ ! "$ramdiskcomp" = "empty" -a ! "$original" ]; then
echo "No files found to be packed/built.";
abort;
exit 1;
fi;
clear;
echo " ";
echo "Android Image Kitchen - RepackImg Script";
echo "by osm0sis @ xda-developers";
echo " ";
if [ ! -z "$(ls *-new.* 2>/dev/null)" ]; then
echo "Warning: Overwriting existing files!";
echo " ";
fi;
rm -f "*-new.*";
if [ -d ramdisk ] && [ "$(stat $statarg ramdisk | head -n 1)" = "root" ]; then
sudo=sudo; sumsg=" (as root)";
else
cpioarg="-R 0:0";
fi;
if [ "$original" ]; then
echo "Repacking with original ramdisk...";
elif [ "$ramdiskcomp" = "empty" ]; then
echo "Warning: Using empty ramdisk for repack!";
compext=.empty;
touch ramdisk-new.cpio$compext;
else
echo "Packing ramdisk$sumsg...";
echo " ";
if [ "$cpiowarning" ]; then
echo "Warning: Using cpio 2.13 may result in an unusable repack; downgrade to 2.12 to be safe!";
echo " ";
fi;
if [ -z "$level" ]; then
case $ramdiskcomp in
xz) level=-1;;
lz4*) level=-9;;
esac;
fi;
echo "Using compression: $ramdiskcomp$lvltxt";
repackcmd="$ramdiskcomp $level";
compext=$ramdiskcomp;
case $ramdiskcomp in
gzip) compext=gz;;
lzop) compext=lzo;;
xz) repackcmd="xz $level -Ccrc32";;
lzma) repackcmd="xz $level -Flzma";;
bzip2) compext=bz2;;
lz4) repackcmd="$bin/$arch/lz4 $level";;
lz4-l) repackcmd="$bin/$arch/lz4 $level -l"; compext=lz4;;
cpio) repackcmd="cat"; compext="";;
*) abort; exit 1;;
esac;
if [ "$compext" ]; then
compext=.$compext;
fi;
cd ramdisk;
$sudo find . | $sudo $cpio $cpioarg -H newc -o 2>/dev/null | $repackcmd > ../ramdisk-new.cpio$compext;
if [ ! $? -eq "0" ]; then
abort;
exit 1;
fi;
cd ..;
fi;
echo " ";
echo "Getting build information...";
cd split_img;
imgtype=`cat *-imgtype`;
case $imgtype in
KRNL) ;;
AOSP_VNDR) vendor=vendor_;;
*)
if [ -f *-kernel ]; then
kernel=`ls *-kernel`; echo "kernel = $kernel";
kernel="split_img/$kernel";
fi;
;;
esac;
if [ "$original" ]; then
ramdisk=`ls *-*ramdisk.cpio*`; echo "${vendor}ramdisk = $ramdisk";
ramdisk="split_img/$ramdisk";
else
ramdisk="ramdisk-new.cpio$compext";
fi;
case $imgtype in
KRNL) rsz=$(wc -c < ../"$ramdisk"); echo "ramdisk_size = $rsz";;
OSIP) echo "cmdline = $(cat *-*cmdline)";;
U-Boot)
name=`cat *-name`; echo "name = $name";
uarch=`cat *-arch`;
os=`cat *-os`;
type=`cat *-type`;
comp=`cat *-comp`; echo "type = $uarch $os $type ($comp)";
[ "$comp" = "uncompressed" ] && comp=none;
addr=`cat *-addr`; echo "load_addr = $addr";
ep=`cat *-ep`; echo "entry_point = $ep";
;;
*)
if [ -f *-second ]; then
second=`ls *-second`; echo "second = $second";
second=(--second "split_img/$second");
fi;
if [ -f *-dtb ]; then
dtb=`ls *-dtb`; echo "dtb = $dtb";
dtb=(--dtb "split_img/$dtb");
fi;
if [ -f *-recovery_dtbo ]; then
recoverydtbo=`ls *-recovery_dtbo`; echo "recovery_dtbo = $recoverydtbo";
recoverydtbo=(--recovery_dtbo "split_img/$recoverydtbo");
fi;
if [ -f *-*cmdline ]; then
cmdname=`ls *-*cmdline`;
cmdline=`cat *-*cmdline`; echo "${vendor}cmdline = $cmdline";
cmd=("split_img/$cmdname"@cmdline);
fi;
if [ -f *-board ]; then
board=`cat *-board`; echo "board = $board";
fi;
if [ -f *-base ]; then
base=`cat *-base`; echo "base = $base";
fi;
if [ -f *-pagesize ]; then
pagesize=`cat *-pagesize`; echo "pagesize = $pagesize";
fi;
if [ -f *-kernel_offset ]; then
kerneloff=`cat *-kernel_offset`; echo "kernel_offset = $kerneloff";
fi;
if [ -f *-ramdisk_offset ]; then
ramdiskoff=`cat *-ramdisk_offset`; echo "ramdisk_offset = $ramdiskoff";
fi;
if [ -f *-second_offset ]; then
secondoff=`cat *-second_offset`; echo "second_offset = $secondoff";
fi;
if [ -f *-tags_offset ]; then
tagsoff=`cat *-tags_offset`; echo "tags_offset = $tagsoff";
fi;
if [ -f *-dtb_offset ]; then
dtboff=`cat *-dtb_offset`; echo "dtb_offset = $dtboff";
fi;
if [ -f *-os_version ]; then
osver=`cat *-os_version`; echo "os_version = $osver";
fi;
if [ -f *-os_patch_level ]; then
oslvl=`cat *-os_patch_level`; echo "os_patch_level = $oslvl";
fi;
if [ -f *-header_version ]; then
hdrver=`cat *-header_version`; echo "header_version = $hdrver";
fi;
if [ -f *-hashtype ]; then
hashtype=`cat *-hashtype`; echo "hashtype = $hashtype";
hashtype="--hashtype $hashtype";
fi;
if [ -f *-dt ]; then
dttype=`cat *-dttype`;
dt=`ls *-dt`; echo "dt = $dt";
rpm=("split_img/$dt",rpm);
dt=(--dt "split_img/$dt");
fi;
if [ -f *-unknown ]; then
unknown=`cat *-unknown`; echo "unknown = $unknown";
fi;
if [ -f *-header ]; then
header=`ls *-header`;
header="split_img/$header";
fi;
;;
esac;
cd ..;
if [ -f split_img/*-mtktype ]; then
mtktype=`cat split_img/*-mtktype`;
echo " ";
echo "Generating MTK headers...";
echo " ";
echo "Using ramdisk type: $mtktype";
"$bin/$arch/mkmtkhdr" --kernel "$kernel" --$mtktype "$ramdisk" >/dev/null;
if [ ! $? -eq "0" ]; then
abort;
exit 1;
fi;
mv -f "$(basename "$kernel")-mtk" kernel-new.mtk;
mv -f "$(basename "$ramdisk")-mtk" $mtktype-new.mtk;
kernel=kernel-new.mtk;
ramdisk=$mtktype-new.mtk;
fi;
if [ -f split_img/*-sigtype ]; then
outname=unsigned-new.img;
else
outname=image-new.img;
fi;
[ "$dttype" = "ELF" ] && repackelf=1;
if [ "$imgtype" = "ELF" ] && [ ! "$header" -o ! "$repackelf" ]; then
imgtype=AOSP;
echo " ";
echo "Warning: ELF format without RPM detected; will be repacked using AOSP format!";
fi;
echo " ";
echo "Building image...";
echo " ";
echo "Using format: $imgtype";
echo " ";
case $imgtype in
AOSP_VNDR) "$bin/$arch/mkbootimg" --vendor_ramdisk "$ramdisk" "${dtb[@]}" --vendor_cmdline "$cmdline" --board "$board" --base $base --pagesize $pagesize --kernel_offset $kerneloff --ramdisk_offset $ramdiskoff --tags_offset $tagsoff --dtb_offset $dtboff --os_version "$osver" --os_patch_level "$oslvl" --header_version $hdrver --vendor_boot $outname;;
AOSP) "$bin/$arch/mkbootimg" --kernel "$kernel" --ramdisk "$ramdisk" "${second[@]}" "${dtb[@]}" "${recoverydtbo[@]}" --cmdline "$cmdline" --board "$board" --base $base --pagesize $pagesize --kernel_offset $kerneloff --ramdisk_offset $ramdiskoff --second_offset "$secondoff" --tags_offset "$tagsoff" --dtb_offset "$dtboff" --os_version "$osver" --os_patch_level "$oslvl" --header_version "$hdrver" $hashtype "${dt[@]}" -o $outname;;
AOSP-PXA) "$bin/$arch/pxa-mkbootimg" --kernel "$kernel" --ramdisk "$ramdisk" "${second[@]}" --cmdline "$cmdline" --board "$board" --base $base --pagesize $pagesize --kernel_offset $kerneloff --ramdisk_offset $ramdiskoff --second_offset "$secondoff" --tags_offset "$tagsoff" --unknown $unknown "${dt[@]}" -o $outname;;
ELF) "$bin/$arch/elftool" pack -o $outname header="$header" "$kernel" "$ramdisk",ramdisk "${rpm[@]}" "${cmd[@]}" >/dev/null;;
KRNL) "$bin/$arch/rkcrc" -k "$ramdisk" $outname;;
OSIP)
mkdir split_img/.temp 2>/dev/null;
for i in bootstub cmdline.txt hdr kernel parameter sig; do
cp -f split_img/*-*$(basename $i .txt | sed -e 's/hdr/header/') split_img/.temp/$i 2>/dev/null;
done;
cp -f "$ramdisk" split_img/.temp/ramdisk.cpio.gz;
"$bin/$arch/mboot" -d split_img/.temp -f $outname;
;;
U-Boot)
part0="$kernel";
case $type in
Multi) part1=(:"$ramdisk");;
RAMDisk) part0="$ramdisk";;
esac;
"$bin/$arch/mkimage" -A $uarch -O $os -T $type -C $comp -a $addr -e $ep -n "$name" -d "$part0""${part1[@]}" $outname >/dev/null;
;;
*) echo " "; echo "Unsupported format."; abort; exit 1;;
esac;
if [ ! $? -eq "0" ]; then
abort;
exit 1;
fi;
rm -rf split_img/.temp;
if [ -f split_img/*-sigtype ]; then
sigtype=`cat split_img/*-sigtype`;
if [ -f split_img/*-avbtype ]; then
avbtype=`cat split_img/*-avbtype`;
fi;
if [ -f split_img/*-blobtype ]; then
blobtype=`cat split_img/*-blobtype`;
fi;
echo "Signing new image...";
echo " ";
echo "Using signature: $sigtype $avbtype$avbtxt$blobtype";
[ ! "$avbkey" ] && avbkey="$bin/avb/verity";
echo " ";
case $sigtype in
AVBv1) java -jar "$bin/boot_signer.jar" /$avbtype unsigned-new.img "$avbkey.pk8" "$avbkey.x509."* image-new.img 2>/dev/null;;
BLOB)
awk 'BEGIN { printf "-SIGNED-BY-SIGNBLOB-\00\00\00\00\00\00\00\00" }' > image-new.img;
"$bin/$arch/blobpack" blob.tmp $blobtype unsigned-new.img >/dev/null;
cat blob.tmp >> image-new.img;
rm -f blob.tmp;
;;
CHROMEOS) "$bin/$arch/futility" vbutil_kernel --pack image-new.img --keyblock "$bin/chromeos/kernel.keyblock" --signprivate "$bin/chromeos/kernel_data_key.vbprivk" --version 1 --vmlinuz unsigned-new.img --bootloader "$bin/chromeos/empty" --config "$bin/chromeos/empty" --arch arm --flags 0x1;;
DHTB)
"$bin/$arch/dhtbsign" -i unsigned-new.img -o image-new.img >/dev/null;
rm -f split_img/*-tailtype 2>/dev/null;
;;
NOOK*) cat split_img/*-master_boot.key unsigned-new.img > image-new.img;;
esac;
if [ ! $? -eq "0" ]; then
abort;
exit 1;
fi;
fi;
if [ -f split_img/*-lokitype ]; then
lokitype=`cat split_img/*-lokitype`;
echo "Loki patching new image...";
echo " ";
echo "Using type: $lokitype";
echo " ";
mv -f image-new.img unlokied-new.img;
if [ -f aboot.img ]; then
"$bin/$arch/loki_tool" patch $lokitype aboot.img unlokied-new.img image-new.img >/dev/null;
if [ ! $? -eq "0" ]; then
echo "Patching failed.";
abort;
exit 1;
fi;
else
echo "Device aboot.img required in script directory to find Loki patch offset.";
abort;
exit 1;
fi;
elif [ -f split_img/*-microloader.bin ]; then
echo "Amonet patching new image...";
echo " ";
cp -f image-new.img unamonet-new.img;
cp -f split_img/*-microloader.bin microloader.tmp;
dd bs=1024 count=1 conv=notrunc if=unamonet-new.img of=head.tmp 2>/dev/null;
dd bs=1024 seek=1 conv=notrunc if=head.tmp of=image-new.img 2>/dev/null;
dd conv=notrunc if=microloader.tmp of=image-new.img 2>/dev/null;
rm -f head.tmp microloader.tmp;
fi;
if [ -f split_img/*-tailtype ]; then
tailtype=`cat split_img/*-tailtype`;
echo "Appending footer...";
echo " ";
echo "Using type: $tailtype";
echo " ";
case $tailtype in
Bump) awk 'BEGIN { printf "\x41\xA9\xE4\x67\x74\x4D\x1D\x1B\xA4\x29\xF2\xEC\xEA\x65\x52\x79" }' >> image-new.img;;
SEAndroid) printf 'SEANDROIDENFORCE' >> image-new.img;;
esac;
fi;
if [ "$origsize" -a -f split_img/*-origsize ]; then
filesize=`cat split_img/*-origsize`;
echo "Padding to original size...";
echo " ";
cp -f image-new.img unpadded-new.img;
truncate -s $filesize image-new.img;
fi;
echo "Done!";
exit 0;