Skip to content

Instantly share code, notes, and snippets.

@lkraav
Forked from nemishkor/installgapps.sh
Last active February 8, 2026 14:44
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
@lkraav
Copy link
Author

lkraav commented Feb 7, 2026

🗒️ Android 11 OpenGApps injected file list

$ diff -urN <(unsquashfs -l -dest '' system.img.orig.20250417T225429 | sort) <(unsquashfs -l -dest '' system.img.opengapps | sort)
--- /dev/fd/63	2026-02-07 15:50:11.683124926 +0200
+++ /dev/fd/62	2026-02-07 15:50:11.683124926 +0200
@@ -22,6 +22,7 @@
 odm/lib
 odm/lib64
 oem
+orig_img_path.txt
 proc
 product
 run
@@ -1084,6 +1085,9 @@
 system/etc/compatconfig/libcore-platform-compat-config.xml
 system/etc/compatconfig/services-platform-compat-config.xml
 system/etc/compatconfig/settings-platform-compat-config.xml
+system/etc/default-permissions
+system/etc/default-permissions/default-permissions.xml
+system/etc/default-permissions/opengapps-permissions-q.xml
 system/etc/default_volume_tables.xml
 system/etc/dirty-image-objects
 system/etc/event-log-tags
@@ -1197,12 +1201,18 @@
 system/etc/permissions/com.android.settings.xml
 system/etc/permissions/com.android.storagemanager.xml
 system/etc/permissions/com.android.systemui.xml
+system/etc/permissions/com.google.android.maps.xml
+system/etc/permissions/com.google.android.media.effects.xml
 system/etc/permissions/javax.obex.xml
 system/etc/permissions/org.apache.http.legacy.xml
 system/etc/permissions/platform.xml
+system/etc/permissions/privapp-permissions-google.xml
 system/etc/permissions/privapp-permissions-platform.xml
+system/etc/permissions/split-permissions-google.xml
 system/etc/ppp
 system/etc/ppp/ip-up-vpn
+system/etc/preferred-apps
+system/etc/preferred-apps/google.xml
 system/etc/preloaded-classes
 system/etc/protolog.conf.json.gz
 system/etc/public.libraries.txt
@@ -1375,6 +1385,10 @@
 system/etc/selinux/plat_service_contexts
 system/etc/sysconfig
 system/etc/sysconfig/framework-sysconfig.xml
+system/etc/sysconfig/google_build.xml
+system/etc/sysconfig/google_exclusives_enable.xml
+system/etc/sysconfig/google-hiddenapi-package-whitelist.xml
+system/etc/sysconfig/google.xml
 system/etc/sysconfig/hiddenapi-package-whitelist.xml
 system/etc/sysconfig/preinstalled-packages-platform.xml
 system/etc/task_profiles.json
@@ -1716,6 +1730,8 @@
 system/framework/com.android.location.provider.jar
 system/framework/com.android.mediadrm.signer.jar
 system/framework/com.android.media.remotedisplay.jar
+system/framework/com.google.android.maps.jar
+system/framework/com.google.android.media.effects.jar
 system/framework/content.jar
 system/framework/dpm.jar
 system/framework/ethernet-service.jar
@@ -2854,6 +2870,8 @@
 system/priv-app/AlienRemoteKeyboard/oat/arm64
 system/priv-app/AlienRemoteKeyboard/oat/arm64/AlienRemoteKeyboard.odex
 system/priv-app/AlienRemoteKeyboard/oat/arm64/AlienRemoteKeyboard.vdex
+system/priv-app/AndroidMigratePrebuilt
+system/priv-app/AndroidMigratePrebuilt/AndroidMigratePrebuilt.apk
 system/priv-app/BackupRestoreConfirmation
 system/priv-app/BackupRestoreConfirmation/BackupRestoreConfirmation.apk
 system/priv-app/BackupRestoreConfirmation/oat
@@ -2872,6 +2890,8 @@
 system/priv-app/CalendarProvider/oat/arm64
 system/priv-app/CalendarProvider/oat/arm64/CalendarProvider.odex
 system/priv-app/CalendarProvider/oat/arm64/CalendarProvider.vdex
+system/priv-app/ConfigUpdater
+system/priv-app/ConfigUpdater/ConfigUpdater.apk
 system/priv-app/ContactsProvider
 system/priv-app/ContactsProvider/ContactsProvider.apk
 system/priv-app/ContactsProvider/oat
@@ -2916,6 +2936,12 @@
 system/priv-app/FusedLocation/oat/arm64
 system/priv-app/FusedLocation/oat/arm64/FusedLocation.odex
 system/priv-app/FusedLocation/oat/arm64/FusedLocation.vdex
+system/priv-app/GoogleOneTimeInitializer
+system/priv-app/GoogleOneTimeInitializer/GoogleOneTimeInitializer.apk
+system/priv-app/GoogleRestore
+system/priv-app/GoogleRestore/GoogleRestore.apk
+system/priv-app/GoogleServicesFramework
+system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk
 system/priv-app/InProcessNetworkStack
 system/priv-app/InProcessNetworkStack/InProcessNetworkStack.apk
 system/priv-app/InProcessNetworkStack/oat
@@ -2952,12 +2978,16 @@
 system/priv-app/PackageInstaller/oat/arm64/PackageInstaller.odex
 system/priv-app/PackageInstaller/oat/arm64/PackageInstaller.vdex
 system/priv-app/PackageInstaller/PackageInstaller.apk
+system/priv-app/Phonesky
+system/priv-app/Phonesky/Phonesky.apk
 system/priv-app/PlatformNetworkPermissionConfig
 system/priv-app/PlatformNetworkPermissionConfig/oat
 system/priv-app/PlatformNetworkPermissionConfig/oat/arm64
 system/priv-app/PlatformNetworkPermissionConfig/oat/arm64/PlatformNetworkPermissionConfig.odex
 system/priv-app/PlatformNetworkPermissionConfig/oat/arm64/PlatformNetworkPermissionConfig.vdex
 system/priv-app/PlatformNetworkPermissionConfig/PlatformNetworkPermissionConfig.apk
+system/priv-app/PrebuiltGmsCore
+system/priv-app/PrebuiltGmsCore/PrebuiltGmsCore.apk
 system/priv-app/ProxyHandler
 system/priv-app/ProxyHandler/oat
 system/priv-app/ProxyHandler/oat/arm64

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