How to repartition Google Nexus 4 (aka. LG E960)? Over a month ago, LineageOS rolled out Oreo (I think) update for the Nexus 4 (mako), but there's a catch - the system now takes up so much space, that even the nano version of open-gapps package can no longer be installed without manually removing application in-between the installations. I thought, rather than shooting down apps from default LineageOS, I would rather bump the system partition's size by another 200 MiB.

I haven't attempted anything yet, as information how to achieve this on a snapdragon device seems to be very sparse - is it even possible? I've done repartitioning on a Mediatek device, where doing so involved hand-editing an MBR-like partition table and uploading it to the device using SP-flashtool. Is there a similar, or perhaps an easier-to-use tool for Snapdragon devices?

P.S. - I've read the answers/suggestions to question 65781, and none of them are helpful to my question.
As mentioned above, the Nexus 4 uses plain GPT on its storage to split it up into partitions. Any tool able to modify GPT should work. By far the biggest problem for me was getting an appropriate tool - the fdisk bundled with TWRP can only list partitions on a GPT disk, without making any changes. I prefer not to use parted (available from Termux), due to its inability to display/modify partition GUIDs (may have changed since the last time I checked).

Looking back, it may be possible to dump the entire storage to a computer, make changes there, and put the whole thing back, but I specifically wanted to avoid writing over critical partitions (loaders, kernel, etc.), so I set out to get gdisk for android.

I eventually found this thread, where the author prepared an archive with gdisk and a few other tools.

Requirements:


Computer/VM with adb, fsck.ext4 and resize2fs
This zip file


Overview

The relevant partitions (system and userdata) are 21st and 23rd on the storage. The 22nd partition is just cache, so there's no harm nuking it, and making a new one after data from the other 2 are in place.

The TL;DR version of the procedure is:


pull the data partition to computer

[PC] adb pull /dev/block/mmcblk0p23 userdata.img

put gdisk on the phone, and use it to modify the partition table - grow system while retaining its starting sector, shrink userdata by the same amount, and re-create cache between them

[PC] adb push gdisk /tmp/
[adb-shell] /tmp/gdisk /dev/block/mmcblk0
...

use resize2fs on the phone with the system partition to grow it
use resize2fson the computer with the userdata partition's image to shrink it to appropriate size
push the modified data image to the phone

[PC] adb push userdata.img /dev/block/mmcblk0p23

format the cache partition, reboot into system