Magisk root setup and persistence for Pixel 7a (lynx). Use this skill when rooting the device, troubleshooting root/su access, managing rootd, or recovering from boot issues. Runs on macOS and Linux.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
Magisk root setup and persistence for Pixel 7a (lynx). Use this skill when rooting the device, troubleshooting root/su access, managing rootd, or recovering from boot issues. Runs on macOS and Linux.
ROOT-PIXEL7A-SKILL
Purpose
Canonical runbook for Pixel 7a (lynx) root setup and persistence.
Scope boundary
This file is root-only.
Voice/call bridge runtime is documented separately in skills/voice-bridge/SKILL.md.
Pixel 10 Pro (blazer) is intentionally separate and remains APatch-first (skills/root-pixel10pro/SKILL.md).
Current known-good state (2026-02-23)
Root method: Magisk patch on init_boot.
Native Magisk su path: /debug_ramdisk/su.
Required compatibility entrypoint for this project: /data/adb/ap/bin/su.
Runtime helper daemon for app integrations: rootd on 127.0.0.1:48733.
Validated build: BP4A.260205.001 (Android 16).
Device + build scope
Device: Pixel 7a (lynx)
Build family used in this project: Android 16 BP4A.260205.001
delete both folders after deployment/verification.
OTA updates WILL break root
WARNING: Do NOT accept over-the-air (OTA) system updates on a rooted device. Any OTA update will overwrite the patched init_boot partition with a stock image, removing Magisk root entirely. The su binary, rootd daemon, and all root-dependent functionality (call audio capture, ALSA routing, default dialer override) will stop working immediately after the update reboots the device.
If an OTA update has already been applied: re-root from scratch using this runbook with a factory image matching the new build ID. The old patched image will not work — you must patch the init_boot.img from the new build's factory package.
To prevent accidental updates: Settings → System → Software updates → disable auto-download/auto-install. On a voice-only SIM with no data plan and no Wi-Fi, OTA updates cannot download, but the setting should still be disabled as a safeguard.
Non-negotiable runtime requirements
No screen lock: lock screen must be None or Swipe.
App permissions: After installing the Clawfinger APK, the human must grant these permissions on the device (Settings → Apps → Clawfinger → Permissions):
Microphone (record audio)
Phone (manage phone calls)
Notifications (if prompted)
Default dialer: Clawfinger must be default dialer. This does NOT persist across reboots — Android resets the DIALER role to the stock dialer on every reboot. Must be re-set after every reboot.
# Set via role manager (no root needed):
adb shell cmd role add-role-holder android.app.role.DIALER com.tracsystems.phonebridge 1
# Or via telecom (needs root):
adb shell '/data/adb/ap/bin/su -c "telecom set-default-dialer com.tracsystems.phonebridge"'# Verify:
adb shell '/data/adb/ap/bin/su -c "telecom get-default-dialer"'# Must output: com.tracsystems.phonebridge
Symptom if not set: Phone rings normally through Google Dialer, PhoneBridge BridgeInCallService is never bound, calls are not picked up or handled by the assistant.
Keep Clawfinger battery mode on Unrestricted.
rootd must be running: rootd does NOT auto-start after reboot. Must be manually started after every reboot.
Keep compatibility su path file valid:
/data/adb/ap/su_path must contain /data/adb/ap/bin/su.
Post-reboot recovery (REQUIRED after every reboot)
After every reboot, three things break and must be fixed manually:
DIALER role resets — Android resets android.app.role.DIALER to the stock dialer.
rootd is not running — The rootd daemon does not auto-start. Without it, RootShellRuntime cannot execute any root commands (tinyplay, tinymix, tinycap all fail).
/data/adb/ is inaccessible — Magisk enforces /data/adb/ as drwx------ (700, root only). The app cannot directly access /data/adb/ap/bin/su or /data/adb/service.d/phonebridge-tiny*. Only rootd (running as root) or /data/local/tmp/su (symlink to /debug_ramdisk/su) can bootstrap root access.
Symptom if rootd is not running: Logs show root shell unavailable: no_root_shell:rootd:code=126:error=ConnectException...ECONNREFUSED | /data/adb/ap/bin/su:code=126:error=IOException...Permission denied. No greeting is played, no audio capture, no tinymix routing — the call is completely silent.
Fix all three after every reboot:
adb wait-for-device
# 1) Re-set default dialer
adb shell cmd role add-role-holder android.app.role.DIALER com.tracsystems.phonebridge 1
# 2) Start rootd (must use /debug_ramdisk/su since /data/adb/ is inaccessible)
adb shell '/debug_ramdisk/su -c "nohup /system/bin/sh /data/adb/service.d/phonebridge-rootd.sh > /dev/null 2>&1 &"'# 3) Verify
adb shell '/debug_ramdisk/su -c "telecom get-default-dialer"'# Must output: com.tracsystems.phonebridgeecho"CMD_B64:aWQ=" | adb shell "nc 127.0.0.1 48733"# Must output: uid=0(root) ... __PB_EXIT__:0