12 April 2026

📌 "The best time to degoogle was more than ten years ago. The second best time is before they make it impossible." - nobody famous, but somebody right -

Reinstalled LineageOS on the FP3 tonight. Not because something broke. Because Google is accelerating the process of making third-party Android a second-class citizen, and waiting felt like the wrong move. Better to do this on a quiet Saturday than in a panic. Xandria in the headphones throughout.

The previous install was getting stale anyway. Jumped straight to lineage-22.2-20260408-nightly-FP3-signed.zip. Android 15. No GApps. Clean slate.

why now

The writing has been on the wall for a while. Each Android release tightens the bootloader story, hardens Play Integrity, and makes root detection easier. The window for running a genuinely independent Android stack is narrowing. A nightly from April 2026 felt like a good checkpoint.

backup first

Flashing wasn't going to be enough this time - the old install needed a full wipe. Which means everything off the device before touching anything.

A single script handles it:

#!/bin/bash
adb pull /sdcard/ .
adb pull /storage/6466-3931/ .
adb shell su -c "tar -czf /sdcard/termux-home.tar.gz -C /data/data/com.termux/files home" \
  && adb pull /sdcard/termux-home.tar.gz . \
  && adb shell su -c "rm /sdcard/termux-home.tar.gz"
adb shell su -c "/data/data/com.termux/files/usr/bin/dpkg --get-selections" > termux-packages.txt
adb shell pm list packages -3 | sed 's/package://' | sort > app_list.txt

Internal storage, SD card, Termux home directory, Termux package list, installed APK list. Everything that matters fits in a directory. The Termux home tarball is the important one - configs, scripts, dotfiles, all of it in one pull.

Result before wiping:

sdcard/              # internal storage
6466-3931/           # SD card
termux-home.tar.gz   # 142K - the whole Termux environment
termux-packages.txt  # package list for reinstall
app_list.txt         # third-party APKs

Then wipe, sweat, flash, start clean.

the install

Full wipe, then flash. Bootloader already unlocked from the previous install. Flashed via adb sideload, no recovery involved.

The ROM ships with a pre-extracted boot.img alongside the ZIP - no need to unpack anything:

lineage-22.2-20260408-nightly-FP3-signed.zip  971M
boot.img                                        64M

magisk root

Patching the boot image is the right approach. No touch recovery, no ramdisk modifications that break on updates.

adb push boot.img /sdcard/Download/

Open Magisk app → Install → Select and patch a file. Pull the result back:

adb pull /sdcard/Download/magisk_patched_*.img .

adb pull doesn't expand globs. Find the exact filename first:

adb shell ls /sdcard/Download/

Then flash:

adb reboot bootloader
fastboot flash boot magisk_patched_XXXXX.img
fastboot reboot

adb shellsu#. Done.

zygisk

This is where it got non-trivial.

Magisk 30.7 ships with Zygisk built-in. Enabled it, installed LSPosed and Shamiko, got module suspended because zygisk isn't enabled on both. Zygisk was enabled. The database confirmed it:

sqlite3 /data/adb/magisk.db "select * from settings"
zygisk|1
denylist|0
bootloop|0

The built-in Zygisk implementation in Magisk does not work reliably on LineageOS. This is a known issue and not a new one. The solution is ReZygisk - a standalone Zygisk implementation that replaces the built-in one entirely.

github.com/PerformanC/ReZygisk

Procedure:

  1. Disable Zygisk in Magisk settings
  2. Install ReZygisk as a module
  3. Reboot

Verify it's actually running:

ps -A | grep -i zygisk

Expected output shows zygisk-ptrace64, zygiskd64, zygiskd32 - three processes. If you see companions for your other modules alongside them, they're loading correctly.

lsposed on android 15

LSPosed v1.9.2 crashes on Android 15. The app installs, the module loads, but the manager crashes on launch. The framework is there; the manager is not compatible.

The working fork is Vector by JingMatrix:

github.com/JingMatrix/LSPosed

Two details worth noting:

First, the manager APK is bundled inside the module itself at /data/adb/modules/zygisk_vector/manager.apk. It does not install automatically. Install it manually:

adb shell su -c "cp /data/adb/modules/zygisk_vector/manager.apk /sdcard/Download/"
adb pull /sdcard/Download/manager.apk ./vector_manager.apk
adb install ./vector_manager.apk

The pm install path directly from /data/adb/ fails with a permissions error - the extra copy step is not optional.

Second, if you had the original LSPosed manager installed, uninstall it first. The package name is identical (org.lsposed.manager) and pm will refuse a downgrade.

shamiko

Shamiko loads correctly under ReZygisk. The unsupported environment warning in the Magisk module list is cosmetic - Magisk doesn't recognise ReZygisk as a valid Zygisk host and shows the warning regardless. The companion processes run fine:

zygiskd64-zygisk_shamiko
zygiskd32-zygisk_shamiko

One configuration point: Enforce DenyList in Magisk settings must be off. Shamiko owns that function. They cannot coexist.

modules

The full module stack, in install order:

ModuleSourceNotes
ReZygisk v1.0.0-rc.7PerformanC/ReZygiskInstall first, disable built-in Zygisk
Vector v2.0JingMatrix/LSPosedLSPosed fork for Android 15
Shamiko v1.2.5LSPosed/ShamikoRoot hiding
BuiltIn-BusyBox v1.0.7Magisk-Modules-Alt-Repo358 applets
MagiskSSH v0.26Magisk-Modules-Alt-RepoOpenSSH daemon

ssh access

sshd comes up on port 22 at boot. No password auth - passwd doesn't exist on Android. Key-based only:

adb shell su -c "mkdir -p /data/ssh/root/.ssh"
adb push ~/.ssh/id_*.pub /sdcard/Download/
adb shell su -c "cp /sdcard/Download/id_*.pub /data/ssh/root/.ssh/authorized_keys"
adb shell su -c "chmod 700 /data/ssh/root/.ssh"
adb shell su -c "chmod 600 /data/ssh/root/.ssh/authorized_keys"

~/.ssh/config entry:

Host fp3
    HostName 192.168.0.14
    User root
    IdentityFile ~/.ssh/id_*

ssh fp3 from anywhere on the local network. The FP3 is now a node like anything else.

xposed modules

Installed via Vector Manager. Xposed modules are APKs, not ZIPs - install with adb install, then enable in Vector Manager and assign scope.

app stack

Everything from F-Droid or direct APK. No Play Store, no Firebase, no Google Services of any kind.

for i in *.apk; do echo "Installing $i..."; adb install "$i"; done

Notable entries:

The full list is longer. The point is that none of it requires Google.

and then...

The process from clean flash to fully configured took most of a Saturday. Most of that time was diagnosing the Zygisk situation - the built-in implementation failing silently, LSPosed crashing without an obvious error, Shamiko refusing to load. Once ReZygisk was in place everything else followed in order.

The phone is cleaner than it has ever been. No Google account, no Play Services, no persistent background connections to infrastructure I don't control. ssh fp3 works from the homelab. The apps I actually use are all there.

The window for doing this cleanly is still open. It won't stay open indefinitely.