Skip to content

Instantly share code, notes, and snippets.

@lkraav
Forked from nemishkor/installgapps.sh
Last active March 12, 2026 07:00
Show Gist options
  • Select an option

  • Save lkraav/8729478217f5b76323f4a768301b3179 to your computer and use it in GitHub Desktop.

Select an option

Save lkraav/8729478217f5b76323f4a768301b3179 to your computer and use it in GitHub Desktop.
Sony 10 III - Dual SIM (arm64) | Sailfish OS 5.0.0.73 | Android 13 | MindTheGapps installation script
#!/bin/bash
set -e
WORKDIR=/home/.appsupport_systemimg_patch
TMPWORKDIR="$WORKDIR/tmp"
SQUASHFS_ROOT="$TMPWORKDIR/squashfs-root"
MOUNT_ROOT="$TMPWORKDIR/systemimg_mount"
SYSTEM_IMG=/opt/appsupport/system.img
ORIG_IMG_FILE=orig_img_path.txt
MINDTHEGAPPS_PATTERN='MindTheGapps-13.0.0-arm64-*.zip'
log() {
printf '%s\n' "$1" > /dev/stderr
}
install_deps() {
if ! rpm -q squashfs-tools > /dev/null; then
log "squashfs-tools package not found. Installing..."
pkcon -y install squashfs-tools
fi
if ! rpm -q rsync > /dev/null; then
log "rsync package not found. Installing..."
pkcon -y install rsync
fi
}
extract_image() {
mkdir "$MOUNT_ROOT"
mount -o loop,ro "$SYSTEM_IMG" "$MOUNT_ROOT"
if [ -f "$MOUNT_ROOT/$ORIG_IMG_FILE" ]; then
orig_image="$(cat "$MOUNT_ROOT/$ORIG_IMG_FILE")"
log "$SYSTEM_IMG already patched, using original from $orig_image"
else
img_md5="$(md5sum "$SYSTEM_IMG" | cut -d ' ' -f1)"
orig_image="$WORKDIR/system.img.$img_md5"
if [ -f "$orig_image" ]; then
log "Backup already exists at $orig_image, skipping copy"
else
cp "$SYSTEM_IMG" "$orig_image"
log "Copying original image $SYSTEM_IMG to $orig_image"
fi
fi
umount "$MOUNT_ROOT"
if [ ! -f "$orig_image" ]; then
log "$orig_image not found"
return 1
fi
mount -o loop,ro "$orig_image" "$MOUNT_ROOT"
if [ -f "$MOUNT_ROOT/$ORIG_IMG_FILE" ]; then
umount "$MOUNT_ROOT"
rmdir "$MOUNT_ROOT"
log "$orig_image already patched, please restore original image to $SYSTEM_IMG"
return 1
fi
mkdir "$SQUASHFS_ROOT"
rsync -aSHAX "$MOUNT_ROOT/" "$SQUASHFS_ROOT/"
umount "$MOUNT_ROOT"
rmdir "$MOUNT_ROOT"
printf '%s' "$orig_image" > "$SQUASHFS_ROOT/$ORIG_IMG_FILE"
}
build_image() {
cp "$SYSTEM_IMG" "$TMPWORKDIR/system.img.backup"
mksquashfs "$SQUASHFS_ROOT" "$SYSTEM_IMG" -noappend -no-exports -no-duplicates -no-fragments
rm "$TMPWORKDIR/system.img.backup"
rm -r "$SQUASHFS_ROOT"
}
_find_mindthegapps() {
downloads=/home/defaultuser/Downloads/
log "Searching for MindTheGapps zip at $downloads/$MINDTHEGAPPS_PATTERN"
find "$downloads" -maxdepth 1 -name "$MINDTHEGAPPS_PATTERN" | sort | tail -n 1
}
get_mindthegapps_zip() {
mindthegapps_zip="$(_find_mindthegapps)"
if [ -z "$mindthegapps_zip" ]; then
log "MindTheGapps zip not found at /home/defaultuser/Downloads/"
log "Please download a MindTheGapps zip from https://wiki.lineageos.org/gapps"
return 1
else
log "Found MindTheGapps zip $mindthegapps_zip"
fi
printf '%s' "$mindthegapps_zip"
}
install_mindthegapps() {
log "Unzip MindTheGapps archive"
unzip -o "$mindthegapps_zip" 'system/*' -d "$TMPWORKDIR/mindthegapps/"
# Remove VelvetTitan (tangorpro-specific Google app)
rm -rf "$TMPWORKDIR/mindthegapps/system/product/priv-app/VelvetTitan"
# Remove addon.d scripts (not needed outside Android recovery)
rm -rf "$TMPWORKDIR/mindthegapps/system/addon.d"
# In the SFOS image /system/product is a symlink to /product (an absolute
# path). rsync would follow/replace that symlink, placing files where
# Android never scans. Install product files directly to /product/.
rsync -a "$TMPWORKDIR"/mindthegapps/system/product/ "$SQUASHFS_ROOT/product/"
rm -rf "$TMPWORKDIR/mindthegapps/system/product"
rsync -a "$TMPWORKDIR"/mindthegapps/system/ "$SQUASHFS_ROOT/system/"
rm -r "$TMPWORKDIR/mindthegapps/"
}
set_traps() {
# shellcheck disable=SC2064
trap "$*" EXIT HUP INT QUIT PIPE TERM
}
# shellcheck disable=SC2329
cleanup() {
if [ ! -f "$SYSTEM_IMG" ] && [ -f "$TMPWORKDIR/system.img.backup" ]; then
mv "$TMPWORKDIR/system.img.backup" "$SYSTEM_IMG" || :
fi
umount "$MOUNT_ROOT" || :
rm -r "$TMPWORKDIR" || :
set_traps -
exit 1
}
REQUIRED_VERSION_ID=5.0.0.73
# shellcheck source=/dev/null
. /etc/os-release
if [ "$VERSION_ID" != "$REQUIRED_VERSION_ID" ]; then
log "Expected Sailfish OS VERSION_ID=$REQUIRED_VERSION_ID but found $VERSION_ID"
exit 1
fi
mindthegapps_zip="$(get_mindthegapps_zip)"
set_traps cleanup
systemctl stop appsupport@defaultuser
mkdir -p "$WORKDIR"
mkdir -p "$TMPWORKDIR"
install_deps
log "extract image"
extract_image
log "image was extracted"
log "install MindTheGapps"
install_mindthegapps
log "MindTheGapps were installed"
log "build image"
build_image
log "image was built"
rmdir "$TMPWORKDIR"
set_traps -
exit 0
@ihusky02
Copy link

Ok, it`s work well :)

@lkraav
Copy link
Author

lkraav commented Mar 12, 2026

This is probably the last version, since I've converted to LXC mount-based strategy https://gist.github.com/lkraav/cde72215adfe0898f12798989f9606d8

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment