-
-
Save sandorex/031c006cc9f705c3640bad8d5b9d66d2 to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| # build-gsi.sh - https://gist.github.com/sandorex/031c006cc9f705c3640bad8d5b9d66d2 | |
| # other files needed: | |
| # otatools-mini - https://mega.nz/file/TLgHDD6L#Kwxb04VoJDtXa6XLHxsxbHAIusXc0VHM12dqAbvRWlQ | |
| # vbmeta.img - https://mega.nz/file/HGoGzC5J#VZUJ6n_GVCaGRzgaO2up0FhFx52swhcO0T6ewlUW5Mk | |
| # | |
| # Copyright 2023 Aleksandar Radivojevic (https://github.com/sandorex) | |
| # | |
| # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and | |
| # associated documentation files (the "Software"), to deal in the Software without restriction, | |
| # including without limitation the rights to use, copy, modify, merge, publish, distribute, | |
| # sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is | |
| # furnished to do so, subject to the following conditions: | |
| # | |
| # The above copyright notice and this permission notice shall be included in all copies or substantial | |
| # portions of the Software. | |
| # | |
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT | |
| # NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
| # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
| # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT | |
| # OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| # | |
| # Version 1.0.5 | |
| set -e | |
| SDIR=$(dirname "$(realpath "$0")") | |
| FIRMWARE_AP=$1 | |
| GSI_IMAGE=$2 | |
| OTATOOLS="$SDIR"/otatools-mini | |
| BUILD_DIR="$PWD"/build | |
| BUILD_GSI_DIR="$BUILD_DIR"/gsi | |
| CLEAN_VBMETA="$SDIR"/vbmeta.img | |
| OUTPUT_FILE=AP_CUSTOM | |
| extra_info() { | |
| echo "The script saves almost all files so you can re run it with different GSI and it will be a lot faster" | |
| echo | |
| echo "To flash the GSI put the resulting file in odin AP and use original firmware's BL and CSC the do factory reset in recovery" | |
| } | |
| usage() { | |
| echo "Usage: $0 <AP.tar.md5> <GSI.img> [<super image size in bytes>]" | |
| echo "[WARNING]: DO NOT CHANGE THE FIRMWARE AP FILE WITHOUT DELETEDING THE BUILD FOLDER" | |
| echo | |
| echo "This script requires following dependencies: lz4 tar md5sum" | |
| echo | |
| extra_info | |
| echo | |
| } | |
| [[ -z "$GSI_IMAGE" ]] && usage && exit 1 | |
| [[ -z "$FIRMWARE_AP" ]] && usage && exit 1 | |
| # get absolute paths | |
| FIRMWARE_AP=$(realpath "$FIRMWARE_AP") | |
| GSI_IMAGE=$(realpath "$GSI_IMAGE") | |
| # check if all utilities are installed | |
| ( hash lz4 && hash tar && hash md5sum ) || (echo "Please install the dependenices" && exit 1) | |
| [ -d "$BUILD_DIR" ] && echo ":: [WARNING]: Build directory already exists, if you changed the firmware delete build directory and restart!" | |
| mkdir -p "$BUILD_DIR" | |
| mkdir -p "$BUILD_GSI_DIR" | |
| cd "$BUILD_DIR" | |
| echo ":: Extracting firmware AP" | |
| tar --skip-old-files -xvf "$FIRMWARE_AP" | |
| echo ":: Uncompressing super image" | |
| [[ ! -f super.img ]] && lz4 super.img.lz4 super.img | |
| echo ":: Running simg2img" | |
| [[ ! -f super.ext4.img ]] && "$OTATOOLS"/simg2img super.img super.ext4.img | |
| echo ":: Unpacking super image" | |
| [[ ! -f odm.img ]] && "$OTATOOLS"/lpunpack super.ext4.img | |
| echo ":: Getting size of partitions" | |
| ORIG_SUPER_SIZE=$(stat -c '%s' super.ext4.img) | |
| ODM_SIZE=$(stat -c '%s' odm.img) | |
| PRODUCT_SIZE=$(stat -c '%s' product.img) | |
| SYSTEM_SIZE=$(stat -c '%s' system.img) | |
| GSI_SIZE=$(stat -c '%s' "$GSI_IMAGE") | |
| VENDOR_SIZE=$(stat -c '%s' vendor.img) | |
| SUM_SIZE=`expr $ODM_SIZE + $PRODUCT_SIZE + $GSI_SIZE + $VENDOR_SIZE` | |
| SUPER_OUT_SIZE=${3:-$ORIG_SUPER_SIZE} | |
| echo "SUPER: $ORIG_SUPER_SIZE" | |
| echo "ODM: $ODM_SIZE" | |
| echo "PRODUCT: $PRODUCT_SIZE" | |
| echo "SYSTEM: $SYSTEM_SIZE" | |
| echo "GSI: $GSI_SIZE" | |
| echo "VENDOR: $VENDOR_SIZE" | |
| echo | |
| echo "SUM: $SUM_SIZE" | |
| echo "OUT: $SUPER_OUT_SIZE" | |
| if [[ "$SUPER_OUT_SIZE" -le "$SUM_SIZE" ]]; then | |
| echo ":: ERROR: Output image is bigger than original super image, rerun the script with correct super image size" | |
| exit 1 | |
| fi | |
| # build in seperate directory so there is kinda a caching system | |
| cd "$BUILD_GSI_DIR" | |
| echo ":: Repacking super image" | |
| "$OTATOOLS"/lpmake --metadata-size 65536 \ | |
| --super-name super \ | |
| --metadata-slots 2 \ | |
| --device super:$SUPER_OUT_SIZE \ | |
| --group main:$SUM_SIZE \ | |
| --partition odm:readonly:$ODM_SIZE:main \ | |
| --image odm=../odm.img \ | |
| --partition product:readonly:$PRODUCT_SIZE:main \ | |
| --image product=../product.img \ | |
| --partition system:readonly:$GSI_SIZE:main \ | |
| --image system="$GSI_IMAGE" \ | |
| --partition vendor:readonly:$VENDOR_SIZE:main \ | |
| --image vendor=../vendor.img \ | |
| --sparse \ | |
| --output ./super.img | |
| echo ":: Compressing super image" | |
| lz4 -f -B6 --content-size ./super.img super.img.lz4 | |
| # get back one level | |
| cd "$BUILD_DIR" | |
| echo ":: Copying clean vbmeta image" | |
| [[ ! -f vbmeta.img.lz4 ]] && cp "$CLEAN_VBMETA" ./ | |
| echo ":: Compresing clean vbmeta image" | |
| [[ ! -f vbmeta.img.lz4 ]] && lz4 -B6 --content-size ./vbmeta.img vbmeta.img.lz4 | |
| echo ":: Compresing the tar file" | |
| # NOTE: filtering out the original super.img.lz4 so i can speed up the rebuild by keeping it | |
| tar --create \ | |
| --format=gnu \ | |
| -b20 \ | |
| --quoting-style=escape \ | |
| --owner=0 \ | |
| --group=0 \ | |
| --totals \ | |
| --mode=644 \ | |
| -f "$OUTPUT_FILE".tar \ | |
| -C "$BUILD_GSI_DIR" super.img.lz4 \ | |
| --exclude super.img.lz4 \ | |
| -C "$BUILD_DIR" *.lz4 | |
| echo ":: Adding checksum to the tar file" | |
| md5sum -t "$OUTPUT_FILE".tar >> "$OUTPUT_FILE".tar | |
| echo ":: Renaming the tar file file" | |
| mv "$OUTPUT_FILE".tar "$SDIR"/"$OUTPUT_FILE".tar.md5 | |
| echo ":: Successfully created '${OUTPUT_FILE}.tar.md5'" | |
| echo | |
| extra_info | |
| echo | |
| echo "You can delete the build directory now" | |
| echo |
From the bottom of my heart, THANK. YOU.
Why, lord why, was it virtually impossible to find any sane method of installing GSI's to Samsung devices that actually WORKED? I have wasted SO many hours trying to repackage GSI .img files for Odin, because the /system partition on the Galaxy Tab A9+ SM-X210 isn't mounted/writable on TWRP/OrangeFox)
I've tried (and miserably failed) at making super.img files for TWRP/OrangeFox using https://github.com/Mizumo-prjkt/super-patch and https://github.com/Takumi123x/rou to no avail.
This script worked perfectly to integrate Andy Yan's LineageOS builds into an AP file, though I think my issues with the resulting install have to do with the GSI and the tablet, not with your script
https://sourceforge.net/projects/andyyan-gsi/files/lineage-21-td/
Again, thank you so much!!!
thank you so much.