Google play services on xperia 10 III Sailfish 4.4.0.64

GPS didn’t work very well on my XA2 plus it took forever for it to find my location.
On my X10III it works as expected.

Did you manage to fix it. Could someone post link with working script file to download?

yes got it working and working script was in this post

need also file which is mentioned here: Google play services on xperia 10 III Sailfish 4.4.0.64 - #57 by Tekno

I get the following error:

Erreur fatale: /home/.aliendalvik_systemimg_patch/tmp/rpms/lzip-1.16-1.fc22.armv7hl.rpm has wrong architecture: armv7hl
umount: /home/.aliendalvik_systemimg_patch/tmp/systemimg_mount: no mount point specified.

I am on the latest SF version

1 Like

In 4.6.0, looks like a refactor is necessary at least for SYSTEM_IMG=/opt/{alien -> appsupport}/system.img. Not sure yet if that’s all there is, since appsupport service is currently failing to start after 4.6.0 update [Release notes] Sauna 4.6.0.11 - #33 by lkraav

I changed the SYSTEM_IMG path and used open_gapps-arm64-11.0-pico-20220503.zip
Play Store works but the apps are unable to see Play Services. I had microG before this update.

You removed all tracs of MicroG?

But even on clean install, I’ve had a couple apps fail to find Play Services, even if majority seem to work fine.

I just had to install the apps again. For apps that have data that I don’t want to lose I downloaded an older apk with Aurora store and then
appsupport-attach sh
pm install -d /path/to/apk.apk

And after that it is possible to update it with Play store. So this was a microG thing.

1 Like

I have successfully booted 4.6.0 App Support with this slightly updated script fork Sony 10 III - Dual SIM (arm64) | Sailfish OS 4.6 | Android 11 | Open GApps pico installation script · GitHub

Thanks @nemishkor for getting the gist started.

2 Likes

Thank you! Worked like a charm

First of all thanks for your corrections at the code.
I think there are small typos in it.
At the beginning (before set -e) there should be #!/bin/sh string.
At _find_opengapps() function (row 101 adding the #!/bin/sh above), the download variable should be equal to /home/defaultuser/Downloads and not /home/defaultuser/Downloads/ because, with the slash at the end, at runtime it will return /home/defaultuser/Downloads//name_pattern="open_gapps-$OPENGAPPS_ARCH-$OPENGAPPS_API-$OPENGAPPS_VARIANT-*.zip" (double slashes after Downloads).
In this way the code worked for me after the 4.6.0.11 update.

Open GApps hasn’t been updated for a long time and the latest supported Android version is 11. AppSupport will be API level 33 at least on C2 which means Android 13.

Has anyone tried MindTheGapps or NikGapps with the current phone models? I remember using MindTheGapps some years back.

1 Like

In 5.0, older devices, systemctl stop appsupport should be systemctl stop appsupport@defaultuser. The rest is working.

Yes, my gist has been updated for 5.0 and currently seems to continue to work great on X10III.

Hi there.I’ve been trying to get the script to work on the C2: it actually works with a few edits. opengapps are stuck at Android 11. I tried MindTheGapps: no errors but the Google apps were not showing anywhere . Any clues anybody?

Try this script for Android 13

NikGapps-core-arm64-13-20241231-signed.zip

“run as devel-su”

# installgapps_13_arm64.sh
set -e

WORKDIR=/home/.appsupport_systemimg_patch
TMPWORKDIR="$WORKDIR/tmp"
GAPPSWORKDIR="$TMPWORKDIR/gapps/work/"
SQUASHFS_ROOT="$TMPWORKDIR/squashfs-root"
MOUNT_ROOT="$TMPWORKDIR/systemimg_mount"
SYSTEM_IMG=/opt/appsupport/system.img
ORIG_IMG_FILE=orig_img_path.txt

FEDORA22_REPO=https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/30/Everything/aarch64/os/Packages

GAPPS=NikGapps
GAPPS_ARCH=arm64
GAPPS_API=13
GAPPS_VARIANT=core

log() {
	printf '%s\n' "$1" > /dev/stderr
}

install_fedora22_rpm() {
	pkgname="$1"
	pkgversion="$2"

	if ! rpm -q "$pkgname" > /dev/null; then
		pkgfile="$pkgname-$pkgversion.fc30.aarch64.rpm"
		firstletter="$(printf '%s' "$pkgfile" | cut -c 1)"
		mkdir "$TMPWORKDIR/rpms"
		curl "$FEDORA22_REPO/$firstletter/$pkgfile" > "$TMPWORKDIR/rpms/$pkgfile"
		pkcon -y install-local "$TMPWORKDIR/rpms/$pkgfile"
		rm "$TMPWORKDIR/rpms/$pkgfile"
		rmdir "$TMPWORKDIR/rpms"
	fi
}

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

	if ! rpm -q lzip > /dev/null; then
		log "lzip package not found. Installing..."
		install_fedora22_rpm lzip 1.20-4
	fi

	if ! rpm -q unzip > /dev/null; then
		log "unzip package not found. Installing..."
		pkcon -y install unzip
	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
		orig_image="$WORKDIR/system.img.orig.$(date +%Y%m%dT%H%M%S)"
		cp "$SYSTEM_IMG" "$orig_image"
		log "Copying original image $SYSTEM_IMG to $orig_image"
	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 needs to be run twice to copy all xattrs. Probably a bug in rsync.
	rsync -aSHAX "$MOUNT_ROOT/" "$SQUASHFS_ROOT/"
	rsync -aSHAX "$MOUNT_ROOT/" "$SQUASHFS_ROOT/"
	umount "$MOUNT_ROOT"
	rmdir "$MOUNT_ROOT"

	printf '%s' "$orig_image" | tee "$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_gapps() {
	downloads=/home/defaultuser/Downloads/
	name_pattern="$GAPPS-$GAPPS_VARIANT-$GAPPS_ARCH-$GAPPS_API-*.zip"
	if [ "$1" != quiet ]; then
		log "Searching for GApps zip at $downloads/$name_pattern"
	fi
	find "$downloads" -maxdepth 1 -name "$name_pattern" | sort | tail -n 1
}

get_gapps_zip() {
	gapps_zip="$(_find_gapps)"
	if [ -z "$gapps_zip" ]; then
		# Show the GApps download page to the user instead of automating
		# the download of the latest version.
		# The no-mirror policy
		log "Opening ${GAPPS} download page"
		runuser -l defaultuser - /usr/bin/xdg-open "https://sourceforge.net/projects/nikgapps/files/Releases/Android-13/"
		log "Waiting for download to start"
		while [ -z "$gapps_zip" ]; do
			sleep 1
			gapps_zip="$(_find_gapps quiet)"
		done
		log "Detected new download at $gapps_zip"
		log "Waiting for download to finish"
		while [ -f "$gapps_zip" ] && [ -f "$gapps_zip.part" ]; do
			sleep 1
		done
		sleep 1
		if [ ! -f "$gapps_zip" ]; then
			log "Download failed"
			return 1
		fi
	else
		log "Found GApps zip $gapps_zip"
	fi
	printf '%s' "$gapps_zip"
}

install_gapps() {
	gapps_zip_name="$(get_gapps_zip)"
	log "Unzip gapps archive"
	for p in $(unzip -Z -1t ${gapps_zip_name} AppSet/*); do
		unzip -qd "$TMPWORKDIR/gapps/" ${gapps_zip_name} ${p}
	done

	log "Unzip some google apps"
	find "$TMPWORKDIR/gapps/" -type f -regex ".*\.\(zip\|ZIP\)" | while read z; do
		log "Unzip --> ${z}"
		unzip -qd "$GAPPSWORKDIR" ${z} ___*
	done

	# if [ -f "$TMPWORKDIR/gapps/<placeholder>" ]; then
	# 	rm -r "$SQUASHFS_ROOT/system/<placeholder"
	# fi

	for d in ${GAPPSWORKDIR}*; do
		log "Work dir --> ${d}"
		c=$(echo "${d##*/}"| sed 's/___/\//g')
		log "mkdir --> ${c}"
		mkdir -p "$TMPWORKDIR/gapps_unarchived${c}"
		cp ${d}/* "$TMPWORKDIR/gapps_unarchived${c}/"
	done
	log "Chown all to 500000"
	chown -R 500000:50000 $TMPWORKDIR/gapps_unarchived/*

	rm -r "$TMPWORKDIR/gapps/"
	
	ls -al "$TMPWORKDIR"/gapps_unarchived
	ls -al "$SQUASHFS_ROOT/system/"
	ls -al "$SQUASHFS_ROOT/system/product"
	log "Patch system.img with Gapps"
	cp -r "$TMPWORKDIR"/gapps_unarchived/* "$SQUASHFS_ROOT/system/"
	rm -r "$TMPWORKDIR/gapps_unarchived/"
}

set_traps() {
	# shellcheck disable=SC2064
	trap "$*" EXIT HUP INT QUIT PIPE TERM
}

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
}

set_traps cleanup
systemctl stop appsupport@defaultuser

mkdir -p "$WORKDIR"
mkdir -p "$TMPWORKDIR"
mkdir -p "$GAPPSWORKDIR"

install_deps
log "extract image"
extract_image
log "image was extracted"
log "install ${GAPPS}"
install_gapps
log "${GAPPS} were installed"
log "build image"
build_image
log "image was built"

rmdir "$TMPWORKDIR"

set_traps -
exit 0

Thanks a million ! Tried the script: it works and install smoothly. Then appsupport won’t start. It keeps starting and stopping. I have to further look at the logs to find out what’s going on …

For me it runs with the patched system.img on Xperia 10V

I’m on the C2. Would you know where to look for the appsupport logs?

You were right, the patched image didn’t always work, or rarely. While figuring out the possible error, I had to determine with the tool “unzip” that this tool doesn’t unzip so cleanly. I rewrote the script for “7z” and now have a working image with every patching.

# installgapps_13_aarch64.sh
set -e

WORKDIR=/home/.appsupport_systemimg_patch
TMPWORKDIR="$WORKDIR/tmp"
GAPPSWORKDIR="$TMPWORKDIR/nik"
SQUASHFS_ROOT="$TMPWORKDIR/squashfs-root"
MOUNT_ROOT="$TMPWORKDIR/systemimg_mount"
SYSTEM_IMG=/opt/appsupport/system.img
ORIG_IMG_FILE=orig_img_path.txt

DOWNLOADFOLDER=/home/defaultuser/Downloads/

GAPPS=NikGapps
GAPPS_ARCH=arm64
GAPPS_API=13
GAPPS_VARIANT=core

log() {
  printf '\n---> %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

  if ! rpm -q p7zip-full > /dev/null; then
    log "unzip package not found. Installing..."
    pkcon -y install p7zip-full
  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
    orig_image="$WORKDIR/system.img.orig.$(date +%Y%m%dT%H%M%S)"
    cp "$SYSTEM_IMG" "$orig_image"
    log "Copying original image $SYSTEM_IMG to $orig_image"
  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 -aPSHAX "$MOUNT_ROOT/" "$SQUASHFS_ROOT/" > /dev/null 2>&1
  umount "$MOUNT_ROOT"
  rmdir "$MOUNT_ROOT"

  printf '%s' "$orig_image" | tee "$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_gapps() {
  downloads=${DOWNLOADFOLDER}
  name_pattern="$GAPPS-$GAPPS_VARIANT-$GAPPS_ARCH-$GAPPS_API-*.zip"
  if [ "$1" != quiet ]; then
    log "Searching for GApps zip at $downloads/$name_pattern"
  fi
  find "$downloads" -maxdepth 1 -name "$name_pattern" | sort | tail -n 1
}

get_gapps_zip() {
  gapps_zip="$(_find_gapps)"
  if [ -z "$gapps_zip" ]; then
    # Show the GApps download page to the user instead of automating
    # the download of the latest version.
    # The no-mirror policy
    log "Opening ${GAPPS} download page"
    runuser -l defaultuser - /usr/bin/xdg-open "https://sourceforge.net/projects/nikgapps/files/Releases/Android-13/"
    log "Waiting for download to start"
    while [ -z "$gapps_zip" ]; do
      sleep 1
      gapps_zip="$(_find_gapps quiet)"
    done
    log "Detected new download at $gapps_zip"
    log "Waiting for download to finish"
    while [ -f "$gapps_zip" ] && [ -f "$gapps_zip.part" ]; do
      sleep 1
    done
    sleep 1
    if [ ! -f "$gapps_zip" ]; then
      log "Download failed"
      return 1
    fi
  else
    log "Found GApps zip $gapps_zip"
  fi
  printf '%s' "$gapps_zip"
}

install_gapps() {
  gapps_zip_name="$(get_gapps_zip)"
  log "Unzip nikgapps archive"
  /usr/bin/7z x -ai!*.zip ${gapps_zip_name} -r AppSet/Core/ -o${GAPPSWORKDIR} -y
  /bin/find ${GAPPSWORKDIR} -type f -name "*.zip" -exec 7z x {} '-x!*installer.sh' -o${GAPPSWORKDIR} -y \;

  log "Prepare nikgapps files"
  for d in ${GAPPSWORKDIR}/___*; do
    # log "$(echo $d | sed 's/___/\//g;s/\/\//\/system\//g')"
    mkdir -p "$(echo $d | sed 's/___/\//g;s/\/\//\/system\//g')"
    # log "${d}/* ${GAPPSWORKDIR}/system/$(echo "${d##*/}/"| sed 's/___/\//g')"
    cp ${d}/* ${GAPPSWORKDIR}/system$(echo "${d##*/}/"| sed 's/___/\//g')
  done

  log "chown all to 500000"
  chown -R 500000:500000 ${GAPPSWORKDIR}/system
  log "chmod all with +x"
  chmod -R +x ${GAPPSWORKDIR}/system
  ls -altr "${GAPPSWORKDIR}/system/"

  log "Patch system.img with Gapps"
  cp -rp ${GAPPSWORKDIR}/system/* ${SQUASHFS_ROOT}/system/

  ls -altr "$SQUASHFS_ROOT/system/"
  rm -r "${GAPPSWORKDIR}"
}

set_traps() {
  # shellcheck disable=SC2064
  trap "$*" EXIT HUP INT QUIT PIPE TERM
}

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
}

set_traps cleanup
systemctl stop appsupport@defaultuser

mkdir -p "$WORKDIR"
mkdir -p "$TMPWORKDIR"
mkdir -p "$GAPPSWORKDIR"

log "extract image"
extract_image
log "image was extracted"
log "install ${GAPPS}"
install_gapps
log "${GAPPS} were installed"
log "build image"
build_image
log "image was built"

rmdir "$TMPWORKDIR"

set_traps -
exit 0