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 shell → su → #. 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:
- Disable Zygisk in Magisk settings
- Install ReZygisk as a module
- 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:
| Module | Source | Notes |
|---|---|---|
| ReZygisk v1.0.0-rc.7 | PerformanC/ReZygisk | Install first, disable built-in Zygisk |
| Vector v2.0 | JingMatrix/LSPosed | LSPosed fork for Android 15 |
| Shamiko v1.2.5 | LSPosed/Shamiko | Root hiding |
| BuiltIn-BusyBox v1.0.7 | Magisk-Modules-Alt-Repo | 358 applets |
| MagiskSSH v0.26 | Magisk-Modules-Alt-Repo | OpenSSH 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.
- Hide My Applist v3.6.1 - hides installed apps from other apps. Relevant for banking apps that query for root tooling. Configure per-app with templates.
- NFCGate v15 - NFC traffic intercept and relay. Companion app required on both devices for the relay use case.
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:
net.mullvad.mullvadvpn- the VPN situation is handledcom.emanuelef.remote_capture- PCAPdroid for traffic analysisnet.typeblog.shelter- work profile isolation for anything untrustedeu.siacs.conversations- XMPPde.tutao.tutanota- emailnet.osmand.plus- maps, offlineorg.asteroidos.sync- AsteroidOS watch syncorg.koreader.launcher.fdroid- KOReader
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.