From d81e180869aa038941740d701a019da26723ea17 Mon Sep 17 00:00:00 2001 From: osm0sis Date: Sun, 9 Aug 2026 22:13:39 -0300 Subject: [PATCH] AK3: allow unpacking only specific vendor_ramdisk cpio - introduce unpack_vendorrd to allow only unpacking a specific VNDRBOOT v4+ sub-ramdisk - repack_ramdisk repacks any found unpacked VNDRBOOT v4+ sub-ramdisk and leaves others untouched --- tools/ak3-core.sh | 85 +++++++++++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 32 deletions(-) diff --git a/tools/ak3-core.sh b/tools/ak3-core.sh index 43baccb..a48d79a 100755 --- a/tools/ak3-core.sh +++ b/tools/ak3-core.sh @@ -142,7 +142,49 @@ split_boot() { cd $AKHOME; } -# unpack_ramdisk (extract ramdisk only) +# unpack_vendorrd +unpack_vendorrd() { + local comp cpio vndrname; + + cd $SPLITIMG; + if [ -f "$1" ]; then + cpio=$1; + vndrname=$(basename $cpio .cpio); + else + case $1 in + platform) vndrname=ramdisk;; + *) vndrname=$1;; + esac; + if [ -f "vendor_ramdisk/$vndrname.cpio" ]; then + cpio=vendor_ramdisk/$vndrname.cpio; + fi; + fi; + + comp=$(magiskboot decompress $cpio 2>&1 | grep -v 'raw' | sed -n 's;.*\[\(.*\)\];\1;p'); + if [ "$comp" ]; then + mv -f $cpio $cpio.$comp; + magiskboot decompress $cpio.$comp $cpio; + if [ $? != 0 ] && $comp --help 2>/dev/null; then + echo "Attempting $cpio unpack with busybox $comp..." >&2; + $comp -dc $cpio.$comp > $cpio; + fi; + fi; + + mkdir -p $VENDORRD/$vndrname; + chmod 755 $VENDORRD/$vndrname; + + cd $VENDORRD/$vndrname; + EXTRACT_UNSAFE_SYMLINKS=1 cpio -d -F $SPLITIMG/$cpio -i; + if [ $? != 0 -o ! "$(ls)" ]; then + abort "Unpacking vendor ramdisk \"$vndrname\" failed. Aborting..."; + fi; + if [ -d "$AKHOME/vrdtmp/$vndrname" ]; then + cp -af $AKHOME/vrdtmp/$vndrname/* .; + fi; + cd $VENDORRD; +} + +# unpack_ramdisk (extract all ramdisks only) unpack_ramdisk() { local comp cpio vndrname; @@ -181,32 +223,9 @@ unpack_ramdisk() { fi; elif [ -d vendor_ramdisk ]; then [ -d $VENDORRD ] && mv -f $VENDORRD $AKHOME/vrdtmp; - for cpio in vendor_ramdisk/*.cpio; do - comp=$(magiskboot decompress $cpio 2>&1 | grep -v 'raw' | sed -n 's;.*\[\(.*\)\];\1;p'); - if [ "$comp" ]; then - mv -f $cpio $cpio.$comp; - magiskboot decompress $cpio.$comp $cpio; - if [ $? != 0 ] && $comp --help 2>/dev/null; then - echo "Attempting $cpio unpack with busybox $comp..." >&2; - $comp -dc $cpio.$comp > $cpio; - fi; - fi; - - vndrname=$(basename $cpio .cpio); - mkdir -p $VENDORRD/$vndrname; - chmod 755 $VENDORRD/$vndrname; - - cd $VENDORRD/$vndrname; - EXTRACT_UNSAFE_SYMLINKS=1 cpio -d -F $SPLITIMG/$cpio -i; - if [ $? != 0 -o ! "$(ls)" ]; then - abort "Unpacking vendor ramdisk \"$vndrname\" failed. Aborting..."; - fi; - if [ -d "$AKHOME/vrdtmp/$vndrname" ]; then - cp -af $AKHOME/vrdtmp/$vndrname/* .; - fi; + unpack_vendorrd $cpio; done; - cd $VENDORRD; else abort "No ramdisk found to unpack. Aborting..."; fi; @@ -220,7 +239,7 @@ dump_boot() { ### ### write_boot functions: -# repack_ramdisk (repack ramdisk only) +# repack_ramdisk (repack all ramdisks only) repack_ramdisk() { local comp packfail vndrname cpio mtktype; @@ -250,13 +269,15 @@ repack_ramdisk() { elif [ -d $SPLITIMG/vendor_ramdisk ]; then cd $VENDORRD; for vndrname in *; do - if [ -f "$BIN/mkbootfs" ]; then - mkbootfs $vndrname > $AKHOME/$vndrname-new.cpio; - else - cd $VENDORRD/$vndrname; - find . | cpio -H newc -o > $AKHOME/$vndrname-new.cpio; + if [ -d "$VENDORRD/$vndrname" ]; then + if [ -f "$BIN/mkbootfs" ]; then + mkbootfs $vndrname > $AKHOME/$vndrname-new.cpio; + else + cd $VENDORRD/$vndrname; + find . | cpio -H newc -o > $AKHOME/$vndrname-new.cpio; + fi; + [ $? != 0 ] && packfail=1; fi; - [ $? != 0 ] && packfail=1; done; fi;