009: Polish bacon fixes, OTA host scripts, and migration docs.
Restore disable_configstore, EuiccDisabler and thermal CDEV guards, branding and rebuild/sync helpers; document device roles, laptop migration, and Gitea. Co-authored-by: Cursor <cursoragent@cursor.com>
No files matched your search
@@ -43,6 +43,8 @@ ccache/
|
||||
.env
|
||||
.env.*
|
||||
.local-artifacts/
|
||||
# Bootanimation build tree (large PNG frames; zip optional on USB / host)
|
||||
artifacts/
|
||||
yuh-golden-pass.log
|
||||
lineage-webview-arm64/
|
||||
aosp-webview*.apk
|
||||
|
||||
@@ -18,9 +18,11 @@ unless the owner explicitly asks.
|
||||
|
||||
## Sources of truth
|
||||
|
||||
Resume point for the unfinished ROM (2026-10-08): `docs/009-handoff-20261008.md`.
|
||||
Read that before the older remaining-work docs; several of those still describe
|
||||
pre-boot state.
|
||||
Resume point: `docs/009-handoff-20261008.md` (closure
|
||||
`docs/009-closure-parity-20261009.md`). Doc index: `docs/README.md`.
|
||||
Next LOS sync / first project OTA zip: `docs/009-upstream-rebase-ota.md`.
|
||||
Read the handoff before older remaining-work docs; many fortify/CVE/`007`
|
||||
files are historical only (`docs/archive/README.md`).
|
||||
|
||||
1. **Constitution** (`.specify/memory/constitution.md`) — global project rules
|
||||
for this Magisk-resurrection track.
|
||||
@@ -45,7 +47,9 @@ This track is an **AXP.OS → LOS23/A16** resurrection (~clone). Default method:
|
||||
|
||||
Do **not** redesign Magisk, microG, Phonesky, DNS, connectivity, hardening
|
||||
package sets, or other AXP-class features “our way” for convenience.
|
||||
KernelSU/SusFS (`007`) stays **standby** — never mix into Magisk ship boots.
|
||||
KernelSU / ReSukiSU / SusFS (`007`) is a **parallel** track (boot worked; keep
|
||||
all docs). Never mix into Magisk ship bacons. Retry on current ROM:
|
||||
`docs/007-parallel-on-009.md`.
|
||||
|
||||
Magisk specifically: EXTENDROM `EXTENDROM_PREROOT_BOOT` (boot patch, Magisk
|
||||
**not** a `PRODUCT_PACKAGE`, dormant until Additional Setup). See
|
||||
|
||||
@@ -153,7 +153,7 @@ Independent of SSYSTEMS Salt/GitLab. All on `rom-dev01`.
|
||||
`/srv/rom/secrets/semaphore-admin.txt`
|
||||
- Admin user (both apps): `sunfish-admin` (after nginx Basic)
|
||||
- Git transport: **HTTPS via nginx** (Gitea still `DISABLE_SSH=true`; no public `:2222`)
|
||||
- Repos (private): `sunfish-admin/{sunfish-a16-rom,sunfish-rom-manifest,sunfish-rom-build,sunfish-rom-patches}`
|
||||
- Repos (private): `sunfish-admin/{AXP-Resurection,sunfish-a16-rom,sunfish-rom-manifest,sunfish-rom-build,sunfish-rom-patches}`
|
||||
- Automation tree: `/home/android-build/sunfish-rom-build` (not inside Spec Kit meta)
|
||||
- Semaphore project `sunfish-rom` template `env-smoke` clones **canonical**
|
||||
`sunfish-rom-build` from Gitea and runs `ansible/smoke.yml` unprivileged
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
# 003 — Build notes (LOS 23.2 sunfish vanilla)
|
||||
|
||||
> Vanilla bring-up **done** 2026-09-14. For Magisk ship rebacon after a new
|
||||
> LOS sync, use [`009-upstream-rebase-ota.md`](009-upstream-rebase-ota.md) and
|
||||
> `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` — not a bare
|
||||
> `mka bacon` from this note alone.
|
||||
|
||||
**Host:** `rom-dev01` as `android-build`
|
||||
**Tree:** `/srv/rom/src/lineage`
|
||||
**Artifacts:** `/srv/rom/artifacts/003-…`
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
|
||||
|
||||
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# abu (KernelSU-Next) vs ours (ReSukiSU) — SusFS integration checklist
|
||||
|
||||
> **Historical hypothesis checklist:** The [2026-09-16 source audit](007-susfs-source-audit.md)
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
|
||||
|
||||
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# Debug boot — freeze on panic (photo / dump)
|
||||
|
||||
Normal sunfish kernel: `CONFIG_PANIC_TIMEOUT=5` + often
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
> **Status: parallel track (ReSukiSU / SusFS).** Magisk remains `009` ship root.
|
||||
> This path is **kept** for LAB experiments on the current ROM — see
|
||||
> [`007-parallel-on-009.md`](007-parallel-on-009.md). Sept 2026: boot PASS;
|
||||
> banks FAIL (`007-lab-results-20260916.md`). Hard-gates table below is the
|
||||
> acceptance bar for a future KSU ship, not a measured PASS.
|
||||
|
||||
# 007 — KernelSU-Next on sunfish (LAB runbook)
|
||||
|
||||
**LAB only**: serial `11231JEC207477` — never GOLDEN `11071JEC203839`
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
|
||||
|
||||
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# 007 LAB results — 2026-09-16
|
||||
|
||||
LAB only: serial `11231JEC207477`. GOLDEN not used.
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
# 007 parallel track — ReSukiSU / SusFS on Magisk `009` ROM
|
||||
|
||||
**Status (2026-10-10):** active **parallel** path. Not Magisk ship. Not deleted.
|
||||
Docs under `007-*` stay; this file is the bridge to the **current** closure ROM.
|
||||
|
||||
**Why keep it:** Sept 2026 LAB bring-up **booted** ReSukiSU + SusFS v1.5.5 with
|
||||
matched `boot`+`vendor` (`docs/007-lab-results-20260916.md`). Owner may want
|
||||
to retry that stack on today’s Magisk `009` tree (Stage1/CVE/hardening +
|
||||
userspace), especially for hide experiments (e.g. PairIP-class apps) without
|
||||
throwing away Magisk ship.
|
||||
|
||||
## Parallelism rules
|
||||
|
||||
| Rule | Detail |
|
||||
|------|--------|
|
||||
| Ship zip | Magisk EXTENDROM preroot only (`009` bacon). Never enable `CONFIG_KSU` in the Magisk ship bacon. |
|
||||
| Experiment | Separate `boot.img` (and usually matched vendor modules) built from the **same** LOS/`009` kernel tree **or** a worktree clone — flash LAB only. |
|
||||
| Coexistence | Do **not** run Magisk + KernelSU in the same boot. A/B slots or keep last Magisk zip to restore. |
|
||||
| GOLDEN | Never flash. |
|
||||
| Spec | FR-016 optional recycle; `specs/007-kernelsu-sunfish/` remains valid standby. Sibling workspace `sunfish-a16-rom` may hold older KSU dirt — prefer re-integrating onto current `009` kernel. |
|
||||
|
||||
## What already worked (do not reinvent)
|
||||
|
||||
| Item | Result |
|
||||
|------|--------|
|
||||
| ReSukiSU + SusFS boot | PASS (matched vendor, SELinux `vendor_kernel_modules`) |
|
||||
| Manager + `susfs_init` | PASS |
|
||||
| Banking hide alone | **Not** enough (Swissquote/Yuh FAIL `-69` on that stack) |
|
||||
| Boot-only SusFS flash | FAIL (module CRC / vibrator hang) — always match vendor `.ko` |
|
||||
|
||||
Runbook detail: [`007-kernelsu-runbook.md`](007-kernelsu-runbook.md).
|
||||
Lab write-up: [`007-lab-results-20260916.md`](007-lab-results-20260916.md).
|
||||
|
||||
## Recommended trial on current ROM
|
||||
|
||||
1. Keep Magisk closure zip + both slots known-good.
|
||||
2. On `rom-dev01`, from the **current** `009` kernel (not the Sept-only image):
|
||||
- refresh ReSukiSU / SusFS to newest compatible (non-shallow; record
|
||||
`KSU_VERSION` + manager APK — AGENTS.md upstream freshness).
|
||||
- integrate per `007-kernelsu-runbook.md` (manual hooks + SusFS).
|
||||
- build `bootimage` (+ vendor modules from same build).
|
||||
3. Disable Magisk for that boot (KSU boot has no Magisk preroot).
|
||||
4. Flash LAB: matched `boot` + vendor modules path from runbook; vbmeta
|
||||
disable-verity as before if required for the experiment.
|
||||
5. Install matching spoofed manager; smoke `sys.boot_completed`, SusFS version,
|
||||
then optional banking / Wallapop probes.
|
||||
6. Restore Magisk ship zip/slot when done.
|
||||
|
||||
Artifacts: `/srv/rom/artifacts/007-kernelsu/` (separate from
|
||||
`009-axp-los23-port/`).
|
||||
|
||||
## Do-not
|
||||
|
||||
- Merge KSU into `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh`
|
||||
- Reuse Sept `boot-resukisu-*.img` on Oct Magisk userspace without matching
|
||||
kernel/vendor ABI
|
||||
- Treat bank PASS as already proven on KSU (it was not)
|
||||
- Delete `007-*` docs or `specs/007-kernelsu-sunfish/`
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
|
||||
|
||||
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# SusFS + ReSukiSU on sunfish LOS 23.2 — full attempt log (for external review)
|
||||
|
||||
> **Audit correction (2026-09-16):** See [source and artifact audit](007-susfs-source-audit.md).
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
|
||||
|
||||
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# SUSFS bring-up: source and artifact audit, 2026-09-16
|
||||
|
||||
Status: **superseded for boot outcome** by
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
# Design: native call-recording unlock + FLAG_SECURE override (`008`/`009`)
|
||||
|
||||
**Date**: 2026-09-16
|
||||
**Status**: Approved by owner (requirements); Spec Kit feature
|
||||
**Status**: Landed via Magisk `009` ship pack (2026-10). Spec:
|
||||
`specs/008-call-rec-flag-secure/`
|
||||
**LAB only**: `11231JEC207477`. No Magisk/LSPosed/Zygisk for these features.
|
||||
**LAB only**: `11231JEC207477`.
|
||||
|
||||
> **Scope note:** “No Magisk/LSPosed/Zygisk” applies to **these two native
|
||||
> toggles** (they are ROM Settings/framework). It does **not** mean the ROM
|
||||
> ships without Magisk — Magisk preroot is a separate `009` requirement.
|
||||
|
||||
## Problem
|
||||
|
||||
|
||||
@@ -1,79 +1,54 @@
|
||||
# 009 — Remaining path to AXP / Graphene-class ship (post clean-429)
|
||||
# 009 — Remaining path after Magisk closure
|
||||
|
||||
**Stale as an execution order.** Boot, vendor SPL, lock-scope, release-keys,
|
||||
and `hardened_malloc` moved on 2026-10-08. Start from
|
||||
`docs/009-handoff-20261008.md`.
|
||||
**Updated 2026-10-10.** Older “post clean-429 / leave test-keys” execution
|
||||
order is obsolete. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
Closure: [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md).
|
||||
|
||||
Authoritative requirements: `specs/009-axp-los23-port/spec.md` + constitution.
|
||||
KernelSU stays out of Magisk ship boots (optional recycle only).
|
||||
|
||||
|
||||
Non-normative roadmap after LAB **BOOT_OK** on Stage1+combo4+FORTIFY+Magisk+
|
||||
**CVE clean-offset 429** (denylist `CVE-2022-49980`), kernel `#47`
|
||||
(`20261001T180955Z-axp-stage1-combo4-cve-clean`). Authoritative requirements
|
||||
remain `specs/009-axp-los23-port/spec.md` + constitution.
|
||||
|
||||
Goal (owner): **almost all** applicable AXP.OS / Graphene-class behaviour on
|
||||
LOS 23.2 sunfish Magisk track — not a blind dump, not bootloader lock.
|
||||
|
||||
**2026-10-07 next-bacon correction:** `misc/0021` is already present in the
|
||||
LOS kernel base. Stage1 must omit it and use `patch --forward`; otherwise GNU
|
||||
patch auto-reverses it and shrinks `KSYM_NAME_LEN` 192→128 under Clang CFI.
|
||||
The first corrected candidate retains 192 and applies only the
|
||||
`CVE-2022-49980` lock-scope companion as its new kernel delta.
|
||||
|
||||
## Already landed (kernel / Magisk core)
|
||||
## Already landed (LAB closure, 2026-10-09)
|
||||
|
||||
| Layer | Status |
|
||||
|-------|--------|
|
||||
| Stage1 Graphene/AH | Ship |
|
||||
| Combo4 + Clang FORTIFY | Ship |
|
||||
| Magisk preroot EXTENDROM-class | Ship |
|
||||
| CVE clean-offset 429 | Ship (LAB OK) |
|
||||
| `CVE-2022-49980` | Original one-liner denylisted; corrected lock-scope candidate next |
|
||||
| High-offset CVE (~73) | Quarantine — triage started |
|
||||
| Stage1 + combo4 + Clang FORTIFY | Ship |
|
||||
| CVE clean-offset + hi batches 1–3 | Ship (`CVE-2022-49980` one-liner denylisted; lock-scope companion applied) |
|
||||
| Magisk 30.7 EXTENDROM preroot | Ship |
|
||||
| `user` + project `release-keys` | Ship |
|
||||
| AVB flags 0 (unlocked) | Ship |
|
||||
| Deblob waves 1–4 (selective; not AXP `Deblob.sh`) | Ship |
|
||||
| `hardened_malloc` (64-bit; SF/camera exclusions) | Ship |
|
||||
| Call-rec / FLAG_SECURE DO toggles (`008`) | Ship |
|
||||
| Private DNS / connectivity (no axp.os endpoints) | Ship |
|
||||
| Swissquote usable in Island | **PASS** |
|
||||
| Bootanimation | Lineage (no AXP asset in PRO payload) |
|
||||
|
||||
Recover/bisect baseline: `20260929T123401Z-axp-stage1-combo4` (`#32`).
|
||||
|
||||
## Kernel remaining (toward “AXP CVE / Graphene depth”)
|
||||
|
||||
1. **High-offset quarantine** — KEEP batches 1–3 **shipped** (`151944Z`).
|
||||
nf_tables leftovers still skipped. Next kernel depth: **US-S5-1** defconfig
|
||||
(Yama + `SLAB_FREELIST_RANDOM`), not more bulk CVE.
|
||||
2. **`CVE-2022-49980` proper port** — keep UAF fix without recursive
|
||||
`udc_lock` using the reviewed lock-scope companion. Boot and USB gadget
|
||||
smoke are still required; the original one-liner remains denylisted.
|
||||
3. Failed Stage1 probes (allocsize/ro/slab) — low priority vs high-offset.
|
||||
4. Graphene modern techniques / `hardened_malloc` — backlog (`docs/hardening-backlog.md`);
|
||||
evaluate after CVE depth is stable.
|
||||
|
||||
## Userspace / product remaining (AXP surface)
|
||||
|
||||
From `docs/009-capability-matrix.md` / Gate G (still open or partial):
|
||||
## Still open / next
|
||||
|
||||
| Item | Notes |
|
||||
|------|--------|
|
||||
| Release keys + AVB (unlocked) | US-S2/S3 — leave test-keys |
|
||||
| Private DNS / connectivity check | Patches exist; keep AXP-class, no axp.os endpoints |
|
||||
| Call-rec / FLAG_SECURE | `008` — selectable unlock |
|
||||
| Bundled apps (Aurora, Droidify, gallery, …) | Packaging |
|
||||
| Disable-app UX on A16 | Restore classic Disable |
|
||||
| Hosts / DNS privacy helpers | Magisk module vs ROM-native TBD |
|
||||
| WebView | LOS default (Aosmium exception) |
|
||||
| Banking / Island | Deferred |
|
||||
| Bootloader lock | Wont |
|
||||
| KernelSU swap | Optional later; do not mix Magisk ship boots |
|
||||
| **Upstream LOS 23.2 rebase + first project OTA zip** | [`009-upstream-rebase-ota.md`](009-upstream-rebase-ota.md) — bacon scripts ready; sync automation not |
|
||||
| **Yuh in Island on LAB** | Open — Play A16/sunfish filter + install-source; see [`009-yuh-golden-lab-hypothesis.md`](009-yuh-golden-lab-hypothesis.md) |
|
||||
| Wallapop / PairIP-class apps | Root cause 2026-10-10: Yama `ptrace_scope=2` (US-S5-1 + `apply_009_yama_ptrace.py`). PairIP's anti-debug ptrace is denied, so it dies with SIGSEGV. GOLDEN kernel has no Yama. Next OTA leaves `CONFIG_SECURITY_YAMA` unset |
|
||||
| FR-019 APK sideload cadence | Stub: [`009-sideload-system-updates.md`](009-sideload-system-updates.md) |
|
||||
| Release-key custody polish | Keys under `/srv/rom/secrets/`; offline copy confirm |
|
||||
| Physical-SIM call gate | Owner before more radio deblob |
|
||||
| Leftover high-offset CVE / failed Stage1 probes | Optional, small batches |
|
||||
| KernelSU / SusFS parallel retry | Keep `007-*`; bridge [`007-parallel-on-009.md`](007-parallel-on-009.md) — never mix into Magisk ship bacon |
|
||||
| Bootloader lock | Wont (AXP/LOS unlocked norm) |
|
||||
|
||||
## Suggested execution order (default if owner has no preference)
|
||||
## Suggested order (default)
|
||||
|
||||
1. Finish high-offset **relevance filter** → small apply batches (≤10) with
|
||||
strict applicator + LAB boot each batch.
|
||||
2. Wire **release keys** bacon of current ship pack; keep Magisk/preroot OK.
|
||||
3. Land remaining **Settings/UX** AXP clones (DNS, connectivity, disable-app)
|
||||
if not already on LAB zip.
|
||||
4. Optional: 49980 lock-scope port; Graphene userspace / hardened_malloc spikes.
|
||||
1. Owner supplies new LOS sunfish build pin → follow `009-upstream-rebase-ota.md`.
|
||||
2. Rebacon with `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` (+ wave4/malloc wrappers if still required).
|
||||
3. LAB sideload smoke: Magisk, Island, Swissquote, radio.
|
||||
4. Yuh / Play compatibility experiments (LAB only).
|
||||
5. Fill FR-019 sideload commands when packaging is frozen.
|
||||
|
||||
## Do-not
|
||||
|
||||
- Reflash full-503 / old kh-cve zips.
|
||||
- Bulk-apply high-offset without manual review.
|
||||
- Reflash full-503 / old `kh-cve` / FORTIFY-broken zips.
|
||||
- Bulk-apply high-offset CVE without review.
|
||||
- Mix KernelSU into Magisk ship boots.
|
||||
- Treat “almost AXP/Graphene” as requiring locked bootloader.
|
||||
- Run AXP `Deblob.sh` defaults.
|
||||
- Treat “AXP/Graphene-class” as requiring locked bootloader.
|
||||
@@ -45,9 +45,11 @@ TrebuchetQuickStep, Updater, Lineage*, Settings, SystemUI, ims, …
|
||||
|
||||
| AXP | Our ship policy |
|
||||
|-----|-----------------|
|
||||
| AuroraStore | product `AuroraStore` (already) |
|
||||
| F-Droid | **Droidify** substitute (owner) |
|
||||
| FossifyGallery_FD | product `FossifyGallery` + override Gallery2 |
|
||||
| AuroraStore | system_ext `AuroraStore` |
|
||||
| F-Droid | **Droidify** on system_ext (owner; not `org.fdroid.fdroid`) |
|
||||
| FossifyGallery_FD | system_ext `FossifyGallery` + override Gallery2 |
|
||||
|
||||
AXPR ship policy: [`009-bundled-apps-axp-parity.md`](009-bundled-apps-axp-parity.md).
|
||||
| noDefaultBrowserWebView | **US-S4-2**: drop Jelly |
|
||||
| Gallery2 absent | **US-S4-2**: ensure Gallery2 gone (override alone left dir) |
|
||||
| NeoLauncher / Aosmium | wont / exception — keep Launcher3 + LOS WebView |
|
||||
|
||||
@@ -0,0 +1,372 @@
|
||||
# AXP Resurrection Pro (AXPR) — Presentación de la ROM
|
||||
|
||||
**Dispositivo:** Google Pixel 4a (`sunfish`)
|
||||
**Base upstream:** LineageOS **23.2** / Android **16** (`BP4a`, `lineage_sunfish-user`)
|
||||
**Producto:** **AXP Resurrection Pro** — clon funcional de AXP.OS Pro (LOS22 / GOLDEN) sobre LOS23
|
||||
**Repositorio:** `AXP_Resurection` (rama Magisk / `009`)
|
||||
**Documento:** síntesis enriquecida para lectura o exportación a PDF — **2026-10-11**
|
||||
|
||||
**Público / usuarios:** ver [`public/AXP-Resurrection-Pro-sunfish.md`](public/AXP-Resurrection-Pro-sunfish.md) y lista CVE [`public/kernel-cve-backport-list.txt`](public/kernel-cve-backport-list.txt).
|
||||
|
||||
---
|
||||
|
||||
### Exportar a PDF (en el laptop)
|
||||
|
||||
```bash
|
||||
cd /home/aventura/Workspaces/AXP_Resurection
|
||||
# Opción A — pandoc (si está instalado)
|
||||
pandoc docs/009-axpr-rom-presentation.md -o docs/009-axpr-rom-presentation.pdf \
|
||||
--pdf-engine=xelatex -V geometry:margin=2.5cm -V lang=es
|
||||
|
||||
# Opción B — navegador / VS Code: vista previa Markdown → Imprimir → Guardar como PDF
|
||||
```
|
||||
|
||||
**Fuentes normativas:** `specs/009-axp-los23-port/spec.md`, `.specify/memory/constitution.md`, `docs/009-handoff-20261008.md`. Este archivo es **presentación**; no sustituye el spec.
|
||||
|
||||
---
|
||||
|
||||
## Tabla de contenidos
|
||||
|
||||
1. [Resumen ejecutivo](#1-resumen-ejecutivo)
|
||||
2. [Arco del proyecto (punto 0 → hoy)](#2-arco-del-proyecto-punto-0--hoy)
|
||||
3. [Línea base LineageOS vs identidad AXPR](#3-línea-base-lineageos-vs-identidad-axpr)
|
||||
4. [Qué se clonó de AXP.OS / EXTENDROM](#4-qué-se-clonó-de-axpos--extendrom)
|
||||
5. [Kernel: AXP, GrapheneOS-class, CVE](#5-kernel-axp-grapheneos-class-cve)
|
||||
6. [Userspace: parches AXP en Android 16](#6-userspace-parches-axp-en-android-16)
|
||||
7. [Debloob / de-Google selectivo](#7-debloob--de-google-selectivo)
|
||||
8. [microG, Play y apps empaquetadas](#8-microg-play-y-apps-empaquetadas)
|
||||
9. [Magisk preroot (sin KernelSU en ship)](#9-magisk-preroot-sin-kernelsu-en-ship)
|
||||
10. [Hardening userspace y malloc](#10-hardening-userspace-y-malloc)
|
||||
11. [Toggles y políticas de privacidad](#11-toggles-y-políticas-de-privacidad)
|
||||
12. [Firma, AVB y actualizaciones](#12-firma-avb-y-actualizaciones)
|
||||
13. [Inspiración GrapheneOS (qué sí / qué no)](#13-inspiración-grapheneos-qué-sí--qué-no)
|
||||
14. [Verificación y hitos en LAB](#14-verificación-y-hitos-en-lab)
|
||||
15. [Build de referencia actual (oct 2026)](#15-build-de-referencia-actual-oct-2026)
|
||||
16. [Abierto / no objetivo](#16-abierto--no-objetivo)
|
||||
17. [Apéndice: scripts de integración](#17-apéndice-scripts-de-integración)
|
||||
18. [Apéndice: lecciones LAB (Magisk / flash)](#18-apéndice-lecciones-lab-magisk--flash)
|
||||
|
||||
---
|
||||
|
||||
## 1. Resumen ejecutivo
|
||||
|
||||
**AXP Resurrection Pro (AXPR)** no es un LineageOS con “algunos APKs”: es un **resurrection track** que toma **LineageOS 23.2 vanilla** probado en LAB (`003`) y reintegra el **conjunto de capacidades AXP.OS Pro** (referencia **GOLDEN** en Pixel 4a con AXP 22.2 / Android 15), adaptado a **Android 16** y **Magisk 30.7**, con:
|
||||
|
||||
- **Kernel** `msm-4.14` de LOS + **Stage 1** Graphene/AXP (~30 parches) + **FORTIFY** + **~429 CVE** “clean-offset” + **lotes high-offset** + endurecimiento **US-S5-1** (sin Yama como GOLDEN).
|
||||
- **Userspace** microG + **Phonesky** parcheado del proyecto + **sigspoof** y **call recording** con toggles + DNS privado / connectivity check al estilo AXP (sin servidores `axp.os`).
|
||||
- **Debloob** en **4 oleadas** (euicc Google, carrier/RCS, herramientas Lineage, comandos solo-LAB) — **no** el `Deblob.sh` ciego de AXP.
|
||||
- **Magisk** embebido en **build** (EXTENDROM `EXTENDROM_PREROOT_BOOT`), manager **dormant** hasta activación; **KernelSU/SusFS** fuera del bacon de ship (`007` en paralelo).
|
||||
- **Firma** `release-keys` de proyecto, **AVB flags=0** (track desbloqueado + Magisk), **SPL vendor** fijado en **2023-09-05** (guardia anti-downgrade).
|
||||
|
||||
Paridad bancaria **Swissquote en Island: PASS** en cierre 2026-10-09; **Yuh** sigue abierto.
|
||||
|
||||
---
|
||||
|
||||
## 2. Arco del proyecto (punto 0 → hoy)
|
||||
|
||||
| Fase | Feature | Qué se logró |
|
||||
|------|---------|----------------|
|
||||
| **Host** | `001` | `rom-dev01`, artefactos bajo `/srv/rom/artifacts/`, builds largos en tmux (`rom-detach`) |
|
||||
| **Oracle** | `002` | Inventario **GOLDEN** (`11071JEC203839`) — solo lectura `adb` |
|
||||
| **Baseline** | `003` | **LOS 23.2 UNOFFICIAL** vanilla en LAB (`20260914`), smoke hardware, **sin** AXP/microG |
|
||||
| **MicroG track (standby)** | `004`–`008` | microG, spoof, call rec, etc. — reutilizado por `009` |
|
||||
| **KernelSU track (paralelo)** | `007` | Boot OK sept 2026; **no mezclar** en bacon Magisk |
|
||||
| **Ship activo** | `009` | **AXP → LOS23** resurrection; spec `009-axp-los23-port` |
|
||||
|
||||
**Dispositivos:**
|
||||
|
||||
| Rol | Serial | Uso |
|
||||
|-----|--------|-----|
|
||||
| **GOLDEN** | `11071JEC203839` | Oracle AXP 22.2 — **nunca** flashear |
|
||||
| **LAB** | `11231JEC207477` | Flash, sideload, Magisk, banca en Island |
|
||||
|
||||
---
|
||||
|
||||
## 3. Línea base LineageOS vs identidad AXPR
|
||||
|
||||
### 3.1 Vanilla LOS (`003`)
|
||||
|
||||
- Build: `lineage-23.2-20260914-UNOFFICIAL-sunfish`
|
||||
- `ro.lineage.version` UNOFFICIAL, test-keys, sin microG ni Magisk AXP
|
||||
- Vendor SPL **2023-09-05** (EOL Pixel; documentado)
|
||||
- **Gate:** smoke LAB OK → autoriza integración AXP
|
||||
|
||||
### 3.2 Pin upstream OTA (oct 2026)
|
||||
|
||||
- Manifest pin: **Lineage nightly `20261008`** (`lineage-23.2-20261008-nightly-sunfish`)
|
||||
- Zip de producto: `AXP-Resurection-Pro-23.2-20261008-sunfish.zip` (hermano de `lineage-23.2-20261008-PRO-sunfish.zip`)
|
||||
- `LINEAGE_BUILDTYPE=PRO`, `user`, `TARGET_RELEASE=bp4a`
|
||||
- Platform SPL: **2026-09-01** (merges LOS)
|
||||
- Vendor SPL ship: **2023-09-05** (deliberado vs GOLDEN `2023-08-05` — guardia en `apply_009_axp_identity.py`)
|
||||
|
||||
### 3.3 Branding
|
||||
|
||||
- Nombre producto: **AXP Resurrection Pro**
|
||||
- Bootanimation: **fullscreen sunfish** (mejora de tamaño vs banda Lineage); assets AXP PRO en payload aún limitados — animación puede seguir siendo clase Lineage en algunos builds
|
||||
- **No** NeoLauncher — **Launcher3** Lineage
|
||||
- **No** servidores OTA AXP ni repos de mercado externos (EOL)
|
||||
|
||||
---
|
||||
|
||||
## 4. Qué se clonó de AXP.OS / EXTENDROM
|
||||
|
||||
**Regla del repo (`AGENTS.md`):** copiar método AXP/EXTENDROM/GOLDEN **antes** de inventar política local.
|
||||
|
||||
| Área | Mecanismo AXP | Implementación AXPR |
|
||||
|------|----------------|---------------------|
|
||||
| **Magisk en boot** | `EXTENDROM_PREROOT_BOOT`, `patch.sh`, hook `releasetools` | `vendor/sunfish-a16/magisk/`, `out/.magisk/READY`, `SUNFISH_A16_MAGISK_PREROOT` |
|
||||
| **Magisk no en PRODUCT** | Root dormant hasta activación | Stub manager; **no** `PRODUCT_PACKAGE` Magisk |
|
||||
| **Env patcher** | `PREINITDEVICE=userdata`, `KEEPVERITY`, `KEEPFORCEENCRYPT` | Mismo en `vendor/sunfish-a16/magisk/patch.sh` |
|
||||
| **Product wiring** | `gms.mk`, `magisk.mk`, `apps.mk` | `apply_009_product_includes.py` en cada bacon |
|
||||
| **Identidad / certs** | `vendor/lineage-priv/keys`, `avb.pem` | `apply_009_axp_identity.py` + `/srv/rom/secrets/android-certs` |
|
||||
| **Phonesky** | APK parcheado (exact alarm, etc.) | `/srv/rom/prebuilts/phonesky/` — **no** en git |
|
||||
| **Toggles EXTENDROM** | `allow_signature_fake`, `extendrom_call_recording` | `005` sigspoof, `008` call rec / FLAG_SECURE |
|
||||
| **Private DNS lista** | AXP Settings providers | `apply_009_private_dns_providers.py` |
|
||||
| **Connectivity / INTERNET UX** | AXP-class | `apply_009_connectivity_check.py` |
|
||||
| **Disable app clásico** | vs Archive A16 | `apply_009_disable_user_apps.py` |
|
||||
| **OpenSSH en product** | Binarios fuera; `init.openssh.rc` queda | US-S4-1 + `hardening.mk` |
|
||||
| **Referencias build** | EXTENDROM en `rom-dev01` | `/srv/rom/references/extendrom/` |
|
||||
|
||||
**FAQ AXP (Magisk):** tras flash, **sí** a descargar/instalar el **APK** del manager; el paso **Additional setup** que **re-parchea boot** suele **no hacer falta** en preroot (el boot ya va parcheado en bacon). Ver [AXP FAQ](https://github.com/AXP-OS/build/wiki/Frequently-Asked-Questions#magisk-requires-additional-setup-on-start).
|
||||
|
||||
---
|
||||
|
||||
## 5. Kernel: AXP, GrapheneOS-class, CVE
|
||||
|
||||
**Base:** `kernel/google/msm-4.14` @ `4.14.357-openela` (pin LOS `28f9290ae067`), **non-GKI**.
|
||||
|
||||
### 5.1 Ya en LOS (no duplicar)
|
||||
|
||||
CFI, shadow call stack, stack protector, KASLR, PAN, hardened usercopy, restricción perf events, etc. (`docs/009-kernel-hardening-map.md`).
|
||||
|
||||
### 5.2 Stage 1 — parches Graphene/AH vía AXP `kernel_patches`
|
||||
|
||||
~**30 parches** aplicados (deny USB toggle, allocsize, BUG_ON, FORTIFY intra-object, randomize, ro_after_init, sanitize, slab hardened, unused-fn, …).
|
||||
**Omitido por política:** location lockdown (FR-018), LinuxIncrementals, mega CVE hasta fase estable.
|
||||
|
||||
### 5.3 Combo4 + Clang FORTIFY
|
||||
|
||||
- `CONFIG_FORTIFY_SOURCE=y` y opciones slab/init/on alloc tras Stage 1
|
||||
- Fixes de build (LTO/modules qcacld, stubs acotados en bisect histórico)
|
||||
|
||||
### 5.4 CVE
|
||||
|
||||
| Etapa | Contenido |
|
||||
|-------|-----------|
|
||||
| **CVE clean-offset** | ~**429** IDs en `cve-clean-offset.list` (strict apply en bacon) |
|
||||
| **High-offset batches 1–3** | Offsets grandes con `max_abs_offset` elevado |
|
||||
| **Denylist** | p.ej. `CVE-2022-49980` (lock-scope USB) |
|
||||
| **Política** | Atribución en logs `cve-stage/`; no megapatch opaco |
|
||||
|
||||
### 5.5 US-S5-1 (como GOLDEN)
|
||||
|
||||
- `CONFIG_SECURITY_YAMA` **no** activado (Yama `ptrace_scope=2` rompió **PairIP** / anti-debug)
|
||||
- `SLAB_FREELIST_RANDOM=y`, USERFAULTFD off
|
||||
- `KSYM_NAME_LEN=192`; **sin KernelSU** en defconfig ship
|
||||
|
||||
### 5.6 hardened_malloc (`012`)
|
||||
|
||||
- Integrado en bacon OTA (`009-bacon-hardened-malloc.sh`)
|
||||
- Exclusiones SurfaceFlinger/cámara documentadas en árbol bionic
|
||||
|
||||
---
|
||||
|
||||
## 6. Userspace: parches AXP en Android 16
|
||||
|
||||
Scripts bajo `vendor/sunfish-a16/patches/009-axp-los23-port/` (puertos desde árbol AXP legacy **a A16**, no “SDK 35”):
|
||||
|
||||
| Script | Función |
|
||||
|--------|---------|
|
||||
| `apply_009_product_includes.py` | `gms.mk` + `magisk.mk` + **`apps.mk`** + BoardConfig |
|
||||
| `apply_009_axp_identity.py` | release keys, AVB, SPL vendor guard |
|
||||
| `apply_009_axp_branding.py` | branding Pro |
|
||||
| `apply_009_private_dns_providers.py` | lista DNS privado AXP |
|
||||
| `apply_009_connectivity_check.py` | checks de conectividad |
|
||||
| `apply_009_disable_user_apps.py` | Disable clásico |
|
||||
| `apply_009_supl_privacy.py` | SUPL / ubicación (sin lockdown extra FR-018) |
|
||||
| `apply_009_cmdline_mode.py` | cmdline / modo debug (Magisk track) |
|
||||
| `apply_009_yama_ptrace.py` | Yama inerte si no hay Yama en kernel |
|
||||
| `apply_009_a15_*` | timeouts reboot/Wi‑Fi/BT, settings |
|
||||
| `apply_005` / `apply_008` | sigspoof, call recording, FLAG_SECURE DO |
|
||||
| `apply_009_drop_*` | deblob waves (ver §7) |
|
||||
|
||||
**WMS / FLAG_SECURE:** override global opcional (proyecto `008`), default off.
|
||||
|
||||
---
|
||||
|
||||
## 7. Debloob / de-Google selectivo
|
||||
|
||||
**No** se ejecuta `Deblob.sh` por defecto AXP. Oleadas controladas (`AXP_DEBLOB_WAVE4=1` en OTA):
|
||||
|
||||
| Wave | Contenido |
|
||||
|------|-----------|
|
||||
| **1** | Drop **Google EUICC** / LPA (`apply_009_drop_euicc_google.py`) — OpenEUICC en system_ext |
|
||||
| **2** | Carrier Google + AOSP RCS (`apply_009_drop_carrier_google.py`) |
|
||||
| **3** | Herramientas Lineage en system (`bash`, `htop`, `nano`, `unrar`, `addon.d/50-lineage.sh`) — **Swissquote** fallaba con estas en system |
|
||||
| **4** | Comandos solo-LAB / diag (`apply_009_drop_lab_only_commands.py`) |
|
||||
|
||||
**Se mantiene (radio/IMS):** `ims`, `QtiTelephonyService`, `xtra-daemon`, Widevine, `EuiccSupportPixel` donde el spec lo exige, Qualcomm diag en wave 4 parcial según cierre.
|
||||
|
||||
---
|
||||
|
||||
## 8. microG, Play y apps empaquetadas
|
||||
|
||||
### 8.1 Stack deGoogle (servicios)
|
||||
|
||||
| Componente | Ubicación | Versión pin (ej.) |
|
||||
|------------|-----------|-------------------|
|
||||
| **GmsCore** (microG) | `system_ext/app/GmsCore` | `0.3.17.252432` |
|
||||
| **GsfProxy** | `system_ext` | `0.1.0` |
|
||||
| **Phonesky** | `system/priv-app/Phonesky` | `52.9.22-24` (artifact host) |
|
||||
| **JNI GmsCore** | `.../lib/arm64/*.so` | Extraído en bacon (**obligatorio** para Maps) |
|
||||
|
||||
### 8.2 Apps usuario (system_ext / product)
|
||||
|
||||
| App | Paquete | Notas |
|
||||
|-----|---------|-------|
|
||||
| **Aurora Store** | `com.aurora.store` | system_ext |
|
||||
| **Droidify** | `com.looker.droidify` | sustituye cliente F-Droid |
|
||||
| **Fossify Gallery** | `org.fossify.gallery` | no Gallery2/Glimpse |
|
||||
| **Jelly** | `org.lineageos.jelly` | **product** |
|
||||
| **OpenEUICC** | `im.angry.openeuicc` | LPA privilegiada |
|
||||
| **WebView** | `com.android.webview` | **LOS 23** — no Aosmium (EOL); selector multi-proveedor en Dev options |
|
||||
|
||||
Postflight bacon: **US-S4-2** (Jelly), **US-S4-3** (Aurora/Droidify/Fossify en system_ext).
|
||||
|
||||
---
|
||||
|
||||
## 9. Magisk preroot (sin KernelSU en ship)
|
||||
|
||||
| Tema | Detalle |
|
||||
|------|---------|
|
||||
| **Versión** | **30.7** (pin; GOLDEN oracle **29.0**) |
|
||||
| **Build** | Hook `common.py` + `patch.sh` en empaquetado `target_files/IMAGES/boot.img` |
|
||||
| **Verificación host** | `magiskboot cpio ramdisk.cpio test` ≠ 0 en **ship** `boot.img` |
|
||||
| **Artefacto forensics** | `boot-make-out.img` = `out/.../boot.img` **sin** Magisk — **no flashear** |
|
||||
| **Activación** | Abrir app → **download/install** APK real; **evitar** re-parchear boot (Install / inactive slot) |
|
||||
| **UI Ramdisk Yes/No** | Clasificación de **método de instalación**; con preroot puede quedar **No** sin impedir root |
|
||||
| **Módulos GOLDEN** | **No** empaquetados (PIF, hosts, tee sim, …) — usuario instala después |
|
||||
| **KernelSU** | Prohibido en mismo boot que Magisk ship |
|
||||
|
||||
---
|
||||
|
||||
## 10. Hardening userspace y malloc
|
||||
|
||||
| ID | Medida |
|
||||
|----|--------|
|
||||
| **US-S4-1** | Sin `sshd`/`ssh`/`rsync`/`procmem` en product; **sí** `init.openssh.rc` |
|
||||
| **US-S4-2/3** | Superficie apps (Jelly + Fossify + stores) |
|
||||
| **US-S6** | `lineage_sunfish-user` lunch |
|
||||
| **012** | **hardened_malloc** en bionic (ship OTA) |
|
||||
| **SELinux** | Enforcing (medido en LAB) |
|
||||
| **Encryption** | FBE/file encryption estándar |
|
||||
| **Bootloader lock** | **Wont** — AXP/LOS/Magisk asumen unlock |
|
||||
|
||||
---
|
||||
|
||||
## 11. Toggles y políticas de privacidad
|
||||
|
||||
| Toggle / setting | Origen | Comportamiento |
|
||||
|------------------|--------|----------------|
|
||||
| **Signature spoofing** | AXP / `005` | Restricted; Developer Options |
|
||||
| **Call recording unlock** | EXTENDROM / `008` | SQLite / settings key |
|
||||
| **FLAG_SECURE override** | Proyecto `008` | Default off |
|
||||
| **Private DNS providers** | AXP lista | Sin endpoints `axp.os` |
|
||||
| **Connectivity check** | AXP-class | Sin branding AXP en URLs |
|
||||
| **SUPL / XTRA / IZat** | AXP timeouts + switches | Precisión GPS (no extra-cap FR-018) |
|
||||
| **Native debug / Yama props** | `apply_009_yama_ptrace` | Inerte sin Yama en kernel |
|
||||
| **Disable app** | AXP vs Archive A16 | Restaurar disable clásico |
|
||||
|
||||
---
|
||||
|
||||
## 12. Firma, AVB y actualizaciones
|
||||
|
||||
| Tema | Valor ship |
|
||||
|------|------------|
|
||||
| **Firma APK/OAT** | `vendor/lineage-priv/keys/releasekey` |
|
||||
| **AVB key** | `vendor/sunfish-a16/certs/avb.pem` (SHA256_RSA4096) |
|
||||
| **AVB flags** | **0** (runtime unlocked; no “hardened verified boot” Magisk track) |
|
||||
| **Zip OTA** | `payload.bin` sideload; **no** OTA servidor AXP |
|
||||
| **FR-019** | microG, Phonesky, apps — actualización **sideload** cada ~2–3 meses (stub doc) |
|
||||
| **Downgrade** | User builds rechazan SPL vendor < `2023-09-05` |
|
||||
|
||||
**Flash LAB recomendado:** recovery → factory reset → **sideload zip completo**.
|
||||
**Evitar:** `fastboot -w`; mezclar `vbmeta`/`boot` de otro build; flashear solo `boot-make-out.img`.
|
||||
|
||||
---
|
||||
|
||||
## 13. Inspiración GrapheneOS (qué sí / qué no)
|
||||
|
||||
| GrapheneOS / AH | En AXPR |
|
||||
|-----------------|---------|
|
||||
| Parches **kernel** hardening (alloc, fortify, slab, sanitize, …) | **Sí** — vía AXP `kernel_patches` + Stage1 |
|
||||
| **hardened_malloc** | **Sí** (`012`) |
|
||||
| Árbol kernel A13 Graphene sunfish | **No** — base es LOS `msm-4.14` |
|
||||
| Lockdown ubicación Graphene | **No** (FR-018) |
|
||||
| Auditoría attestation bancaria tipo Graphene | **No** como gate; banking deferred |
|
||||
| WebView Vanadium por defecto | **No** — WebView LOS + elección usuario |
|
||||
|
||||
---
|
||||
|
||||
## 14. Verificación y hitos en LAB
|
||||
|
||||
| Hito | Fecha / evidencia |
|
||||
|------|-------------------|
|
||||
| Vanilla LOS boot | `003` — 2026-09-14 |
|
||||
| Stage1 kernel bacon | `20260918T180359Z-axp-kh-stage1` |
|
||||
| CVE bacon | `20260918T215034Z-axp-kh-cve` |
|
||||
| **Closure baseline** wave 3 | `20261009T145241Z` — Swissquote Island **PASS** |
|
||||
| **Final ship** wave4 + malloc | `20261009T172104Z`, `bacon009final` |
|
||||
| **OTA rebacon** pin `20261008` | `20261011T092526Z` — `bacon009ota-r13`, `bacon_exit=0` |
|
||||
|
||||
**Matrices:** `docs/009-capability-matrix.md`, `docs/009-closure-parity-20261009.md`, `docs/axp-pro-parity.md`.
|
||||
|
||||
---
|
||||
|
||||
## 15. Build de referencia actual (oct 2026)
|
||||
|
||||
| Campo | Valor |
|
||||
|-------|--------|
|
||||
| **Directorio** | `/srv/rom/artifacts/009-axp-los23-port/20261011T092526Z-axp-stage1-combo4-cve-hi-releasekeys` |
|
||||
| **Zip** | `AXP-Resurection-Pro-23.2-20261008-sunfish.zip` |
|
||||
| **SHA256 zip** | `91d7adf5435c4e7279123bca4ce72793754384bb341cfbb61522f3411eea2847` |
|
||||
| **boot.img (ship)** | `9e6ec52543445b10279b681f69c055fb240f6910616f569914fe598d77ef7d4f` |
|
||||
| **README artefacto** | Stage1+combo4+FORTIFY+CVE+hi1-3+US-S4+US-S5-1+wave1-4+malloc+releasekeys |
|
||||
| **Script bacon** | `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` |
|
||||
|
||||
---
|
||||
|
||||
## 16. Abierto / no objetivo
|
||||
|
||||
**Abierto:** rebase LOS periódico (`009-upstream-rebase-ota.md`), **Yuh** en Island, FR-019 sideload playbook, llamada **SIM física** gate radio, postflight OTA boot hash = ship boot, animación AXP completa en payload.
|
||||
|
||||
**No objetivo / wont:** KernelSU en ship, NeoLauncher, Aosmium WebView, OTA/repositorios AXP externos, backup ROM integrado, bootloader relock, flash GOLDEN, mezclar track `007` en bacon Magisk.
|
||||
|
||||
**Paralelo:** `007` KernelSU/SusFS — `docs/007-parallel-on-009.md`.
|
||||
|
||||
---
|
||||
|
||||
## 17. Apéndice: scripts de integración
|
||||
|
||||
Bacon entry (host): `scripts/009-rebuild-from-los.sh` → rsync `vendor/sunfish-a16` → `009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh`.
|
||||
|
||||
Wrappers OTA: `009-bacon-hardened-malloc.sh`, `009-bacon-wave4-deblob.sh`.
|
||||
|
||||
Kernel: `vendor/sunfish-a16/patches/009-kernel-hardening/apply_stage1.sh`, `apply-cve-strict.sh`, listas `cve-clean-offset.list`, `cve-high-offset-batch*.list`.
|
||||
|
||||
Checklist pre-bacon: `docs/009-ota-rebuild-checklist.md`.
|
||||
|
||||
---
|
||||
|
||||
## 18. Apéndice: lecciones LAB (Magisk / flash)
|
||||
|
||||
1. **Sideload completo** tras wipe es el camino principal; no depender de reflashear solo `boot` salvo recovery rota.
|
||||
2. **`boot.img` del artefacto** = Magisk; **`boot-make-out.img`** = stock.
|
||||
3. Tras preroot: **download/install** del manager; **no** insistir en Additional setup que re-parchea boot ni **Install inactive slot** (conflicto slots / UI Ramdisk).
|
||||
4. **Ramdisk: No** en la app **no** implica ROM sin Magisk si `magiskd` y **30.7** están activos.
|
||||
5. Flash manual **boot+vbmeta+dtbo** debe ser **juego completo del mismo artefacto**; si no, riesgo de **fastboot loop**.
|
||||
6. **No** bajar vendor SPL bajo **2023-09-05** en upgrades (`init_user0_failed` / rollback Keymaster).
|
||||
|
||||
---
|
||||
|
||||
*Fin del documento. Para el día a día del equipo: `docs/README.md` → `009-handoff-20261008.md`.*
|
||||
@@ -0,0 +1,35 @@
|
||||
# Bundled apps + microG — ship layout (009)
|
||||
|
||||
**Policy (owner):** Aurora + **Droidify** + Fossify Gallery on **`system_ext` only**
|
||||
(not `product`). Jelly stays on `product` (009 gate). Gallery = **Fossify**
|
||||
(`FossifyGallery` module); no LOS Gallery2.
|
||||
|
||||
**Updates:** Same as microG/Phonesky — official APK, `PRESIGNED`,
|
||||
`LOCAL_REPLACE_PREBUILT_APK_INSTALLED`. After user updates, `pm path` may show
|
||||
`/data/app/…`; that is normal on A15 and A16.
|
||||
|
||||
## Paths after flash (AXPR)
|
||||
|
||||
| Package | `system_ext` path |
|
||||
|---------|-------------------|
|
||||
| `com.aurora.store` | `/system_ext/app/AuroraStore/AuroraStore.apk` |
|
||||
| `com.looker.droidify` | `/system_ext/app/Droidify/Droidify.apk` |
|
||||
| `org.fossify.gallery` | `/system_ext/app/FossifyGallery/FossifyGallery.apk` |
|
||||
| `com.google.android.gms` | `/system_ext/app/GmsCore/GmsCore.apk` |
|
||||
| `com.google.android.gsf` | `/system_ext/app/GsfProxy/GsfProxy.apk` |
|
||||
|
||||
Postflight **US-S4-3** checks the three bundled apps on `system_ext.img` and
|
||||
absent from `product.img`.
|
||||
|
||||
## microG JNI (required in image — not adb push)
|
||||
|
||||
GmsCore ships compressed native libs. The bacon script **before `mka`** unpacks
|
||||
`lib/arm64-v8a/*.so` into `vendor/sunfish-a16/prebuilt/GmsCore-jni/arm64/`; Make
|
||||
installs them under `/system_ext/app/GmsCore/lib/arm64/`. Postflight fails if
|
||||
`libconscrypt_gmscore_jni.so` is missing. Without this, Maps/Conscrypt break
|
||||
(same failure as manual push workaround).
|
||||
|
||||
Pre-`mka` also requires `GmsCore`, `GsfProxy`, `Phonesky` in `PRODUCT_PACKAGES`
|
||||
(`gms.mk` via `magisk.mk` / product includes).
|
||||
|
||||
Host prebuilts: `/srv/rom/prebuilts/microg/`, `/srv/rom/prebuilts/axp-apps/`.
|
||||
@@ -3,7 +3,7 @@
|
||||
Maps GOLDEN/`002` + `docs/axp-pro-parity.md` → ship status for **Magisk AXP
|
||||
clone on LOS23**. Authoritative requirements remain `specs/009-axp-los23-port/spec.md`.
|
||||
|
||||
Status: `required` | `exception` | `deferred` | `impossible`
|
||||
Status: `required` | `partial` | `exception` | `deferred` | `impossible`
|
||||
|
||||
| category | golden_ref | status | notes |
|
||||
|----------|------------|--------|-------|
|
||||
@@ -13,7 +13,7 @@ Status: `required` | `exception` | `deferred` | `impossible`
|
||||
| Selectable signature spoofing | `005` / GOLDEN `allow_signature_fake` | required | Restricted; DO toggle |
|
||||
| Selectable call-recording unlock | `008` / GOLDEN `extendrom_call_recording` | required | EXTENDROM key |
|
||||
| Magisk preroot + DenyList-class | GOLDEN Magisk 29.0 / Magia | required | Newest Magisk; EXTENDROM-class boot patch |
|
||||
| Bundled usability apps (Aurora, Droidify, gallery, …) | `002` / parity | required | Newest workable; **Droidify** (light + many default repos); **no NeoLauncher** |
|
||||
| Bundled usability apps (Aurora, Droidify, gallery, …) | `002` / parity | required | All on `system_ext`; Fossify gallery; **no NeoLauncher** |
|
||||
| Private DNS presets (AXP-class provider list) | AXP Settings | required | Clone AXP private-DNS entries; no AXP OTA/repos |
|
||||
| Internet connectivity / INTERNET special permission UX | AXP/Graphene-class | required | Keep behaviour; **do not** integrate `axp.os` endpoints/branding |
|
||||
| Disable app (classic) vs Archive | AOSP/LOS A16 Archive | required | Restore usable **Disable** on A16; Archive alone disliked by owner |
|
||||
@@ -23,23 +23,23 @@ Status: `required` | `exception` | `deferred` | `impossible`
|
||||
| Bootloader lock / relock | IOdes-class | wont | AXP/LOS unlocked norm; Magisk preroot assumes unlocked |
|
||||
| Kernel update + hardening | parity / FR-017 | required | LOS23 sunfish kernel + attributable patches |
|
||||
| WebView | GOLDEN Aosmium | exception | LOS23 WebView default; chooser unlocked; no Aosmium |
|
||||
| Banking / Island / Swissquote / Yuh | `002` Gate E | deferred | Owner future (2026-09-17); not MVP |
|
||||
| Banking / Island / Swissquote / Yuh | `002` Gate E / `009` | partial | **Swissquote PASS** LAB Island (2026-10-09); **Yuh open** (`009-yuh-golden-lab-hypothesis.md`) |
|
||||
| Localization / location hardening AXP vs LOS | owner complaint | deferred | FR-018 — **do not extra-cap** vs LOS for ship (2026-09-18); no MVP toggle; compare doc later only |
|
||||
| NeoLauncher | AXP default | wont | Owner: do not integrate; LOS Launcher3 |
|
||||
| F-Droid client (`org.fdroid.fdroid`) | GOLDEN | substitute | Prefer **Droidify** |
|
||||
| F-Droid client (`org.fdroid.fdroid`) | GOLDEN | substitute | Ship **Droidify** on `system_ext` |
|
||||
| AXP external market repos / AXP OTA servers | AXP EOL infra | wont | Servers down / EOL — do not wire |
|
||||
| Sideloadable system package refresh (microG, Magisk, Phonesky, …) | owner cadence ~2–3 mo | required | FR-019 — same-signer / PRESIGNED / Magisk update path; no OTA |
|
||||
| KernelSU / SusFS | `007` | deferred | Out of ship; optional recycle FR-016 |
|
||||
| AXP backup ROM feature | parity | impossible / wont | External NeoBackup only |
|
||||
| FLAG_SECURE global override | project `008` | deferred | Nice-to-have; not AXP hard gate |
|
||||
| FLAG_SECURE global override | project `008` | required | Landed via `009` pack (DO toggle) |
|
||||
|
||||
## Bundled packages observed on GOLDEN (2026-09-17 `pm list packages -s`)
|
||||
|
||||
| package | role | matrix |
|
||||
|---------|------|--------|
|
||||
| `com.aurora.store` | Aurora | required (pin newest) |
|
||||
| `com.looker.droidify` | Droidify (F-Droid client) | required — preferred over `org.fdroid.fdroid` |
|
||||
| `org.fdroid.fdroid` | F-Droid | substitute / skip unless packaging forces it |
|
||||
| `com.looker.droidify` | Droidify (F-Droid client) | required |
|
||||
| `org.fdroid.fdroid` | F-Droid | substitute / not shipped |
|
||||
| `org.fossify.gallery` | Fossify Gallery | required |
|
||||
| `com.stevesoltys.seedvault` | Seedvault | often los-provides |
|
||||
| `com.android.launcher3` | Launcher | los-provides — **no NeoLauncher** |
|
||||
|
||||
@@ -38,9 +38,13 @@ GOLDEN was not on USB for this pass; oracle uses
|
||||
**Removed in wave 3 (was LAB-only, absent on GOLDEN):** `bash`, `htop`,
|
||||
`nano`, `unrar`, `addon.d/50-lineage.sh`.
|
||||
|
||||
**Still LAB-only vs GOLDEN (deferred wave 4):** Qualcomm `diag_*`, `test_diag`,
|
||||
`imsrcsd`, `disable_configstore`, AOSP debug bins (`bpftool`, `alloctop`,
|
||||
`pbtombstone`, `apexd-lsof.sh`). Not required for Swissquote PASS.
|
||||
**Wave 4 drops:** Qualcomm `diag_*`, `test_diag`, `imsrcsd`, AOSP debug bins
|
||||
(`bpftool`, `alloctop`, `pbtombstone` system copy, `apexd-lsof.sh`). Not
|
||||
required for Swissquote PASS.
|
||||
|
||||
**Keep (2026-10-16 correction):** `disable_configstore` — AOSP override for the
|
||||
HIDL configstore HAL; required on A16 VINTF. See
|
||||
`docs/009-lab-polish-20261016.md`.
|
||||
|
||||
**Kept like GOLDEN:** `curl` (`/system/bin`), `vim` (`/system_ext`).
|
||||
|
||||
@@ -52,10 +56,10 @@ reset → sideload full zip → reboot system.
|
||||
|
||||
## Repo vs next bacon
|
||||
|
||||
- `apply_009_drop_lab_only_commands.py` exists but is **commented out** in the
|
||||
ship script (wave 4 deferred).
|
||||
- Optional later: `scripts/009-bacon-hardened-malloc.sh` (012) — separate bacon;
|
||||
not in the booted wave 3 image.
|
||||
- Wave 4 (`apply_009_drop_lab_only_commands.py`) runs when `AXP_DEBLOB_WAVE4=1`.
|
||||
The booted closure zip may predate that flag.
|
||||
- **Next OTA** must use `scripts/009-rebuild-from-los.sh`, which always enables
|
||||
wave 4 and `hardened_malloc`. Not optional.
|
||||
- Host keys: `/srv/rom/secrets/android-certs` (2026-10-09); `~/.android-certs`
|
||||
symlinks there. Backup `~/backups/android-certs-secrets-20261009T1517Z.tar.gz`.
|
||||
|
||||
@@ -85,7 +89,7 @@ cmdline). Refresh this doc when a live GOLDEN dump exists.
|
||||
| Script | Purpose |
|
||||
|--------|---------|
|
||||
| `scripts/009-bacon-wave4-deblob.sh` | wave 4 lab-only command drops |
|
||||
| `scripts/009-bacon-hardened-malloc.sh` | 012 hardened_malloc (2 GiB regions) |
|
||||
| `scripts/009-bacon-hardened-malloc.sh` | **Final ship:** wave 4 + hardened_malloc (2 GiB), AVB flags 0 |
|
||||
|
||||
Launch on `rom-dev01` via `rom-detach`; never two ninjas on one `out/`.
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# 009 CVE bisect plan (after full CVE Google-logo hang)
|
||||
|
||||
**Baseline GOOD:** Stage1 + combo4 + Clang FORTIFY
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# FORTIFY: auditoría del build 20260926T183144Z
|
||||
|
||||
Revisión de solo lectura en rom-dev01. Sin compilaciones ni flasheos nuevos.
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# FORTIFY bounds: enlace correcto, arranque fallido
|
||||
|
||||
Artefacto remoto: `20260926T223246Z-bisect-ksync-fortify-bounds` bajo
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> **Status: attribution reference only** (Clang FORTIFY). Not a runbook. Ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# FORTIFY + Clang en msm-4.14 (plan de port)
|
||||
|
||||
Documento de preparación. No es un parche listo. Relacionado:
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# Plan: captura verificable del fallo FORTIFY
|
||||
|
||||
> Revisión posterior: [auditoría del diagnóstico del 27/09](009-fortify-diag-review-20260927.md).
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# FORTIFY diagnostic review — 2026-09-27
|
||||
|
||||
## Conclusion
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# Diagnostic v2 review — 2026-09-27
|
||||
|
||||
Reviewed local `apply_fortify_diag.py` and generated remote
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# Diagnostic v3 review — 2026-09-27
|
||||
|
||||
Checked the local generator and remote generated kernel/axp_diag_capture.c,
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# FORTIFY family bisection — 2026-09-27
|
||||
|
||||
## Why this experiment
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# Revisión del port FORTIFY en curso — 2026-09-26, 21:25 UTC
|
||||
|
||||
Revisión de solo lectura del servidor; no se han editado scripts en ejecución.
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# FORTIFY POS0: dos errores localizados y corrección candidata
|
||||
|
||||
Revisión del job `009-bisect-ksync-fortify-pos0`, que terminó con exit=1
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# v4 capture results review — 2026-09-27
|
||||
|
||||
## Result
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# Verification of clean C and X experiments — 2026-09-27
|
||||
|
||||
Independently parsed the binary dumps and recorded kernel/boot properties in:
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
# Gate G / FR-017 — kernel hardening attribution (ship candidate)
|
||||
|
||||
> **Measured LAB closure (2026-10-09):** `user` + `release-keys` + Magisk 30.7
|
||||
> pack — see [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md).
|
||||
> Tables below that still say Oct-1 / “userspace Gate G open / test-keys” are
|
||||
> **historical acceptance**; prefer closure for current props.
|
||||
|
||||
**What “Gate G doc” means:** the acceptance contract asks for a written list of
|
||||
**what kernel hardening we applied, what we skipped and why**, plus userspace
|
||||
AVB/signing gaps (or “impossible on this stack”). This file is that list for the
|
||||
|
||||
@@ -4,11 +4,20 @@ Start here. Older remaining-work docs still describe the tree from before
|
||||
LAB booted the 2026-10-08 zip. This file is the execution map for the
|
||||
final ROM. Do not commit unless the owner asks. Do not flash GOLDEN.
|
||||
|
||||
**Before every OTA bacon on host:** re-read
|
||||
[`009-ota-rebuild-checklist.md`](009-ota-rebuild-checklist.md) (includes bundled
|
||||
apps / `apps.mk` + US-S4-3 as of 2026-10-10).
|
||||
|
||||
**Device roles (2026-10-16):** LAB = owner daily driver (no wipe/flash without
|
||||
ask). GOLDEN runs our build (debug OK). AXP oracle = a16 refs, not live GOLDEN.
|
||||
Polish backlog: [`009-lab-polish-20261016.md`](009-lab-polish-20261016.md)
|
||||
(configstore + EuiccDisabler fixes in WT for next bacon).
|
||||
|
||||
## Hard rules already paid for
|
||||
|
||||
- LAB only: `11231JEC207477`. GOLDEN `11071JEC203839` is the live oracle.
|
||||
It may be plugged in at the same time. Never flash, wipe, or change Magisk
|
||||
on it. Always `adb -s 11231JEC207477`.
|
||||
- LAB `11231JEC207477` = owner daily driver — no wipe/flash without explicit
|
||||
ask. GOLDEN `11071JEC203839` = test phone (our build OK). AXP oracle =
|
||||
`a16.ssystems.de` refs, not live GOLDEN. Use `adb -s <serial>` deliberately.
|
||||
- Do not factory-reset LAB except an **owner-driven scratch** (recovery wipe +
|
||||
sideload closure zip). The recovery screen "Can't load Android system /
|
||||
data may be corrupt / reason=init_user0_failed" is **not** corrupt data.
|
||||
@@ -28,6 +37,13 @@ final ROM. Do not commit unless the owner asks. Do not flash GOLDEN.
|
||||
|
||||
## Running now
|
||||
|
||||
**Polish full bacon (2026-10-16, host):** session `bacon009polish20261016`,
|
||||
stage `worktree-20261016-polish`, `LOS_DATE=20261016`, fixes in
|
||||
[`009-lab-polish-20261016.md`](009-lab-polish-20261016.md). Status/log:
|
||||
`/srv/rom/artifacts/detach-bacon009polish20261016.*`. Laptop relaunch:
|
||||
`scripts/009-sync-ota-stage-to-host.sh` + `scripts/009-relaunch-polish-bacon.sh`.
|
||||
Migration export: [`009-laptop-migration-20261016.md`](009-laptop-migration-20261016.md).
|
||||
|
||||
**Closure baseline (booted, Swissquote Island PASS):** wave 3 zip
|
||||
`20261009T145241Z-axp-stage1-combo4-cve-hi-releasekeys`
|
||||
SHA256 `7cd20e4d218bc04f0b4a31838a5bb9040db36148a2b38d90342b3bc9f224a5fd`.
|
||||
@@ -40,11 +56,12 @@ exits `-69` in Island after wave 3 (Lineage tools removal). Parity notes:
|
||||
| Item | Status |
|
||||
|------|--------|
|
||||
| Keys → `/srv/rom/secrets/android-certs` | done |
|
||||
| Scratch reinstall (virgin `/data`, same closure zip) | `boot_a`/`boot_b` flashed 2026-10-09; recovery **unauthorized** — owner: USB auth → Factory reset → sideload zip in `/tmp/axp-closure-scratch/` (laptop) or host artifact dir |
|
||||
| Interim scratch (wave 3 only, `/data` limpio) | **done** 2026-10-09: sideload `7cd20e4d…` `Total xfer: 2.00x` — reboot system from recovery |
|
||||
| **Final scratch** (wave 4 + malloc zip) | **sideloaded** 2026-10-09 ~20:10 local on LAB `11231JEC207477`. Boot both slots `75dd81bf…`. Zip `47a7e545…` `Total xfer: 2.00x`. Reboot system from recovery, then owner test |
|
||||
| `~/.android-certs.pre-secrets-20261009` removed on host | done |
|
||||
| GOLDEN package/cmdline parity | needs GOLDEN USB or reference dump |
|
||||
| `bacon009wave4` (diag drop) | **running** `2026-10-09T15:29:17Z` — log `detach-bacon009wave4-20261009T152917Z.log` |
|
||||
| `bacon012malloc` (hardened_malloc) | **queue after wave4** (one `out/`): `rom-detach bacon012malloc -- /srv/rom/artifacts/bin/009-bacon-hardened-malloc.sh` |
|
||||
| `bacon009wave4b` | **stopped** 2026-10-09 ~16:11 UTC (avoid duplicate full ROM) |
|
||||
| `bacon009final` (wave 4 + malloc) | **FLASH_READY** `20261009T172104Z-axp-stage1-combo4-cve-hi-releasekeys`. Bacon exit 0; wrapper exit 1 was postflight `simg2img` on raw-ext4 `vendor.img` (script fixed: sparse-magic check). Postflight tail re-run 17:50 UTC: wave 4 + US-S4-2 OK. Bootanimation stays Lineage (no AXP asset in GOLDEN/PRO payload) |
|
||||
| Physical-SIM call gate | owner — before more radio deblob |
|
||||
| Git commit of repo closure deltas | owner asked 2026-10-09 |
|
||||
|
||||
@@ -632,13 +649,22 @@ Not committed. Do not revert while picking up a later item.
|
||||
the identity/kernel applies. Laptop scripts were rsynced to
|
||||
`/srv/rom/artifacts/bin/`.
|
||||
|
||||
## Docs that will lie to you
|
||||
## Docs hygiene (2026-10-10)
|
||||
|
||||
- `docs/009-axp-graphene-remaining.md` — pre-boot order. Pointer added.
|
||||
- `docs/009-hardening-signing-checklist.md` — still says test-keys,
|
||||
`userdebug`, and "hardened_malloc later". The booted zip is `user` +
|
||||
`release-keys`, and malloc is the bacon in flight.
|
||||
- `docs/009-user-zip-audit-20261007.md` — an older unflashed zip. Jelly is
|
||||
**kept** now; that audit's "Jelly absent" line is obsolete.
|
||||
- `docs/009-version-pins.md` — still right for microG, Magisk 30.7, Phonesky,
|
||||
OpenEUICC. Add the malloc pin when that bacon is accepted.
|
||||
Index refreshed: `docs/README.md`, `specs/README.md`, `docs/archive/README.md`.
|
||||
Upstream rebase / first OTA: `docs/009-upstream-rebase-ota.md`.
|
||||
Remaining roadmap: `docs/009-axp-graphene-remaining.md` (rewritten).
|
||||
|
||||
Still treat as **historical** (banners added): all `009-fortify-*`,
|
||||
`009-cve-bisect-plan.md`, `009-lab-acceptance-20261002-*`,
|
||||
`009-user-zip-audit-20261007.md`.
|
||||
|
||||
**Parallel (keep, not historical trash):** `007-*` +
|
||||
`docs/007-parallel-on-009.md` — ReSukiSU/SusFS retry on current Magisk ROM;
|
||||
never into Magisk ship bacon.
|
||||
|
||||
Still polish when touching them: `009-hardening-signing-checklist.md` and
|
||||
`009-gate-g-kernel-attribution.md` mid-body tables may still show older
|
||||
`test-keys` / Oct-1 artifacts — prefer closure parity for measured LAB state.
|
||||
`009-version-pins.md` — microG / Magisk 30.7 / Phonesky OK; add upstream LOS
|
||||
pin when the next rebase starts.
|
||||
@@ -1,17 +1,21 @@
|
||||
# 009 — Userspace hardening / signing / AVB checklist (Gate G)
|
||||
|
||||
> **Closure measured 2026-10-09:** LAB ship is `user` + `release-keys` + AVB
|
||||
> flags 0 + Magisk preroot + malloc. Prefer
|
||||
> [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md) over the
|
||||
> 2026-09-29 baseline table below (kept for archaeology).
|
||||
|
||||
**Task:** T040.
|
||||
**Companion:** kernel half = `docs/009-gate-g-kernel-attribution.md`.
|
||||
**Policy (2026-09-29):** project **release keys yes**; **bootloader relock no**
|
||||
(AXP/LOS unlocked norm; IOdes-class lock = non-goal). See
|
||||
`specs/009-axp-los23-port/research.md`.
|
||||
**Policy:** project **release keys yes**; **bootloader relock no**
|
||||
(AXP/LOS unlocked norm). See `specs/009-axp-los23-port/research.md`.
|
||||
|
||||
Secrets never enter Git. Host material lives under `/srv/rom/secrets/` on
|
||||
`rom-dev01` only.
|
||||
|
||||
---
|
||||
|
||||
## Measured baseline (2026-09-29)
|
||||
## Measured baseline (2026-09-29 — historical)
|
||||
|
||||
| Prop / fact | GOLDEN (AXP Pro) | LAB (Stage1 pack) | Target |
|
||||
|-------------|------------------|-------------------|--------|
|
||||
@@ -193,7 +197,7 @@ See `docs/009-us-s4-userspace-hardening.md`.
|
||||
| Candidate | Priority | Notes |
|
||||
|-----------|----------|-------|
|
||||
| Confirm SELinux Enforcing + encryption | **done** | LAB Enforcing + FBE |
|
||||
| ptrace/Yama | **done US-S5-1** | LAB `162840Z` `CONFIG_SECURITY_YAMA=y` |
|
||||
| ptrace/Yama | **reverted 2026-10-10** | Yama off like GOLDEN; scope 2 broke PairIP (Wallapop) |
|
||||
| Debug/bugreport surface trim | **done US-S4-1** | AXP PRO product oracle |
|
||||
| Jelly + Gallery2 debloat | **US-S4-2 wired** | AXP PRO product; Fossify kept |
|
||||
| mount flags / noexec where stock allows | early | don't break HW |
|
||||
@@ -208,7 +212,7 @@ attribution. One stage per bacon when risk is unclear.
|
||||
**Do not** flash old `20260918*-axp-kh-cve` / `kh-full` (logo hang).
|
||||
|
||||
- [x] CVE clean-offset 429 + hi-batch1–3 on Magisk ship (`151944Z` LAB OK)
|
||||
- [x] **US-S5-1** LAB OK (`162840Z`): `CONFIG_SECURITY_YAMA=y` +
|
||||
- [x] **US-S5-1** LAB OK (`162840Z`): Yama since reverted to unset (PairIP) +
|
||||
`CONFIG_SLAB_FREELIST_RANDOM=y` — see
|
||||
`docs/009-lab-acceptance-20261002-uss5.md`
|
||||
- [ ] **Next cycle after the user image is accepted** (owner 2026-10-06):
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# Auditoría de los fallos de arranque del kernel — 2026-09-26
|
||||
|
||||
Revisión de documentación local, scripts, fuentes y artefactos de `rom-dev01`.
|
||||
|
||||
@@ -109,7 +109,7 @@ Full machine log:
|
||||
| KH-LOC | AXP location lockdown | AXP | Y | — | **skip** | FR-018 |
|
||||
| KH-IODE | Iodé kernel delta | Iodé | — | — | **skip** | No sunfish 4.14 fork found |
|
||||
| KH-CFG | Hardening defconfig | LOS+AXP | — | Y | **stage1 after patches** | Flip gaps that Kconfig allows post-patch |
|
||||
| KH-US-S5-1 | Yama + SLAB_FREELIST_RANDOM | Graphene/AXP class | Y | Y | **apply** | `apply_uss5_1_defconfig.sh`; LSM already listed yama |
|
||||
| KH-US-S5-1 | SLAB_FREELIST_RANDOM (Yama off like GOLDEN) | Graphene/AXP class | Y | Y | **apply** | `apply_uss5_1_defconfig.sh`; Yama scope 2 broke PairIP, reverted 2026-10-10 |
|
||||
|
||||
### Stage 1 apply list (exact files)
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# LAB acceptance note — 20261002T103558Z (AVB infra ship)
|
||||
|
||||
Device: `11231JEC207477`
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# LAB acceptance — 20261002T151944Z (US-S4-1 + Pro branding)
|
||||
|
||||
Device: `11231JEC207477`
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# LAB acceptance — 20261002T162840Z (US-S5-1 Yama + SLAB_FREELIST_RANDOM)
|
||||
|
||||
Device: `11231JEC207477`
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
# 009 — Device polish after LAB daily-driver / GOLDEN rebacon (2026-10-16)
|
||||
|
||||
Owner test of the current Magisk ship zip. LAB is the daily driver (do not
|
||||
wipe/flash without an explicit owner ask). GOLDEN was factory-reset and now
|
||||
runs **our** build — it is no longer a live AXP.OS oracle.
|
||||
|
||||
**ADB / debug:** GOLDEN `11071JEC203839` (connected). Prefer GOLDEN for
|
||||
`logcat` / vendor probes. LAB `11231JEC207477` stays main phone — read-only
|
||||
unless the owner says otherwise.
|
||||
|
||||
**AXP parity oracle:** code and dumps on `a16.ssystems.de`
|
||||
(`/srv/rom/references/axp/`, EXTENDROM, archived golden captures) — **not**
|
||||
the live GOLDEN system anymore.
|
||||
|
||||
Measured on GOLDEN (our zip): `23.2-20261008-PRO-sunfish`,
|
||||
`ro.build.date=Sun Oct 11 08:24:09 UTC 2026`, kernel
|
||||
`4.14.357-openela-g28f9290ae067-dirty #81`.
|
||||
|
||||
## Priority high
|
||||
|
||||
### 1. configstore-hal / VINTF — **root cause + fix in WT**
|
||||
|
||||
- Every ~5s: `android.hardware.configstore@1.1::ISurfaceFlingerConfigs/default`
|
||||
must be in VINTF manifest → service aborts and init restarts it.
|
||||
- Present on current zip: `/vendor/etc/init/android.hardware.configstore@1.1-service.rc`
|
||||
(service `vendor.configstore-hal`), binary under `/vendor/bin/hw/…`.
|
||||
- **Root cause:** `build/make/target/product/base_vendor.mk` pulls
|
||||
`android.hardware.configstore@1.1-service` via
|
||||
`PRODUCT_PACKAGES_SHIPPING_API_LEVEL_29`. Lineage
|
||||
`device/google/sunfish/device-lineage.mk` normally packages
|
||||
`disable_configstore` (Soong `overrides` stub) so the HIDL HAL is **not**
|
||||
installed. Wave 4 treated that as a “lab-only command” and removed it →
|
||||
empty Configstore stanza → real HAL ships → A16 VINTF crash-loop.
|
||||
- **Fix (local WT):** `apply_009_drop_lab_only_commands.py` no longer drops
|
||||
`disable_configstore`; it **restores** it if missing. Bacon postflight
|
||||
requires HAL+rc absent and `/vendor/bin/disable_configstore` present.
|
||||
- Lands on next bacon/OTA; no live flash of LAB.
|
||||
|
||||
### 2. Thermal — keep both; fix false HAL ERROR (WT)
|
||||
|
||||
**Why two:** complementary, not duplicates.
|
||||
|
||||
| Process | Role |
|
||||
|---------|------|
|
||||
| `android.hardware.thermal-service.pixel` | Android HAL: temps + cooling device *reporting* (`thermal_info_config.json`) |
|
||||
| `thermal-engine` | QC closed-loop: CPU/GPU/`fcc`/`modem` actions in `thermal-engine-sunfish.conf` |
|
||||
|
||||
Stock packaging on a16: `device.mk` packs the pixel HAL; vendor +
|
||||
`init.hardware.rc` start `vendor.thermal-engine`.
|
||||
|
||||
**pixel-thermal ERROR root cause (confirmed):**
|
||||
`thermal_info_config_sunfish.json` lists CoolingDevices
|
||||
(`thermal-cpufreq-0/7`, `thermal-devfreq-0`, `fcc`) but has **zero**
|
||||
`BindedCdev`/`CdevRequest`. Only sunfish among `device/google/*/thermal_info*`
|
||||
is unbound like that — by design (engine mitigates). Newer pixel HAL still
|
||||
runs `logCoolingDeviceStatus()` ~every few minutes and
|
||||
`getCdevMaxRequest()` ERROR-spams for every unbound cdev. Sensors still read
|
||||
OK (`skin-therm-monitor`, etc.). Parallel stack works; log was lying.
|
||||
|
||||
**Fix:** `apply_009_thermal_cdev_log.py` — skip unbound cdevs in the CDEV log
|
||||
(VERBOSE note); real binded-path ERROR unchanged.
|
||||
|
||||
**thermal-engine (Magisk su 2026-10-16 after Magisk install):** both services
|
||||
`running`, `vendor.thermal.link_ready=1`. Sysfs has full cooling set
|
||||
(`fcc`, `thermal-cpufreq-*`, `thermal-devfreq-0`, `modem_*`, `adsp_vdd`, …).
|
||||
Boot `dmesg`: early `Couldn't get temp USB port thermal zone rc=-22` (before
|
||||
zones ready), charger WLC cooling missing (wireless), SELinux deny
|
||||
`hal_power` → `hal_thermal` find (separate). No live ion/msm_thermal spam in
|
||||
current buffers after reboot — treat earlier reports as boot noise unless
|
||||
reproduced under load. Keep engine.
|
||||
|
||||
## Priority medium
|
||||
|
||||
### 3. OpenEUICC / EuiccDisabler — **fix in WT**
|
||||
|
||||
- `im.angry.openeuicc` installed (`/system_ext/priv-app/OpenEUICC`).
|
||||
- Crash path is **GoogleParts**
|
||||
`device/google/sunfish/parts/.../EuiccDisabler.java`
|
||||
(`org.lineageos.settings.EuiccDisabler`), not EuiccPolicy Kotlin (that
|
||||
already guards). Stack: `Unknown package: com.google.android.euicc`.
|
||||
- **Fix:** `apply_009_euicc_disabler_guard.py` — skip missing packages before
|
||||
`setApplicationEnabledSetting`. Does not retarget to OpenEUICC / does not
|
||||
disable `im.angry.openeuicc`. Wired into ship bacon after wave1 euicc drop.
|
||||
|
||||
### 4. MediaCodec / media_quality — **closed (expected on phone)**
|
||||
|
||||
Reproduced 2026-10-16 on GOLDEN (Jelly browser → HW VP9 `c2.qti.vp9.decoder`):
|
||||
|
||||
- `media_quality service unavailable, skipping updatePictureProfile` is
|
||||
**ALOGI**. `MediaQualityService` only starts when
|
||||
`mediaQualityFw() && isTv` (`SystemServer.java`). Phones never publish
|
||||
`media_quality`; MediaCodec skips picture profiles. Not a VINTF/codec bug.
|
||||
- `Failed to query component interface …: 6` = `BAD_INDEX` while probing C2
|
||||
allocator params; same session then creates pools **OK** and plays video.
|
||||
- **No ROM fix.** Do not ship TV MediaQuality just to silence an INFO line.
|
||||
|
||||
### 5. Audio SLIM_0_RX Format — **root cause known; no simple ship fix**
|
||||
|
||||
Reproduced on every speaker open (browser video). Audio still works.
|
||||
|
||||
- Card id: `sm6150bolerosnd` (Bolero / CDC-DMA, not classic Slimbus).
|
||||
- Proprietary `audio.primary.sm6150.so` (vendor blob) defaults
|
||||
`is_slimbus_interface=true` and only clears it for an allowlist of
|
||||
full card names (`sm6150-idp-snd-card`, `sm6150-qrd-snd-card`, …).
|
||||
**`sm6150bolerosnd` is missing** → HAL looks up `SLIM_0_RX Format`, which
|
||||
does not exist; Bolero expects `WSA_CDC_DMA_RX_0 Format` (same logic exists
|
||||
in CAF `platform.c` behind `!is_slimbus_interface`).
|
||||
- Soft-fail: ALOGE then continues (channel map / playback OK).
|
||||
- **Fix would mean** rebuilding/replacing `audio.primary.sm6150` from CAF with
|
||||
one card-name allowlist line — not a mixer_paths XML tweak. Deferred unless
|
||||
we deliberately take on audio HAL from source (risk vs log noise).
|
||||
|
||||
## Build hygiene
|
||||
|
||||
- Kernel uname shows `-dirty` on this bacon — rebuild from a clean tree or
|
||||
document intentional WT deltas in the artifact notes.
|
||||
- Non–Direct Boot apps (e.g. Metrolist) can crash before unlock — app issue,
|
||||
not ROM.
|
||||
|
||||
## Does not need changes (this session)
|
||||
|
||||
F2FS / storage, AVB/verity, encryption, SELinux enforcing, Wi‑Fi / BT / calls /
|
||||
camera / video / audio functional path. Nora display-during-video is device-
|
||||
specific, not ROM.
|
||||
|
||||
## Next bacon / OTA note
|
||||
|
||||
This list is **device polish**, not the full upstream OTA path. Still follow
|
||||
`docs/009-ota-rebuild-checklist.md` + `docs/009-upstream-rebase-ota.md` for
|
||||
sync / Magisk / apps gates. Land polish as vendor apply scripts + postflight
|
||||
checks where possible.
|
||||
|
||||
### Host commands (2026-10-16 polish bacon)
|
||||
|
||||
```bash
|
||||
# From laptop (after WT edits):
|
||||
./scripts/009-sync-ota-stage-to-host.sh
|
||||
./scripts/009-relaunch-polish-bacon.sh
|
||||
|
||||
# On rom-dev01:
|
||||
cat /srv/rom/artifacts/detach-bacon009polish20261016.status
|
||||
tmux attach -t bacon009polish20261016 # optional
|
||||
```
|
||||
|
||||
Apply wiring in ship bacon (order): euicc guard → thermal CDEV log → … → wave4
|
||||
`drop_lab_only_commands` (configstore restore). See
|
||||
`scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh`.
|
||||
@@ -0,0 +1,149 @@
|
||||
# Laptop migration — AXPR (2026-10-16)
|
||||
|
||||
Portable bundle for moving **AXP_Resurection** + **sunfish-a16-rom** to a new
|
||||
machine without Cursor chat history. Agents should read this file after
|
||||
`AGENTS.md` and `docs/009-handoff-20261008.md`.
|
||||
|
||||
## USB layout (this export)
|
||||
|
||||
```
|
||||
AXPR/
|
||||
README-FIRST.md → copy of this doc (short pointer)
|
||||
MANIFEST.txt → rsync timestamp + paths
|
||||
Workspaces/
|
||||
AXP_Resurection/ → full git tree (incl. uncommitted WT)
|
||||
sunfish-a16-rom/ → parallel KernelSU / standby meta repo
|
||||
laptop-home/
|
||||
ssh/id_ed25519_rom_dev01 → rom-dev01 / a16.ssystems.de (mode 600 on restore)
|
||||
ssh/id_ed25519_rom_dev01.pub
|
||||
android/ → adbkey + debug.keystore (optional USB debug)
|
||||
```
|
||||
|
||||
**Not on USB (stays on server):** Lineage `out/`, ccache, release keys
|
||||
(`/srv/rom/secrets/android-certs`), prebuilt APKs under `/srv/rom/prebuilts/`,
|
||||
AXP reference trees under `/srv/rom/references/`.
|
||||
|
||||
## New laptop — minimum setup
|
||||
|
||||
1. Restore workspaces under `~/Workspaces/` (or any path; update scripts if moved).
|
||||
2. Install private key:
|
||||
```bash
|
||||
mkdir -p ~/.ssh && chmod 700 ~/.ssh
|
||||
cp laptop-home/ssh/id_ed25519_rom_dev01 ~/.ssh/
|
||||
chmod 600 ~/.ssh/id_ed25519_rom_dev01
|
||||
```
|
||||
3. Wire SSH (repo ships client config):
|
||||
```sshconfig
|
||||
# in ~/.ssh/config
|
||||
Include ~/Workspaces/AXP_Resurection/docs/ssh/config
|
||||
```
|
||||
4. Verify host:
|
||||
```bash
|
||||
ssh -F ~/Workspaces/AXP_Resurection/docs/ssh/config a16-build 'whoami; hostname'
|
||||
```
|
||||
5. **Gitea + web UI** — see [Gitea and services](#gitea-and-services) below.
|
||||
6. Optional: `cp laptop-home/android/adbkey* ~/.android/` for same ADB RSA trust.
|
||||
|
||||
Host runbook: `docs/001-host-runbook.md`. Device roles: `docs/device-roles.md`.
|
||||
|
||||
## Gitea and services
|
||||
|
||||
| Layer | What |
|
||||
|-------|------|
|
||||
| URL | https://a16.ssystems.de/ (Gitea), https://a16.ssystems.de/semaphore/ |
|
||||
| Edge auth | nginx **HTTP Basic** (user `sunfish`) — password on host only: `/srv/rom/secrets/web-htpasswd.txt` (read as root on `rom-dev01`; not in Git) |
|
||||
| Gitea login | `sunfish-admin` — app password/token on host: `/srv/rom/secrets/gitea-admin.txt` |
|
||||
| Git transport | HTTPS through nginx (`DISABLE_SSH=true` on Gitea) |
|
||||
|
||||
**Clone / update (canonical branches):**
|
||||
|
||||
```bash
|
||||
git clone https://a16.ssystems.de/sunfish-admin/AXP-Resurection.git
|
||||
cd AXP-Resurection && git checkout 009-axp-los23-port
|
||||
|
||||
git clone https://a16.ssystems.de/sunfish-admin/sunfish-a16-rom.git
|
||||
cd sunfish-a16-rom && git checkout standby-ksu-split-roadmap
|
||||
```
|
||||
|
||||
Configure `git credential` or a personal access token in Gitea (Settings →
|
||||
Applications) on the new laptop. Without credentials, `git fetch`/`push` fails
|
||||
after nginx Basic.
|
||||
|
||||
**Branches (2026-10-16):**
|
||||
|
||||
| Repo | Ship / active branch | Notes |
|
||||
|------|----------------------|--------|
|
||||
| `AXP-Resurection` | `009-axp-los23-port` | Magisk 009; `main` is older |
|
||||
| `sunfish-a16-rom` | `standby-ksu-split-roadmap` | KernelSU parallel; `main` |
|
||||
|
||||
**Not in Git:** `artifacts/` bootanimation PNG tree (~GB; optional on USB bundle),
|
||||
`/srv/rom/prebuilts/`, release keys, SSH private key (USB `laptop-home/ssh/`).
|
||||
|
||||
## Git state at export (AXP_Resurection)
|
||||
|
||||
| Item | Value |
|
||||
|------|--------|
|
||||
| Branch | `009-axp-los23-port` |
|
||||
| vs `origin` | Should match Gitea after 2026-10-16 push from old laptop |
|
||||
| `artifacts/` | Gitignored (bootanimation frames); keep USB copy if needed |
|
||||
|
||||
After push, a fresh `git clone` + `checkout 009-axp-los23-port` is enough for
|
||||
code/docs; large host-only paths stay on `rom-dev01`.
|
||||
|
||||
Remotes:
|
||||
|
||||
- `AXP_Resurection` → `https://a16.ssystems.de/sunfish-admin/AXP-Resurection.git`
|
||||
- `sunfish-a16-rom` → `https://a16.ssystems.de/sunfish-admin/sunfish-a16-rom.git`
|
||||
|
||||
## Host build in flight (2026-10-16 evening)
|
||||
|
||||
Full **polish bacon** (configstore + EuiccDisabler + thermal CDEV log fixes):
|
||||
|
||||
| Field | Value |
|
||||
|-------|--------|
|
||||
| Stage on host | `/srv/rom/artifacts/009-axp-los23-port/worktree-20261016-polish` |
|
||||
| tmux session | `bacon009polish20261016` |
|
||||
| Status | `/srv/rom/artifacts/detach-bacon009polish20261016.status` |
|
||||
| Log | `/srv/rom/artifacts/detach-bacon009polish20261016-20261016T183009Z.log` |
|
||||
| Command | `AXP_PROJECT_SOURCE=<stage> LOS_SYNC=0 LOS_DATE=20261016 bash <stage>/scripts/009-rebuild-from-los.sh` |
|
||||
| Expected zip | `AXP-Resurection-Pro-23.2-20261016-sunfish.zip` (if postflight passes) |
|
||||
|
||||
Monitor from any laptop with SSH:
|
||||
|
||||
```bash
|
||||
ssh -F docs/ssh/config a16-build cat /srv/rom/artifacts/detach-bacon009polish20261016.status
|
||||
ssh -F docs/ssh/config a16-build tail -30 /srv/rom/artifacts/detach-bacon009polish20261016-20261016T183009Z.log
|
||||
```
|
||||
|
||||
After a **fix** on the laptop tree:
|
||||
|
||||
```bash
|
||||
./scripts/009-sync-ota-stage-to-host.sh
|
||||
./scripts/009-relaunch-polish-bacon.sh
|
||||
```
|
||||
|
||||
(`009-relaunch-polish-bacon.sh` = sync + `rom-detach` same session name.)
|
||||
|
||||
## Polish fixes (uncommitted WT) — summary
|
||||
|
||||
Detail: `docs/009-lab-polish-20261016.md`.
|
||||
|
||||
| Issue | Apply script / gate |
|
||||
|-------|---------------------|
|
||||
| configstore VINTF crash-loop | `apply_009_drop_lab_only_commands.py` restores `disable_configstore`; bacon postflight |
|
||||
| EuiccDisabler crash | `apply_009_euicc_disabler_guard.py` (after euicc drop) |
|
||||
| pixel-thermal false CDEV ERROR | `apply_009_thermal_cdev_log.py` |
|
||||
| media_quality / SLIM_0_RX | documented; **no ship fix** |
|
||||
|
||||
Tests: `tests/test_009_next_bacon_guards.py` (polish guards).
|
||||
|
||||
## Agent onboarding (no chat history)
|
||||
|
||||
1. `AGENTS.md`
|
||||
2. `docs/009-handoff-20261008.md`
|
||||
3. `docs/009-laptop-migration-20261016.md` (this file)
|
||||
4. `docs/device-roles.md` + `docs/009-lab-polish-20261016.md`
|
||||
5. `docs/009-ota-rebuild-checklist.md` before any bacon
|
||||
|
||||
**Security:** USB holds a **private SSH key**. Encrypt the stick or wipe after
|
||||
restore; never commit keys to Git.
|
||||
@@ -0,0 +1,103 @@
|
||||
# 009 — OTA rebuild checklist (re-read before every `bacon009ota` launch)
|
||||
|
||||
**Target (current):** `lineage-23.2-20261008-nightly-sunfish` manifest pin.
|
||||
**Zip name:** `AXP-Resurection-Pro-23.2-20261008-sunfish.zip` (`LOS_DATE=20261008`).
|
||||
**Host:** `rom-dev01` only, detached: `/srv/rom/artifacts/bin/rom-detach`.
|
||||
|
||||
## A. Upstream pin (not the LOS signed zip)
|
||||
|
||||
- [ ] `LOS_MANIFEST` = official `build-manifest.xml` (SHA256 recorded in `docs/009-version-pins.md`).
|
||||
- [ ] First time or after long drift: `LOS_SYNC=1` + `repo sync --force-sync` + pin all projects to manifest.
|
||||
- [ ] Re-run without sync: `LOS_SYNC=0` (tree already pinned).
|
||||
- [ ] Post-sync: `repo manifest -r` diff vs nightly → **0 revision diffs** on common projects.
|
||||
- [ ] Do **not** sync to “tip of lineage-23.2” only; pin exact nightly.
|
||||
|
||||
## B. Staged sources on host (laptop → rom-dev01)
|
||||
|
||||
`AXP_PROJECT_SOURCE` must carry **both**:
|
||||
|
||||
- [ ] `vendor/sunfish-a16/` (patches, magisk, hardening.mk, BoardConfig.mk, …)
|
||||
- [ ] `scripts/009-*.sh` used by rebuild (entry: `009-rebuild-from-los.sh`)
|
||||
|
||||
`009-rebuild-from-los.sh` rsyncs **only** `vendor/sunfish-a16` into the tree; bacon runs from **`$STAGE/scripts/`** — keep them in sync.
|
||||
|
||||
## C. Mandatory ship flags (OTA path)
|
||||
|
||||
- [ ] `AXP_DEBLOB_WAVE4=1` (wave 4 deblob)
|
||||
- [ ] `012` hardened_malloc (via `009-bacon-hardened-malloc.sh`)
|
||||
- [ ] `AXP_AVB_FLAGS=0` / `WITH_AVB=true`
|
||||
- [ ] `LINEAGE_BUILDTYPE=PRO`, lunch `lineage_sunfish-user`, `TARGET_RELEASE=bp4a`
|
||||
- [ ] Release keys: `/srv/rom/secrets/android-certs` → never in git
|
||||
|
||||
## D. LOS device wiring (lost on `repo forall reset` — re-apply every bacon)
|
||||
|
||||
`apply_009_product_includes.py` must run before breakfast:
|
||||
|
||||
- [ ] `lineage_sunfish.mk`: `gms.mk` + `magisk.mk` + **`apps.mk`** (`sunfish-a16-009-product-includes`)
|
||||
- [ ] `magisk.mk` also `inherit-product`s `apps.mk` (belt-and-suspenders if product block drifts)
|
||||
- [ ] `BoardConfigLineage.mk`: `-include vendor/sunfish-a16/BoardConfig.mk` (`sunfish-a16-009-board-config`) — **AVB + super size**
|
||||
|
||||
## E. Secrets / signing (host only)
|
||||
|
||||
`apply_009_axp_identity.py` after wiring:
|
||||
|
||||
- [ ] Copy release keys → `vendor/lineage-priv/keys/`
|
||||
- [ ] Copy `avb.pem` + `avb_pkmd.bin` → `vendor/sunfish-a16/certs/`
|
||||
- [ ] `ANDROID_CERTS_DIR=/srv/rom/secrets/android-certs`
|
||||
- [ ] Pre-breakfast guards: `avb.pem`, `releasekey.pk8` exist
|
||||
- [ ] Post-breakfast: `MAINLINE_BLUETOOTH_SEPOLICY_DEV_CERTIFICATES` → `vendor/lineage-priv/keys`
|
||||
- [ ] Post-breakfast: `BOARD_AVB_KEY_PATH` → `vendor/sunfish-a16/certs/avb.pem`
|
||||
|
||||
## F. Kernel pack (same msm-4.14 SHA as nightly manifest)
|
||||
|
||||
- [ ] Reset kernel to `git rev-parse HEAD` of pinned `kernel/google/msm-4.14` (not a stale laptop SHA).
|
||||
- [ ] Stage1 + combo4 + FORTIFY + CVE clean + hi-batch1–3 + lock-scope USB
|
||||
- [ ] **US-S5-1:** `CONFIG_SECURITY_YAMA` **unset** (like GOLDEN); `SLAB_FREELIST_RANDOM=y`; USERFAULTFD off
|
||||
- [ ] `KSYM_NAME_LEN=192`; no KernelSU in defconfig
|
||||
|
||||
## G. Userspace applies (AXP ports on **A16 / LOS 23** tree)
|
||||
|
||||
Naming: `apply_009_a15_*` = patches **sourced from legacy AXP product**, ported to **Android 16** — not SDK 35.
|
||||
|
||||
- [ ] 005 sigspoof, 008 call rec / FLAG_SECURE
|
||||
- [ ] 009 disable-app, DNS, connectivity, SUPL, branding, identity, cmdline, yama (inert without Yama built)
|
||||
- [ ] AXP reboot/Wi‑Fi/BT timeouts (`apply_009_a15_reboot_timeouts.py`, `apply_009_a15_settings_timeouts.py`) — **no `.rej`**, fail-closed
|
||||
- [ ] `apply_009_a15_small.py`
|
||||
- [ ] Wave4: `apply_009_drop_lab_only_commands.py` when `AXP_DEBLOB_WAVE4=1`
|
||||
- [ ] OpenSSH / carrier / euicc / lineage-tools drops
|
||||
|
||||
## H. Product surface (match **current LAB bacon**)
|
||||
|
||||
- [ ] **Jelly** on `product` (postflight US-S4-2: `Jelly.apk`)
|
||||
- [ ] **AuroraStore**, **Droidify**, **FossifyGallery** on `system_ext/app/…` (postflight **US-S4-3**; absent from `product`) — [`009-bundled-apps-axp-parity.md`](009-bundled-apps-axp-parity.md)
|
||||
- [ ] Pre-`mka` guard: `GmsCore`/`GsfProxy`/`Phonesky` + AuroraStore/Droidify/FossifyGallery/OpenEUICC in `PRODUCT_PACKAGES`
|
||||
- [ ] Prebuilts symlinked: `/srv/rom/prebuilts/axp-apps/*.apk` → `vendor/sunfish-a16/prebuilt/`
|
||||
- [ ] No Gallery2 / Glimpse on product (`hardening.mk` filter-out; Fossify replaces gallery UX)
|
||||
- [ ] `hardening.mk`: `PRODUCT_PACKAGES += Jelly`
|
||||
- [ ] microG + Phonesky prebuilts + GmsCore JNI extract
|
||||
- [ ] Magisk 30.7 preroot, `out/.magisk/READY`
|
||||
|
||||
## I. Vendor SPL / identity
|
||||
|
||||
- [ ] `VENDOR_SECURITY_PATCH = 2023-09-05` (no rollback to 2023-08-05 on upgrade)
|
||||
- [ ] `LINEAGE_BUILD_DATE` = `LOS_DATE` when set (`.axp-los-date`)
|
||||
|
||||
## J. Post-build (LAB only)
|
||||
|
||||
- [ ] Sideload full zip; Magisk boot/dtbo/vbmeta reinforce if needed
|
||||
- [ ] Smoke: boot, Magisk, Island, Wallapop work profile, radio
|
||||
- [ ] Record artifact SHA256 + `repo manifest -r` under `009-axp-los23-port/`
|
||||
|
||||
## Known failure modes (2026-10-10)
|
||||
|
||||
| Symptom | Cause | Fix |
|
||||
|--------|--------|-----|
|
||||
| LAB has microG but **no Aurora/Droidify/Fossify** | `apps.mk` never inherited (OTA before 2026-10-10 fix) | Rebacon with staged WT; postflight US-S4-3 |
|
||||
| Maps brown / microG broken, JNI OK on host push only | GmsCore `.so` not in image | Rebacon; postflight must see `system_ext/app/GmsCore/lib/arm64/libconscrypt_gmscore_jni.so` |
|
||||
| BT sepolicy not `lineage-priv/keys` | `gms.mk`/`magisk.mk` not inherited | `apply_009_product_includes.py` |
|
||||
| Postflight US-S4-2 Gallery2 | Old gate expected Gallery2 on product | Current ship: **Jelly only** (Fossify is US-S4-3) |
|
||||
| Bacon `exit=1` as root after `mka` OK | `git safe.directory` on hardened_malloc tree | `sudo -u android-build` + `apply_012` safe.directory |
|
||||
| AVB key empty / wrong path | `BoardConfig.mk` not included | board include in same script |
|
||||
| `missing vendor/sunfish-a16/certs` | identity not copying from secrets | `ANDROID_CERTS_DIR` + identity.py |
|
||||
| `repo sync` hook errors | project object-store drift | `--force-sync` after `forall` clean |
|
||||
| `patch_incomplete` | AXP patch drift on A16 | fail-closed + marker grep (not silent continue) |
|
||||
@@ -3,9 +3,12 @@
|
||||
Owner cadence: refresh bundled **system / privileged** packages about every
|
||||
**2–3 months** without a full ROM reflash. **No** AXP OTA / external repos.
|
||||
|
||||
Status: **stub** — fill before final ship (task T046a). Packaging of the
|
||||
Status: **stub** — fill before claiming FR-019 done. Packaging of the
|
||||
shipping image MUST already preserve update eligibility.
|
||||
|
||||
**Full ROM updates** (new LOS base + rebacon) are a different path: recovery
|
||||
sideload of the project zip. See [`009-upstream-rebase-ota.md`](009-upstream-rebase-ota.md).
|
||||
|
||||
## In scope
|
||||
|
||||
| Component | Intended update path | Signing constraint |
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
# Swissquote differential investigation — 2026-10-09
|
||||
|
||||
Status: **failure classified, underlying root-detection signal not yet isolated**.
|
||||
Live observations approximately 15:18–15:26 Europe/Berlin. This supersedes
|
||||
the Swissquote runtime inventory in `009-handoff-20261008.md`, not its
|
||||
build/recovery instructions. No firmware was flashed and GOLDEN was read-only.
|
||||
> **Outcome (same day, wave 3):** Swissquote **PASS** in Island on LAB after
|
||||
> Lineage tools removal — see [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md).
|
||||
> Body below is the **pre-PASS** forensics log only.
|
||||
|
||||
Status (investigation snapshot): failure classified before wave 3.
|
||||
Live observations approximately 15:18–15:26 Europe/Berlin. Build/recovery
|
||||
instructions in `009-handoff-20261008.md` still apply. GOLDEN was read-only.
|
||||
|
||||
## Confirmed new finding
|
||||
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
# 009 — Upstream LOS rebase → project OTA zip
|
||||
|
||||
**Status (2026-10-10):** runbook for the next few days. Scripts for the **ship
|
||||
bacon** exist; a fully automated “sync nightly → OTA publish” pipeline does
|
||||
**not**. This track does **not** use AXP OTA servers (see FR-019 / sideload).
|
||||
|
||||
Owner will supply a new LineageOS 23.2 sunfish build reference from
|
||||
https://download.lineageos.org/devices/sunfish/builds — treat that as the
|
||||
upstream pin to sync against, then rebacon our pack.
|
||||
|
||||
## What is already prepared
|
||||
|
||||
| Piece | Ready? | Path / note |
|
||||
|-------|--------|-------------|
|
||||
| Vanilla LOS tree workflow | yes (manual) | `docs/003-build-notes.md` — `repo init/sync`, `breakfast`, `mka bacon -j8` |
|
||||
| Canonical OTA entry | yes | `scripts/009-rebuild-from-los.sh` (sync optional; **wave 4 + malloc mandatory**) |
|
||||
| Pre-launch checklist | yes | `docs/009-ota-rebuild-checklist.md` |
|
||||
| Stage laptop → host | yes | `scripts/009-sync-ota-stage-to-host.sh` |
|
||||
| Ship bacon (called by the entry) | yes | `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` |
|
||||
| hardened_malloc + wave 4 | yes, required | `scripts/009-bacon-hardened-malloc.sh` |
|
||||
| Release keys on host | yes | `/srv/rom/secrets/android-certs` (never commit) |
|
||||
| Detached long builds | yes | `/srv/rom/artifacts/bin/rom-detach` (tmux) |
|
||||
| APK-only refresh (FR-019) | stub | `docs/009-sideload-system-updates.md` |
|
||||
| `repo sync` + patch re-apply | yes, one script | `LOS_SYNC=1 scripts/009-rebuild-from-los.sh` (tip of `lineage-23.2`; compare nightly manifest) |
|
||||
| Lineage Updater / signed incremental OTA channel | **no** | first deliverable = full recovery zip (same shape as bacon) |
|
||||
|
||||
## Target for “first OTA”
|
||||
|
||||
For this project, the first OTA means:
|
||||
|
||||
1. Sync LOS `lineage-23.2` on `rom-dev01` (`LOS_SYNC=1`), or keep the tree and
|
||||
only rebacon.
|
||||
2. `scripts/009-rebuild-from-los.sh` re-applies the pack **including wave 4
|
||||
and hardened_malloc** (not optional on this path).
|
||||
3. Produce `AXP-Resurection-Pro-23.2-YYYYMMDD-sunfish.zip` (release-keys).
|
||||
4. Sideload on LAB. Lineage Updater is not required for the first zip.
|
||||
|
||||
Do **not** flash GOLDEN. Prefer a second slot / keep last known-good zip.
|
||||
|
||||
## Checklist (host `rom-dev01`)
|
||||
|
||||
```bash
|
||||
# 1) Snapshot current tree
|
||||
ssh -F docs/ssh/config a16-build
|
||||
cd /srv/rom/src/lineage
|
||||
repo manifest -r -o /srv/rom/artifacts/009-axp-los23-port/manifest-pre-rebase-$(date -u +%Y%m%dT%H%M%SZ).xml
|
||||
|
||||
# 2) Sync upstream (pin to the LOS build the owner names)
|
||||
repo sync -c -j8
|
||||
|
||||
# 3) Confirm proprietary blobs / TheMuppets still match branch
|
||||
# 4) Re-apply project patches ONLY via the ship bacon wrappers (do not hand-edit
|
||||
# out-of-tree). Prefer:
|
||||
# From a checkout of this repo on the host (path may differ):
|
||||
LOS_SYNC=1 LOS_MANIFEST=/path/to/nightly/build-manifest.xml \
|
||||
/srv/rom/artifacts/bin/rom-detach bacon009ota -- \
|
||||
bash /path/to/AXP_Resurection/scripts/009-rebuild-from-los.sh
|
||||
|
||||
# 5) Postflight: zip SHA256, vendor SPL >= 2023-09-05, Magisk preroot present,
|
||||
# Jelly/Fossify gates, release-keys fingerprint.
|
||||
|
||||
# 6) LAB only: sideload full zip; smoke Magisk, Island, Swissquote, radio.
|
||||
```
|
||||
|
||||
Conflict policy: if upstream breaks an apply, stop and document the minimal
|
||||
port — do not invent a second Magisk/microG design (AGENTS.md “clone AXP first”).
|
||||
|
||||
## Gaps to fill when the new LOS build arrives
|
||||
|
||||
- [ ] Record upstream zip name / date / SHA256 in `docs/009-version-pins.md`
|
||||
- [ ] Record our rebacon artifact dir + SHA256 + `repo manifest -r`
|
||||
- [ ] Decide whether `user` vs `userdebug` lunch stays `user` (closure = `user`)
|
||||
- [ ] Swissquote Island smoke + note Yuh still open
|
||||
- [ ] Optional: flesh FR-019 APK sideload commands (separate from full OTA zip)
|
||||
|
||||
## Do-not
|
||||
|
||||
- Mix KernelSU into the Magisk ship bacon
|
||||
- Run AXP `Deblob.sh` defaults
|
||||
- Leave `mka` on a laptop SSH session
|
||||
- Start a second ninja on the same `out/`
|
||||
- Lower `VENDOR_SECURITY_PATCH` below `2023-09-05`
|
||||
@@ -12,7 +12,7 @@ On LAB `11231JEC207477` after AVB ship `20261002T103558Z` (+ boot/vbmeta reinfor
|
||||
| Encryption | `ro.crypto.state=encrypted`, `ro.crypto.type=file` |
|
||||
| Verified boot | orange / `flash.locked=0` (unlocked Magisk track) |
|
||||
| `security.perf_harden` | 1 (already) |
|
||||
| Yama / `ptrace_scope` | **done** (US-S5-1 `162840Z`) — `CONFIG_SECURITY_YAMA=y` |
|
||||
| Yama / `ptrace_scope` | **off like GOLDEN** (reverted 2026-10-10: scope 2 broke PairIP) |
|
||||
|
||||
## Stage 1 — US-S4-1 drop product OpenSSH / rsync / procmem
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
||||
|
||||
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# User zip audit — 20261007T022805Z (not flashed)
|
||||
|
||||
Build finished `exit=0` at 2026-10-07T02:29:08Z. Session `009-user-bacon`.
|
||||
|
||||
@@ -7,7 +7,8 @@ Never ship from stale laptop caches.
|
||||
|
||||
| component | version_name | version_code | upstream_ref | policy | verified_on | notes |
|
||||
|-----------|--------------|--------------|--------------|--------|-------------|-------|
|
||||
| VanillaBaseline | lineage-23.2 sunfish | | `/srv/rom/artifacts/003-vanilla/20260914-lineage-23.2-sunfish` | los_default | 2026-09-14 | Known-good vanilla artifact on host |
|
||||
| VanillaBaseline | lineage-23.2 sunfish | | `/srv/rom/artifacts/003-vanilla/20260914-lineage-23.2-sunfish` | los_default | 2026-09-14 | `repo sync` finished 2026-09-13. **Not** the 2026-10-08 nightly |
|
||||
| Next OTA upstream pin | lineage-23.2-20261008-nightly-sunfish | | https://download.lineageos.org/devices/sunfish/builds | owner pin | pending | Rebuild via `scripts/009-rebuild-from-los.sh` after `LOS_SYNC=1` + manifest diff |
|
||||
| microG GmsCore | v0.3.17.252432 | 252432034 | https://github.com/microg/GmsCore/releases/tag/v0.3.17.252432 | newest_stable | 2026-10-06 staged | default flavor, not `-hw`. PRESIGNED on `system_ext`. GOLDEN live overlay was 0.3.16.1 |
|
||||
| GSF Proxy | v0.1.0 | | microG official | newest_stable | 2026-09-16 staged | |
|
||||
| Phonesky | 52.9.22-24 | | project patched host artifact | project_phonesky | 2026-09-14 | `/srv/rom/prebuilts/phonesky/`; never Git |
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
# Yuh: GOLDEN PASS vs LAB FAIL (same modules)
|
||||
|
||||
**Status:** open — Swissquote PASS on LAB does not imply Yuh parity.
|
||||
**Updated:** 2026-10-10 (live LAB/GOLDEN adb).
|
||||
**Oracle:** GOLDEN `11071JEC203839` — read-only. **LAB:** `11231JEC207477`.
|
||||
|
||||
## Measured 2026-10-09/10 (supersedes several older guesses)
|
||||
|
||||
| Fact | Note |
|
||||
|------|------|
|
||||
| APK identical on both (1.47.0 / vc 541) when compared | Not a version mismatch |
|
||||
| DenyList / Island 6.4.2 / Bootloader Spoofer UI match | Not the differentiator |
|
||||
| Bootloader Spoofer **not loaded** into Yuh on either phone while DenyList is on | GOLDEN still opens Yuh → spoofer not required every cold open |
|
||||
| LAB error UI: **“installed from an untrusted source”** | `initiatingPackageName=com.android.shell` (or Aurora) vs GOLDEN `com.android.vending` |
|
||||
| Play on LAB Island: Yuh “not compatible” while GOLDEN got Play updates | Features required by APK are present; LAB is Pixel 4a + **SDK 36**; GOLDEN is sunfish + **SDK 35** |
|
||||
| TEESimulator removed; GOLDEN still works | TEE targets are not the Yuh differentiator |
|
||||
| `keystore2` `HARDWARE_TYPE_UNAVAILABLE` | Seen on **both** phones; not the differentiator |
|
||||
|
||||
## Older checklist (still useful, partly disproved)
|
||||
|
||||
| Fact | Source |
|
||||
|------|--------|
|
||||
| On GOLDEN, Yuh was **FAIL** for weeks until Vector bootloader spoofer (2026-10-02). | `docs/002-golden-inventory.md` |
|
||||
| Swissquote on GOLDEN did **not** need Vector; Yuh did (historically). | handoff |
|
||||
| TEESimulator default targets omit banks | still true; not sufficient for Yuh |
|
||||
| LAB A16 / Magisk 30.7 vs GOLDEN A15 / Magisk 29.0 | still true |
|
||||
|
||||
## Practical next paths (LAB only)
|
||||
|
||||
1. Get Play to perform a real update of Yuh (`initiatingPackageName=com.android.vending`) — see PlayIntegrityFork `spoofVendingSdk` experiments; inject-s only forces SDK 32.
|
||||
2. Do **not** expect Island clone alone to rewrite install source.
|
||||
3. Keep Magisk DenyList on for banking; Vector scope is separate.
|
||||
|
||||
## Capture (owner)
|
||||
|
||||
```bash
|
||||
chmod +x scripts/009-diff-yuh-golden-lab.sh
|
||||
./scripts/009-diff-yuh-golden-lab.sh | tee /tmp/yuh-golden-lab-diff.txt
|
||||
```
|
||||
|
||||
Then one LAB fail log (Island only):
|
||||
|
||||
```bash
|
||||
adb -s 11231JEC207477 logcat -c
|
||||
# open Yuh in Island until it fails
|
||||
adb -s 11231JEC207477 logcat -d > /tmp/yuh-lab-fail.log
|
||||
```
|
||||
|
||||
Do not commit keybox material or Crashlytics payloads.
|
||||
|
||||
## Agent note
|
||||
|
||||
No live GOLDEN/LAB session from the agent environment in Oct 2026; conclusions above are from frozen docs + owner reports until `009-diff-yuh-golden-lab.sh` output exists.
|
||||
@@ -1,55 +1,81 @@
|
||||
# Documentation
|
||||
|
||||
Project rules: `.specify/memory/constitution.md`
|
||||
Agent rules: `../AGENTS.md`
|
||||
Feature specs: `../specs/`
|
||||
**Active track:** Magisk AXP → LOS 23.2 resurrection (`009`).
|
||||
**Start here:** [`009-handoff-20261008.md`](009-handoff-20261008.md)
|
||||
**Closure baseline (LAB, 2026-10-09):** [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md)
|
||||
|
||||
Conversation continuity: [`chatgpt-context.md`](chatgpt-context.md) — context
|
||||
from the shared ChatGPT discussion, reconciled with later repository records;
|
||||
non-normative.
|
||||
Project rules: `.specify/memory/constitution.md`
|
||||
Agent rules: [`../AGENTS.md`](../AGENTS.md)
|
||||
Feature specs: [`../specs/`](../specs/) (active ship: `009-axp-los23-port`)
|
||||
|
||||
KernelSU / ReSukiSU / SusFS (`007`) is a **parallel** track (boot worked Sept
|
||||
2026). Keep all `007-*` docs. Bridge to current Magisk ROM:
|
||||
[`007-parallel-on-009.md`](007-parallel-on-009.md). Do not mix into Magisk ship
|
||||
bacons; A/B or restore Magisk zip after experiments.
|
||||
|
||||
## 009 Magisk ship (day-to-day)
|
||||
|
||||
| Doc | Role |
|
||||
|-----|------|
|
||||
| [`009-handoff-20261008.md`](009-handoff-20261008.md) | Resume / execution map |
|
||||
| [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md) | Booted closure zip + Swissquote PASS |
|
||||
| [`009-magisk-preinstall-runbook.md`](009-magisk-preinstall-runbook.md) | EXTENDROM preroot (Magisk not PRODUCT_PACKAGE) |
|
||||
| [`009-capability-matrix.md`](009-capability-matrix.md) | Ship capability matrix |
|
||||
| [`009-version-pins.md`](009-version-pins.md) | microG / Magisk / Phonesky pins |
|
||||
| [`009-gate-g-kernel-attribution.md`](009-gate-g-kernel-attribution.md) | Kernel hardening attribution |
|
||||
| [`009-kernel-hardening-map.md`](009-kernel-hardening-map.md) | Living kernel map |
|
||||
| [`009-upstream-rebase-ota.md`](009-upstream-rebase-ota.md) | Next LOS sync → rebacon → first project OTA |
|
||||
| [`009-lab-polish-20261016.md`](009-lab-polish-20261016.md) | Post-test polish (configstore, thermal, Euicc, media) |
|
||||
| [`009-laptop-migration-20261016.md`](009-laptop-migration-20261016.md) | New laptop / USB bundle, git WT, host bacon in flight |
|
||||
| [`009-sideload-system-updates.md`](009-sideload-system-updates.md) | FR-019 APK bumps (stub) |
|
||||
| [`009-yuh-golden-lab-hypothesis.md`](009-yuh-golden-lab-hypothesis.md) | Open Yuh gap (historical LAB vs AXP-era GOLDEN) |
|
||||
| [`device-roles.md`](device-roles.md) | LAB = daily driver; GOLDEN = our build (debug); AXP oracle = a16 refs |
|
||||
|
||||
## Public-facing (users / reviewers)
|
||||
|
||||
| Doc | Role |
|
||||
|-----|------|
|
||||
| [`public/AXP-Resurrection-Pro-sunfish.md`](public/AXP-Resurrection-Pro-sunfish.md) | What the ROM contains — no LAB/GOLDEN/build-host detail |
|
||||
| [`public/kernel-cve-backport-list.txt`](public/kernel-cve-backport-list.txt) | **449** kernel CVE identifiers in the ship set |
|
||||
|
||||
## Non-normative product trackers
|
||||
|
||||
| Doc | Role |
|
||||
|------|------|
|
||||
| [`axp-pro-parity.md`](axp-pro-parity.md) | Parity matrix — Magisk is ship root on `009` |
|
||||
| [`hardening-backlog.md`](hardening-backlog.md) | Candidates until promoted into a `spec.md` |
|
||||
| [`a15-a16-delta.md`](a15-a16-delta.md) | Porting notes A15→A16 |
|
||||
| [`chatgpt-context.md`](chatgpt-context.md) | Early chat intent; **superseded** by constitution/`009` on root |
|
||||
|
||||
## Parallel track — KernelSU / SusFS (kept)
|
||||
|
||||
| Doc | Role |
|
||||
|-----|------|
|
||||
| [`007-parallel-on-009.md`](007-parallel-on-009.md) | How to retry ReSukiSU+SusFS on current `009` ROM |
|
||||
| [`007-kernelsu-runbook.md`](007-kernelsu-runbook.md) | Host build / flash runbook |
|
||||
| [`007-lab-results-20260916.md`](007-lab-results-20260916.md) | Boot PASS + banks FAIL evidence |
|
||||
| `specs/007-kernelsu-sunfish/` | Standby feature spec (FR-016 recycle) |
|
||||
|
||||
## Historical diagnostics (not Magisk day-to-day)
|
||||
|
||||
See [`archive/README.md`](archive/README.md).
|
||||
|
||||
- Sept 2026 fortify / CVE bisect (`009-fortify-*`, `009-cve-bisect-plan.md`)
|
||||
- Early lab acceptance / unflashed zip audits
|
||||
- Vanilla LOS bring-up done: `003-*` (still useful for `repo sync` basics)
|
||||
|
||||
## Host boundary
|
||||
|
||||
`rom-dev01` (Ubuntu 24.04, public IPv4, SSH) is provisioned **outside** this
|
||||
project (SSYSTEMS Salt `saltenv=base` / PVE). This repository must not specify
|
||||
or automate Proxmox VM creation, public IP selection, or company Salt states.
|
||||
project. This repository must not specify or automate Proxmox VM creation,
|
||||
public IP selection, or company Salt states.
|
||||
|
||||
Feature `001-development-environment` starts from an already-available host.
|
||||
|
||||
## Planned Gitea repositories (on rom-dev01)
|
||||
## Reference sources
|
||||
|
||||
- `sunfish-a16-rom` — Spec Kit / constitution / docs (meta)
|
||||
- `sunfish-rom-manifest`
|
||||
- `sunfish-rom-build`
|
||||
- `sunfish-rom-patches`
|
||||
[`reference-sources.md`](reference-sources.md) — Lineage / AXP / GrapheneOS. **Sunfish only.**
|
||||
|
||||
Plus forks only when modification requires them (kernel, frameworks/base,
|
||||
Settings, Dialer, vendor/config).
|
||||
## AXP sunfish preservation
|
||||
|
||||
## Reference sources (Lineage / AXP / GrapheneOS)
|
||||
|
||||
[`reference-sources.md`](reference-sources.md) — roles, URLs, local vs later
|
||||
`rom-dev01` archive work. **Sunfish only.**
|
||||
|
||||
## Device roles (two sunfish)
|
||||
|
||||
[`device-roles.md`](device-roles.md) — GOLDEN (AXP, do not flash) vs LAB (experiments).
|
||||
|
||||
## AXP sunfish preservation (detail)
|
||||
|
||||
[`axp-sunfish-preservation.md`](axp-sunfish-preservation.md) — Disroot/Codeberg/
|
||||
downloads/Tor cookbook for sunfish-scoped AXP archive. Run after `001` on
|
||||
`rom-dev01`. **Not** a full AXP org clone.
|
||||
|
||||
## AXP Pro parity
|
||||
|
||||
Living matrix (non-normative): [`axp-pro-parity.md`](axp-pro-parity.md).
|
||||
|
||||
## Android 15 → 16 developer delta
|
||||
|
||||
Living notes for porting AXP/GrapheneOS ideas onto LOS 23.2 without blind copy:
|
||||
[`a15-a16-delta.md`](a15-a16-delta.md).
|
||||
|
||||
## Hardening backlog
|
||||
|
||||
Non-normative candidates: [`hardening-backlog.md`](hardening-backlog.md).
|
||||
[`axp-sunfish-preservation.md`](axp-sunfish-preservation.md) — archive cookbook after `001` on `rom-dev01`.
|
||||
@@ -0,0 +1,24 @@
|
||||
# Historical diagnostics vs parallel tracks
|
||||
|
||||
**Magisk ship resume:** [`../009-handoff-20261008.md`](../009-handoff-20261008.md)
|
||||
**Active spec:** [`../../specs/009-axp-los23-port/spec.md`](../../specs/009-axp-los23-port/spec.md)
|
||||
|
||||
## Parallel track (keep; not “obsolete”)
|
||||
|
||||
| Track | Paths | Role |
|
||||
|-------|-------|------|
|
||||
| **KernelSU / ReSukiSU / SusFS** | `../007-*`, `../session-20260916-handoff.md`, `../../specs/007-kernelsu-sunfish/` | Standby **parallel** root. Boot PASS Sept 2026. Bridge to current Magisk ROM: [`../007-parallel-on-009.md`](../007-parallel-on-009.md). Never mix into Magisk ship bacon. |
|
||||
|
||||
Do **not** delete these. Owner may retry on the current `009` kernel/userspace.
|
||||
|
||||
## Historical only (fortify / early zips)
|
||||
|
||||
| Category | Paths | Use |
|
||||
|----------|-------|-----|
|
||||
| Fortify / CVE bisect | `../009-fortify-*`, `../009-cve-bisect-plan.md`, `../009-kernel-boot-audit-20260926.md` | Why certain CVE/FORTIFY choices exist |
|
||||
| Pre-closure acceptance | `../009-lab-acceptance-20261002-*`, `../009-user-zip-audit-20261007.md` | Older `UNOFFICIAL` / `dev-keys` zips |
|
||||
| Vanilla LOS | `../003-*` | First `repo sync` / `mka bacon` (done) |
|
||||
| Speckit dumps | `../sunfish-a16-rom-speckit-dump*.txt`, `../001-*-review-pack.txt` | Import noise |
|
||||
|
||||
Fortify/CVE files keep `Status: historical` banners. Prefer linking from
|
||||
[`../README.md`](../README.md).
|
||||
@@ -1,6 +1,11 @@
|
||||
# AXP.OS Pro feature parity matrix
|
||||
|
||||
Living tracker for how `sunfish-a16-rom` relates to **AXP.OS Pro** functionality.
|
||||
Living tracker for how **AXP_Resurection** (`009` Magisk track) relates to
|
||||
**AXP.OS Pro** functionality.
|
||||
|
||||
> **2026-10-10:** Ship root is **Magisk** on `009`. KernelSU / ReSukiSU / SusFS
|
||||
> (`007`) is a **parallel** track (boot worked; kept for retry on current ROM —
|
||||
> [`007-parallel-on-009.md`](007-parallel-on-009.md)). Never in Magisk ship bacon.
|
||||
|
||||
**Non-normative.** This file is a product/backlog tracker. A row becomes a
|
||||
requirement only when promoted into a feature `spec.md`. For an active feature,
|
||||
@@ -24,28 +29,28 @@ feature. Signing/AVB, userspace hardening, and kernel hardening remain `011`–
|
||||
|
||||
| Feature | AXP Pro | Our objective | Status | Source / implementation |
|
||||
|---------|---------|---------------|--------|-------------------------|
|
||||
| Base ROM | AXP (LOS-derived) | LineageOS 23.2 / Android 16 sunfish | todo | LOS official `lineage-23.2`; `003` |
|
||||
| On-device release testing | Yes (pre-release device QA) | Yes — stage checklists + known-good builds | todo | `003` smoke; later release gate; `011` |
|
||||
| ASB patch integration / backports | Yes | Prefer LOS merges; backport missing applicable patches; document non-applicable | todo | LOS first; gaps → `012`/`013` |
|
||||
| SELinux enforcing | Yes | Expect **Enforcing**; measure on vanilla then keep | todo | Verify in `003`; then likely `los-provides` |
|
||||
| Data encryption enforced | Yes | Expect encryption enabled; no silent weaken | todo | `003` PIN/encrypt smoke; then likely `los-provides` |
|
||||
| Project signing | Yes | Own keys for release builds | todo | `011` |
|
||||
| Strong signing / AVB key policy | Yes (AVB/APK/dm-verity hardening) | Project AVB + release signing policy | todo | `011` |
|
||||
| Reproducible builds | Yes | Traceable builds; push toward reproducibility | todo | metadata from day one; harden in `011` |
|
||||
| Privacy-focused system defaults | Yes | Decide defaults beyond LOS stock | decide | `010` |
|
||||
| microG + GSF | Yes | Yes — working Self-Check / push | done | `004` packaging + `005` LAB US6 (`23.2-20260915`) |
|
||||
| Patched Phonesky / Play | Yes | Yes — priv-app, updatable | done | Play 52.9.22-24 + exact-alarm; installs OK on LAB (`005`) |
|
||||
| Signature spoofing | Advanced / configured | Restricted LOS + Phonesky JKS + DO toggle | done | `005` runbook; `allow_signature_fake` + `FAKE_PACKAGE` |
|
||||
| Magisk / preroot | Magisk (**Magia** UI on GOLDEN, 29.0) | **Substitute:** KernelSU-Next (+ SusFS) / evaluate ReSukiSU | substitute | Captured in `002`; do **not** fix GOLDEN; project root = `007` on LAB |
|
||||
| DenyList / umount for banks | Magia DenyList (pkg list in `docs/002-golden-inventory.md`) | KernelSU app profiles + verified umount | todo | `007` re-runs `006`; GOLDEN DenyList captured `002` |
|
||||
| Insular work profile | AXP docs say Insular; **GOLDEN measures Island** (`com.oasisfeng.island.fdroid` 6.4.2) | Banking workflow parity (Island or equivalent) | todo | `006`; capture in `002` |
|
||||
| Yuh in Insular/Island | Was FAIL ~weeks (HA); **PASS again 2026-10-02 on GOLDEN** with Vector **bootloader spoofer** (`002`) | Hard-gate Compatibility MVP (rootless in `006`); **Revolut not a hard-gate** | partial | `002`; Gate E on LAB = DenyList + PIF/teesim + Vector BL spoof (sunfish-coherent); never flash GOLDEN |
|
||||
| Swissquote in Insular/Island | **PASS** on GOLDEN (owner report, DenyList) | Hard-gate Compatibility MVP (rootless in `006`) | partial | `002`; re-test in `006`/`007`/`011` |
|
||||
| Unrestricted call recording | Yes | Yes — native ROM on Android 16 | todo | AXP/EXTENDROM/iodé as references only; re-validate on LOS 23.2; `008` |
|
||||
| DNS blocker / privacy DNS | Yes | Wanted; exact UX TBD | decide | `010` |
|
||||
| Hosts / tracker blocking | Yes | Wanted | decide | `010` |
|
||||
| hardened_malloc | Yes | Wanted if cleanly portable | decide | Graphene/AXP; `012`; see hardening backlog |
|
||||
| Hardened / CVE-patched kernel | Yes | LOS 23.2 kernel + Graphene/AXP/Divest backports | todo | `013` (+ selective work with `007`) |
|
||||
| Base ROM | AXP (LOS-derived) | LineageOS 23.2 / Android 16 sunfish | partial | LOS `lineage-23.2`; vanilla `003` done; ship = `009` closure |
|
||||
| On-device release testing | Yes (pre-release device QA) | LAB smoke + known-good zips | partial | `009` closure; first project OTA → `009-upstream-rebase-ota.md` |
|
||||
| ASB patch integration / backports | Yes | Prefer LOS merges; backport missing applicable patches | partial | Stage1/CVE pack in `009`; rebase with upstream |
|
||||
| SELinux enforcing | Yes | **Enforcing** on LAB ship | done | measured on Magisk closure |
|
||||
| Data encryption enforced | Yes | Encryption enabled; no silent weaken | done | LAB ship |
|
||||
| Project signing | Yes | Own keys for release builds | done | `release-keys` on closure zip; custody on host secrets |
|
||||
| Strong signing / AVB key policy | Yes (AVB/APK/dm-verity hardening) | Project AVB unlocked (flags 0 ship) | partial | AVB0 landed; bootloader lock wont |
|
||||
| Reproducible builds | Yes | Traceable builds; push toward reproducibility | todo | metadata; harden later |
|
||||
| Privacy-focused system defaults | Yes | Decide defaults beyond LOS stock | decide | capability matrix / remaining |
|
||||
| microG + GSF | Yes | Yes — working Self-Check / push | done | `004`/`005` → shipped in `009` |
|
||||
| Patched Phonesky / Play | Yes | Yes — priv-app, updatable | done | project Phonesky + exact-alarm |
|
||||
| Signature spoofing | Advanced / configured | Restricted LOS + Phonesky JKS + DO toggle | done | `005` |
|
||||
| Magisk / preroot | Magisk (**Magia** UI on GOLDEN, 29.0) | **Ship Magisk** newest stable (LAB 30.7) EXTENDROM preroot | done | `009`; KSU/`007` parallel recycle (FR-016) |
|
||||
| DenyList / umount for banks | Magia DenyList | Magisk DenyList + Island workflow | partial | Swissquote PASS LAB; Yuh open |
|
||||
| Insular work profile | AXP docs say Insular; **GOLDEN measures Island** | Island on LAB/GOLDEN | done | vehicle for banks |
|
||||
| Yuh in Insular/Island | **PASS on GOLDEN** (2026-10-02+) | Usable session on LAB Island | partial | open — install-source / Play A16 filter; see `009-yuh-golden-lab-hypothesis.md` |
|
||||
| Swissquote in Insular/Island | **PASS** on GOLDEN | Same on LAB Magisk ship | done | wave 3 / closure 2026-10-09 |
|
||||
| Unrestricted call recording | Yes | Native ROM DO unlock | done | `008` via `009` pack |
|
||||
| DNS blocker / privacy DNS | Yes | AXP-class providers, no axp.os endpoints | partial | patches in ship bacon |
|
||||
| Hosts / tracker blocking | Yes | Magisk hosts module / ROM helpers | partial | Systemless Hosts on LAB |
|
||||
| hardened_malloc | Yes | 64-bit libc; camera/SF exclusions | done | `012` in closure bacon |
|
||||
| Hardened / CVE-patched kernel | Yes | Stage1 + combo4 + FORTIFY + CVE pack | partial | Gate G kernel; more CVE optional |
|
||||
| Deblobbing | Yes | Case-by-case; don't break HW | decide | `010` / `013` |
|
||||
| AOSmium WebView | Yes | Ship usable WebView; allow installing alternate WebView providers and selecting the active one in **Developer options → WebView implementation** | decide | `010`; stock/AOSmium/Vanadium/etc. as candidates |
|
||||
| WireGuard in kernel | Yes | Check if LOS 23.2 already sufficient | decide | Baseline in `003`; else `010`/`013` |
|
||||
@@ -65,7 +70,7 @@ feature. Signing/AVB, userspace hardening, and kernel hardening remain `011`–
|
||||
|
||||
| AXP mechanism | Our default approach |
|
||||
|---------------|----------------------|
|
||||
| Magisk | KernelSU-Next (`007`); Magisk only as A/B diagnostic if needed |
|
||||
| Magisk | **Ship on `009`** (EXTENDROM preroot). KernelSU/`007` parallel (separate boot) |
|
||||
| AXP signature spoofing stack | LOS restricted spoofing + controlled Phonesky extension (`005`) |
|
||||
| AXP hardened kernel tree | LOS sunfish kernel + selective backports |
|
||||
| AXP Phonesky | Keep functionality; reproducible patch/sign pipeline |
|
||||
@@ -80,7 +85,7 @@ Not AXP Pro catalog features. Tracked here so they are not confused with parity.
|
||||
|
||||
| Feature | Origin | Objective | Status | Feature # |
|
||||
|---------|--------|-----------|--------|-----------|
|
||||
| FLAG_SECURE override | Project requirement | Native control: Android default remains default; **global** DO override only (no per-app); screenshots + screen capture; no LSPosed/Zygisk/root module | todo | `009` / `008-call-rec-flag-secure` |
|
||||
| FLAG_SECURE override | Project requirement | Native control: Android default remains default; **global** DO override only (no per-app); screenshots + screen capture; no LSPosed/Zygisk/root module | done | `008` via `009` pack |
|
||||
| Optional root-unavailable boot mode | Project / msg-GrapheneOS inspiration | Diagnostic/fallback boot without root | later | after daily-driver MVP |
|
||||
| Upstream deprecation / Kotlin warning hygiene | Build log noise on LOS 23.2 | **Last steps before final ROM freeze:** triage remaining compile warnings; migrate call sites API-by-API (or inherit LOS fixes); keep our patches warning-clean. Not a gate for `005`–`010` MVPs. | later | after `010` / with `011` freeze; see `docs/hardening-backlog.md` |
|
||||
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
# ChatGPT conversation continuity
|
||||
|
||||
> **Superseded on root strategy (2026-10-10).** Ship root is **Magisk** on
|
||||
> feature `009`. KernelSU-Next / “rootless then KSU” below is early chat intent
|
||||
> only. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
> Constitution + `specs/009-axp-los23-port/spec.md` win on conflicts.
|
||||
|
||||
Imported context: 2026-09-13 from [mi ROM](https://chatgpt.com/share/6aa718c6-c834-83ed-9e2d-2b18fc1ad141).
|
||||
|
||||
This is a non-normative continuity note, not a replacement for the constitution
|
||||
|
||||
@@ -2,34 +2,43 @@
|
||||
|
||||
Project assumption: **two physical sunfish devices**.
|
||||
|
||||
| Role | Use | Flash / experiment? |
|
||||
|------|-----|---------------------|
|
||||
| **GOLDEN** | Daily-driver **AXP.OS Pro 22.2 / Android 15** (main phone) | **NO** — never flash/wipe/modify; **`adb` sample only** |
|
||||
| **LAB** | Experiments / our ROM (as found: **iodé** / Lineage 7.8 A16) | **YES** — flash freely; factory rescue ready |
|
||||
| Role | Serial | Use (2026-10-16) | Flash / experiment? |
|
||||
|------|--------|------------------|---------------------|
|
||||
| **LAB** | `11231JEC207477` | Owner **daily driver** on our Magisk ship ROM (apps installed) | **Only with explicit owner ask** — treat as main phone |
|
||||
| **GOLDEN** | `11071JEC203839` | Runs **our** build after format (debug / logcat / vendor probes) | Yes for debug flashes when owner agrees; **not** a live AXP.OS oracle anymore |
|
||||
|
||||
## Measured GOLDEN (2026-09-13)
|
||||
## AXP.OS oracle (no longer the phone)
|
||||
|
||||
| Field | Value |
|
||||
|-------|--------|
|
||||
| Serial | `11071JEC203839` |
|
||||
| Build | `22.2-2026.003-sunfish-pro` (`ro.lineage.releasetype=PRO`), Android **15**, patch `2026-03-03` |
|
||||
| Bootloader | **unlocked** (`flash.locked=0`, `verifiedbootstate=orange`) |
|
||||
| Magisk | **29.0** (`/system_ext/bin/magisk`) |
|
||||
| Work profile | Island user 10; Yuh + Swissquote in Island only |
|
||||
| Inventory | [`002-golden-inventory.md`](002-golden-inventory.md) |
|
||||
Live AXP.OS Pro on GOLDEN is gone. Parity / “how AXP did it” comes from
|
||||
`a16.ssystems.de`:
|
||||
|
||||
## Measured LAB (2026-09-13)
|
||||
- `/srv/rom/references/axp/` (golden captures, archive, vendor_lineage, …)
|
||||
- EXTENDROM and related refs under `/srv/rom/references/`
|
||||
- Product trees / dumps already mirrored on the host
|
||||
|
||||
Do **not** assume `adb` on GOLDEN shows AXP packages or cmdline.
|
||||
|
||||
## Measured LAB (historical 2026-09-13; role updated 2026-10-16)
|
||||
|
||||
| Field | Value |
|
||||
|-------|--------|
|
||||
| Serial | `11231JEC207477` |
|
||||
| As found | iodé / `7.8-20260902-sunfish`, Android **16**, patch `2026-08-01` |
|
||||
| Bootloader | **locked** |
|
||||
| Baseline note | [`002-lab-iodes-baseline.md`](002-lab-iodes-baseline.md) |
|
||||
| Factory rescue | [`002-lab-stock-rescue.md`](002-lab-stock-rescue.md) — SHA-256 **VERIFY_OK** |
|
||||
| Role now | Main device — full user data; prefer not to wipe |
|
||||
| Factory rescue | [`002-lab-stock-rescue.md`](002-lab-stock-rescue.md) |
|
||||
|
||||
## Measured GOLDEN (historical AXP 2026-09-13; role updated 2026-10-16)
|
||||
|
||||
| Field | Value |
|
||||
|-------|--------|
|
||||
| Serial | `11071JEC203839` |
|
||||
| Was | AXP.OS Pro `22.2-2026.003-sunfish-pro` (read-only oracle) |
|
||||
| Now | Our zip `23.2-20261008-PRO-sunfish` (formatted); OK for debug |
|
||||
| Inventory (AXP era) | [`002-golden-inventory.md`](002-golden-inventory.md) — historical |
|
||||
|
||||
## Implications
|
||||
|
||||
- NeoBackup / wipe of GOLDEN is **not** a project requirement.
|
||||
- `003+` flashing **only on LAB**.
|
||||
- **Do not flash GOLDEN** under any circumstance.
|
||||
- Prefer **GOLDEN** for invasive `adb` / log spam captures and polish
|
||||
verification.
|
||||
- Prefer **LAB** untouched for day-to-day; no factory reset without owner.
|
||||
- Never invent AXP policy from the current GOLDEN image — use a16 references.
|
||||
- Polish backlog: [`009-lab-polish-20261016.md`](009-lab-polish-20261016.md).
|
||||
@@ -0,0 +1,436 @@
|
||||
# AXP Resurrection Pro — Pixel 4a (sunfish)
|
||||
|
||||
**LineageOS 23.2 · Android 16 · Privacy-oriented custom ROM**
|
||||
|
||||
AXP Resurrection Pro (*AXPR*) brings the **AXP.OS Pro** experience forward onto
|
||||
**LineageOS 23.2** for the **Google Pixel 4a**. It is aimed at users who want a
|
||||
maintained Android 16 base, **microG** instead of proprietary Google Play
|
||||
services, optional **root via Magisk**, and **extra kernel and system
|
||||
hardening** drawn from established community sources (including
|
||||
**GrapheneOS-class** kernel work), without tying you to deprecated AXP update
|
||||
servers.
|
||||
|
||||
This document describes **what the ROM contains**. It is written for end users
|
||||
and reviewers, not for build infrastructure.
|
||||
|
||||
**Current generation (example build id):** `23.2-20261008` · `BP4A.251205.006`
|
||||
· `release-keys`
|
||||
|
||||
---
|
||||
|
||||
## 1. At a glance
|
||||
|
||||
| Topic | What you get |
|
||||
|--------|----------------|
|
||||
| **Base** | LineageOS **23.2**, Android **16**, Pixel 4a only |
|
||||
| **Google services** | **microG** + **GSF proxy**; no built-in Google account requirement |
|
||||
| **Play Store** | **Play Store (Phonesky)** build patched for this project (exact-alarm and related fixes) |
|
||||
| **Root** | **Magisk** embedded at build time; you activate from the Magisk app after flash |
|
||||
| **Privacy apps** | **Aurora Store**, **Droidify**, **Fossify Gallery**, **Jelly** browser, **OpenEUICC** |
|
||||
| **Hardening** | Kernel patches (Graphene-derived + CVE backports), **hardened_malloc**, trimmed system surface |
|
||||
| **Updates** | Full ROM via **recovery sideload**; individual system apps can be updated in place when signed compatibly |
|
||||
| **Bootloader** | **Unlocked** workflow (orange state); not designed for relocked retail boot |
|
||||
|
||||
---
|
||||
|
||||
## 2. Everything added on top of LineageOS 23.2
|
||||
|
||||
Stock **LineageOS 23.2 for sunfish** is a clean AOSP-derived system: no microG,
|
||||
no Play Store, no Magisk, **test-keys** or UNOFFICIAL builds in typical user
|
||||
trees, default Private DNS list, default connectivity check (Google), Gallery2
|
||||
or Glimpse, full Lineage tool bundle on system, Google carrier/eUICC apps from
|
||||
vendor makefiles, and the upstream **4.14** kernel without the AXP/Graphene
|
||||
CVE and hardening layers below.
|
||||
|
||||
**AXP Resurrection Pro** keeps the Lineage base (Launcher3, Dialer, updaters,
|
||||
device support) and layers the following.
|
||||
|
||||
### 2.1 Product identity and visuals
|
||||
|
||||
| Change | LineageOS default | AXPR |
|
||||
|--------|-------------------|------|
|
||||
| Build channel | Often UNOFFICIAL / nightly naming | **PRO** product (`…-PRO-sunfish`) |
|
||||
| Signing | Test-keys on many community builds | **release-keys** (project keys) |
|
||||
| Manufacturer / brand props | Lineage | **AXP Resurrection** system branding |
|
||||
| Setup welcome | Lineage wording | **“Welcome to AXP Resurrection”** |
|
||||
| Boot animation | Narrow band layout | **Full-screen** 1080×2340 animation |
|
||||
| OTA zip name | `lineage-*.zip` | Matching **`AXP-Resurrection-Pro-*.zip`** (same payload) |
|
||||
|
||||
### 2.2 Google replacement stack (not in vanilla LOS)
|
||||
|
||||
| Component | Purpose |
|
||||
|-----------|---------|
|
||||
| **microG Services (GmsCore)** | Open-source reimplementation of Play Services |
|
||||
| **GSF Proxy** | Framework stub for apps expecting Google Services Framework |
|
||||
| **Play Store (Phonesky)** | Play client build maintained for this ROM (exact-alarm and related fixes) |
|
||||
| **GmsCore native libraries** | ARM64 JNI libs shipped **inside the image** (required for Maps / TLS stacks) |
|
||||
|
||||
Vanilla Lineage does **not** ship these; you would install microG yourself on a
|
||||
separate track.
|
||||
|
||||
### 2.3 Extra applications (vs typical LOS sunfish)
|
||||
|
||||
| App | Notes |
|
||||
|-----|--------|
|
||||
| **Aurora Store** | Play store front-end |
|
||||
| **Droidify** | F-Droid client (instead of shipping classic F-Droid) |
|
||||
| **Fossify Gallery** | Replaces **Gallery2 / Glimpse** on this product |
|
||||
| **Jelly** | Lightweight browser added on **product** (Lineage 23 does not include Jelly in the default sunfish product set) |
|
||||
| **OpenEUICC** | Privileged eSIM manager where Google EUICC is removed |
|
||||
| **Magisk** | Preroot boot integration + manager (see §5 Root and Magisk) |
|
||||
|
||||
**Unchanged vs LOS intent:** **Launcher3** (no NeoLauncher), standard Lineage
|
||||
core apps, **Lineage WebView** as default provider.
|
||||
|
||||
### 2.4 Settings and framework behaviour (AXP / GrapheneOS / Calyx class)
|
||||
|
||||
These are **code changes in the platform**, not separate APKs.
|
||||
|
||||
#### Privacy and network
|
||||
|
||||
| Feature | What Lineage does | What AXPR adds |
|
||||
|---------|-------------------|----------------|
|
||||
| **Private DNS presets** | Small default set | **15+ named providers** (AdGuard, Mullvad, Quad9, Cloudflare, regional DoT hosts, etc.) |
|
||||
| **Internet connectivity check** | Fixed Google-style check | **User-selectable** provider (Disabled, Amazon, Cloudflare, Google, Huawei, Kuketz, Microsoft, openSUSE, Ubuntu, …) — no AXP-owned servers |
|
||||
| **Force disable SUPL** | Not exposed | Settings toggle; forces SUPL off for stricter GNSS |
|
||||
| **Stop extra location assistance** | Not exposed | Toggle to stop extra Qualcomm / XTRA-style assistance when disabled |
|
||||
| **Kernel command line privacy** | `/proc/cmdline` often world-readable | **Mode 0440** on `/proc/cmdline` for unprivileged apps (GOLDEN/AXP class) |
|
||||
|
||||
#### Security, biometrics, and media metadata
|
||||
|
||||
| Feature | What Lineage does | What AXPR adds |
|
||||
|---------|-------------------|----------------|
|
||||
| **Fingerprint permanent lockout** | Higher failed-attempt threshold | **Stricter lockout** (AXP constant: fewer attempts before permanent lockout) |
|
||||
| **Build serial exposure** | Legacy paths may expose serial via deprecated APIs | **`Build.SERIAL` stays unknown**; real serial only via `Build.getSerial()` + permission |
|
||||
| **Screenshot EXIF** | OS name, time, unique id in metadata | **Minimal EXIF** (width/height only — Calyx/AXP class) |
|
||||
| **Recovery OTA metadata** | Can accept packages restricted to device serial | **Rejects** update packages that carry a `serialno=` constraint |
|
||||
| **Signature spoofing** | microG base only | Developer option **`allow_signature_fake`** (default **off**) for microG / compatible apps |
|
||||
| **Call recording** | Region/carrier gated | Developer option **`extendrom_call_recording`** unlocks recording path in Dialer where supported |
|
||||
| **FLAG_SECURE / screen capture** | Apps can block capture | Optional **`disable_secure_windows`** (default **off**), works on **user** builds without `ro.debuggable=1` |
|
||||
| **Disable app** | Android 16 emphasises **Archive**; disable hidden for many user apps | **Disable** restored for **user-installed** apps in Settings |
|
||||
| **Native debug** | Standard ptrace policy | **`persist.native_debug`** — when enabled, relaxes ptrace scope for debugging (default off) |
|
||||
|
||||
#### Timeouts and System UI
|
||||
|
||||
| Feature | What Lineage does | What AXPR adds |
|
||||
|---------|-------------------|----------------|
|
||||
| **Automatic reboot** | Not in stock LOS Settings | Idle **auto-reboot** (Security settings) |
|
||||
| **Bluetooth timeout** | Manual only | Turns **Bluetooth off** after configurable inactivity |
|
||||
| **Wi‑Fi timeout** | Manual only | Turns **Wi‑Fi off** after configurable inactivity |
|
||||
| **Quick Settings tiles** | Usable from lock screen per tile | **Sensitive tiles require unlock** first (GrapheneOS SystemUI patch) |
|
||||
| **Keyguard / reboot** | Standard | SystemUI / SystemServer hooks for timeout and reboot integration (AXP server extensions) |
|
||||
|
||||
### 2.5 Packages and binaries removed (vs Lineage sunfish)
|
||||
|
||||
Selective **deblob**, not a generic “remove all Google” script.
|
||||
|
||||
#### Wave 1 — Google eUICC LPA
|
||||
|
||||
| Removed | Replaced by |
|
||||
|---------|-------------|
|
||||
| **EuiccGoogle**, **EuiccGoogleOverlay** | **OpenEUICC** (EuiccSupportPixel support packages **kept**) |
|
||||
|
||||
#### Wave 2 — Carrier / RCS Google & AOSP entitlement
|
||||
|
||||
| Removed (examples) | Kept for radio |
|
||||
|--------------------|----------------|
|
||||
| **CarrierServices**, **CarrierSettings**, **CarrierWifi**, **CarrierSetup**, **RilConfigService**, **grilservice** | **ims**, **QtiTelephonyService**, Qualcomm daemons, **Dialer**, **GoogleParts** |
|
||||
| **PresencePolling**, **RcsService** (device makefile) | |
|
||||
| **ImsServiceEntitlement** (telephony product) | |
|
||||
|
||||
#### Wave 3 — Lineage maintenance tools on system
|
||||
|
||||
| Removed from system / system_ext | Still on AXPR (AXP parity) |
|
||||
|----------------------------------|----------------------------|
|
||||
| **bash**, **htop**, **nano**, **unrar**, **addon.d/50-lineage.sh** | **curl**, **vim**, **zstd**, recovery **nano** |
|
||||
|
||||
#### Wave 4 — Debug / diag surface
|
||||
|
||||
| Removed | Explicitly kept |
|
||||
|---------|-----------------|
|
||||
| Qualcomm **diag_*** tools, **test_diag**, **imsrcsd** | **loc_launcher**, **lowi-server**, **xtra-daemon**, IMS RTP/data daemons, **cnss-daemon**; keep Lineage **disable_configstore** (overrides HIDL configstore HAL — required on A16 VINTF) |
|
||||
| Some **AOSP debug** host tools on device where safe | **bpftool**, **alloctop**, **apexd-lsof** remain in build where the OS requires them |
|
||||
|
||||
#### Product OpenSSH (US-S4-1)
|
||||
|
||||
| Removed | Kept |
|
||||
|---------|------|
|
||||
| **ssh**, **sshd**, **scp**, **sftp**, **rsync**, **procmem** on product | **`init.openssh.rc`** stub only (no `sshd` binary) — remote admin via **adb** / Magisk |
|
||||
|
||||
### 2.6 Kernel, allocator, and CVEs (summary)
|
||||
|
||||
On top of the **same msm-4.14** tree Lineage ships:
|
||||
|
||||
- **30 GrapheneOS-derived** kernel patches (Deny USB, allocsize, fortify, slab, sanitize, ro_after_init, randomisation, …) — see §8 below.
|
||||
- Extra **Kconfig**: FORTIFY, init-on-alloc/free, dmesg restrict, slab hardened, **SLAB_FREELIST_RANDOM**; **no Yama** (app compatibility).
|
||||
- **449** documented **CVE** backport identifiers + companion fixes (e.g. USB lock-scope instead of raw **CVE-2022-49980** one-liner).
|
||||
- **hardened_malloc** in **bionic** for 64-bit processes (with graphics/camera exclusions).
|
||||
|
||||
Lineage’s existing hardening (CFI, shadow stack, KASLR, PAN, …) is **retained**.
|
||||
|
||||
### 2.7 Intentionally **not** changed vs Lineage
|
||||
|
||||
- **No** GrapheneOS-style **location lockdown** kernel (GPS behaviour stays LOS-like).
|
||||
- **No** Aosmium / proprietary AXP WebView baked in.
|
||||
- **No** AXP online OTA or external market repositories.
|
||||
- **No** KernelSU in the standard product.
|
||||
- **No** bundled Play Integrity / banking Magisk modules.
|
||||
- **Device tree / modem firmware** line unchanged (Pixel 4a vendor blobs).
|
||||
|
||||
---
|
||||
|
||||
## 3. Who this ROM is for
|
||||
|
||||
- You use **microG** and install apps via **Aurora** / **Droidify** / Play as you choose.
|
||||
- You want **AXP-style settings** (private DNS presets, connectivity controls, classic **Disable app**, timeouts, optional signature spoofing and call-recording unlock) on a **current Lineage** tree.
|
||||
- You accept **custom ROM risks**: unlocked bootloader, community maintenance, no warranty.
|
||||
|
||||
**Not goals of this ROM:** banking attestation guarantees, locked bootloader,
|
||||
proprietary AXP OTA infrastructure, or shipping every Google / carrier app from
|
||||
stock Pixel firmware.
|
||||
|
||||
---
|
||||
|
||||
## 4. Preinstalled applications
|
||||
|
||||
| App | Role |
|
||||
|-----|------|
|
||||
| **microG Services (GmsCore)** | Replaces Google Play Services for many apps |
|
||||
| **GSF Proxy** | Google Services Framework compatibility layer |
|
||||
| **Play Store (Phonesky)** | Google Play client (project-maintained APK) |
|
||||
| **Aurora Store** | Alternative store front-end for Play |
|
||||
| **Droidify** | Lightweight F-Droid client |
|
||||
| **Fossify Gallery** | Gallery (replaces Lineage Gallery2 / Glimpse on this product) |
|
||||
| **Jelly** | Small browser on the product partition |
|
||||
| **OpenEUICC** | eSIM / EUICC management (replaces Google EUICC where removed) |
|
||||
| **Magisk** | Root manager (stub until you complete first-time setup) |
|
||||
| **LineageOS core** | Launcher3, Dialer, Messaging, etc. |
|
||||
|
||||
**WebView:** default is **Lineage / AOSP WebView**. You may install another
|
||||
WebView provider and select it under **Developer options → WebView
|
||||
implementation** (Aosmium and other legacy AXP WebViews are **not** shipped as
|
||||
default).
|
||||
|
||||
---
|
||||
|
||||
## 5. Root and Magisk
|
||||
|
||||
- Magisk is integrated into the **boot image at ROM build time** (AXP / EXTENDROM
|
||||
style **preroot**), not as a normal preinstalled Play-style system app only.
|
||||
- After flashing, open **Magisk** once and allow it to **download and install**
|
||||
the current manager APK if prompted.
|
||||
- **Do not** use “Install to inactive slot” or repeated boot repatching unless
|
||||
you know you need it: the boot image is already prepared. Extra patching often
|
||||
confuses the app and can break A/B slots.
|
||||
- The home screen line **“Ramdisk: Yes/No”** describes how Magisk would install
|
||||
on a *stock* device; on preroot builds it may read **No** even when root works.
|
||||
Check **Magisk version** and whether apps can request superuser.
|
||||
- **Zygisk**, **DenyList**, and modules are **your choice** after activation;
|
||||
the ROM does not ship banking or Play Integrity fix modules.
|
||||
|
||||
**KernelSU** is **not** part of this product line.
|
||||
|
||||
---
|
||||
|
||||
## 6. Settings and toggles (reference)
|
||||
|
||||
Same features as **§2.4**; quick lookup by menu area.
|
||||
|
||||
These appear in **Settings** / **Developer options** (exact menus follow AOSP
|
||||
Lineage layout). Names may be localized.
|
||||
|
||||
### 6.1 Privacy and network
|
||||
|
||||
| Feature | What it does |
|
||||
|---------|----------------|
|
||||
| **Private DNS providers** | Extended preset list (AdGuard, Mullvad, Quad9, Cloudflare, Google DoT, regional providers, etc.) in addition to Lineage defaults |
|
||||
| **Internet connectivity check** | Configurable connectivity validation (AXP-style behaviour; no dependency on AXP-owned servers) |
|
||||
| **Force disable SUPL** | When enabled, disables SUPL-assisted GNSS (stricter location privacy) |
|
||||
| **Stop extra location assistance** | When enabled, reduces extra Qualcomm / XTRA-style assistance daemons |
|
||||
|
||||
### 6.2 Security and developer
|
||||
|
||||
| Feature | What it does |
|
||||
|---------|----------------|
|
||||
| **Signature spoofing** | Developer option to allow microG / selected apps to spoof signatures (restricted API) |
|
||||
| **Call recording unlock** | Toggle to allow call recording where supported (AXP / EXTENDROM class) |
|
||||
| **FLAG_SECURE override** | Optional global override for screen capture blocking (default **off**) |
|
||||
| **Native debug / ptrace** | `persist.native_debug` — when enabled, relaxes ptrace scope for debugging (default off) |
|
||||
| **Disable app** | Classic **disable** for user apps restored alongside Android’s archive behaviour |
|
||||
|
||||
### 6.3 Timeouts (Security / connected devices)
|
||||
|
||||
| Feature | What it does |
|
||||
|---------|----------------|
|
||||
| **Automatic reboot** | Reboot after configurable idle time |
|
||||
| **Bluetooth timeout** | Turn off Bluetooth after inactivity |
|
||||
| **Wi‑Fi timeout** | Turn off Wi‑Fi after inactivity |
|
||||
|
||||
### 6.4 Branding
|
||||
|
||||
- **Build type:** Lineage **PRO** channel naming (`AXP Resurrection Pro` product)
|
||||
- **Release keys** (not `test-keys`) on shipped builds
|
||||
|
||||
---
|
||||
|
||||
## 7. System surface changes (deblob summary)
|
||||
|
||||
Full package-level detail is in **§2.5**. Short overview:
|
||||
|
||||
AXP Resurrection Pro **selectively removes** components that AXP Pro omitted or
|
||||
that are unnecessary on a microG device. This is **not** a blind “remove
|
||||
everything Google” script.
|
||||
|
||||
**Typical removals (by category):**
|
||||
|
||||
| Category | Examples of what is removed or not shipped |
|
||||
|----------|---------------------------------------------|
|
||||
| **Google EUICC / LPA** | Google’s eUICC app (OpenEUICC replaces user-facing LPA) |
|
||||
| **Carrier / RCS Google** | Selected Google carrier and RCS packages not needed for microG |
|
||||
| **Lineage maintenance tools on device** | Interactive shells and convenience packages on **system** that AXP Pro did not ship (e.g. `bash`, `htop`, `nano`, `unrar`, Lineage `addon.d` helper) |
|
||||
| **Lab / debug commands** | Further debug-only binaries trimmed in the full “wave 4” product |
|
||||
|
||||
**Retained (examples):** IMS, telephony services, Wi‑Fi / cellular stack,
|
||||
Widevine, camera, Qualcomm services required for daily use, `curl` / `vim` where
|
||||
AXP Pro kept them.
|
||||
|
||||
**Product partition:** OpenSSH **binaries** are not shipped; an **`init.openssh.rc`
|
||||
stub** may remain (AXP Pro parity) without shipping `sshd` on product.
|
||||
|
||||
---
|
||||
|
||||
## 8. Kernel and memory hardening
|
||||
|
||||
**Kernel version line:** Linux **4.14** (Qualcomm msm-4.14), as shipped by
|
||||
Lineage for Pixel 4a — **not** upgraded to a GKI 6.x kernel.
|
||||
|
||||
### 7.1 Already strong on Lineage (kept)
|
||||
|
||||
Examples: Clang CFI, shadow call stack, stack protector, KASLR, PAN, hardened
|
||||
usercopy, restricted perf events, and related options in the upstream sunfish
|
||||
defconfig.
|
||||
|
||||
### 7.2 GrapheneOS-derived Stage 1 pack (30 patches)
|
||||
|
||||
Backported **GrapheneOS / Android Hardening** series via the AXP kernel patch
|
||||
collection, including:
|
||||
|
||||
| Series | Purpose (summary) |
|
||||
|--------|-------------------|
|
||||
| **Deny USB** | Optional hardening around USB attack surface |
|
||||
| **allocsize** | Allocation size hardening helpers |
|
||||
| **bugon** | `ksize` / BUG_ON integrity checks |
|
||||
| **fortify** | Intra-object FORTIFY helpers in kernel |
|
||||
| **misc** | Miscellaneous hardening commits |
|
||||
| **random** | Brk / argument randomization |
|
||||
| **ro** | `__ro_after_init` and related read-only data hardening |
|
||||
| **sanitize** | Page / slab sanitization helpers |
|
||||
| **slab** | SLAB hardening companions |
|
||||
| **unused** | Removal of unused kernel API noise |
|
||||
|
||||
**Kernel config enabled with this stack (examples):**
|
||||
|
||||
- `CONFIG_FORTIFY_SOURCE`
|
||||
- `CONFIG_INIT_ON_ALLOC_DEFAULT_ON` / `CONFIG_INIT_ON_FREE_DEFAULT_ON`
|
||||
- `CONFIG_SECURITY_DMESG_RESTRICT`
|
||||
- `CONFIG_SLAB_HARDENED`
|
||||
- `CONFIG_SLAB_FREELIST_RANDOM` (US-S5-1 class)
|
||||
- **Yama LSM not enabled** (compat with apps using self-ptrace; matches classic AXP kernel posture)
|
||||
|
||||
**Not ported:** GrapheneOS **location lockdown** kernel policy (this ROM keeps
|
||||
Lineage-style location behaviour and precision).
|
||||
|
||||
### 7.3 Userspace allocator
|
||||
|
||||
- **hardened_malloc** (64-bit) integrated into **bionic** for eligible processes,
|
||||
with exclusions for graphics / camera stacks where required for stability.
|
||||
|
||||
### 7.4 CVE backports
|
||||
|
||||
The ROM applies a large set of **Linux kernel CVE backports** on top of the
|
||||
4.14 sunfish kernel, from the same curated lists used in AXP / Divest-style
|
||||
trees:
|
||||
|
||||
| Set | Count | Notes |
|
||||
|-----|-------|--------|
|
||||
| **Primary backport set** | **429** patch entries | Stable “clean offset” apply list |
|
||||
| **High-offset batches 1–3** | **27** extra patch entries | Larger backports with relaxed offset matching |
|
||||
| **Unique CVE identifiers (combined)** | **449** | Deduplicated ids in the list file below |
|
||||
|
||||
**Full CVE identifier list:** [`kernel-cve-backport-list.txt`](kernel-cve-backport-list.txt)
|
||||
(one CVE id per line, sorted).
|
||||
|
||||
**Special cases (not in the 449 list as-is):**
|
||||
|
||||
- **CVE-2022-49980** — raw one-liner backport is **denied**; a **lock-scope /
|
||||
UAF companion patch** is applied instead (USB subsystem stability).
|
||||
- Additional CVE paths may appear on a **denylist** when they conflict with
|
||||
sunfish drivers (Wi‑Fi, audio, etc.); those are skipped intentionally.
|
||||
|
||||
Platform **Android security patch** level follows **LineageOS merges** (e.g.
|
||||
`2026-09-01` on recent builds). **Vendor** (bootloader/modem) patch level
|
||||
remains on the **2023-09-05** line appropriate for Pixel 4a vendor blobs.
|
||||
|
||||
---
|
||||
|
||||
## 9. Verified Boot and signing
|
||||
|
||||
- Builds are signed with **project release keys** (`release-keys`).
|
||||
- **AVB** metadata uses the project key; **verification flags** suit an
|
||||
**unlocked** bootloader with Magisk (not a locked retail verified-boot product).
|
||||
- **Do not** downgrade vendor security patch below the ROM’s minimum without
|
||||
expecting install blocks or encryption init failures.
|
||||
|
||||
---
|
||||
|
||||
## 10. Installation (summary)
|
||||
|
||||
1. **Unlock bootloader** (erases data).
|
||||
2. Flash **boot** + **dtbo** from the **same** ROM package if you are not already
|
||||
on this ROM’s recovery (Pixel 4a uses recovery-in-boot).
|
||||
3. Boot **recovery** → **Factory reset / format data**.
|
||||
4. **Apply update → ADB sideload** the full `AXP-Resurrection-Pro-*.zip`.
|
||||
5. Reboot, complete setup, then **Magisk** first-time APK install as above.
|
||||
|
||||
Use the **full OTA zip**; flashing only `boot.img` does not update system,
|
||||
microG, or apps.
|
||||
|
||||
---
|
||||
|
||||
## 11. What this ROM does **not** promise
|
||||
|
||||
- No official Google certification or Play Protect “device integrity” guarantee.
|
||||
- No bundled **Play Integrity Fix** or banking modules.
|
||||
- No **AXP.OS** online update servers or external market repositories.
|
||||
- No **NeoLauncher** (Lineage Launcher3 remains).
|
||||
- No **KernelSU** in the standard build.
|
||||
- **Banking apps** may work in work profiles or Island; that is **app-specific**
|
||||
and not a ship guarantee.
|
||||
|
||||
---
|
||||
|
||||
## 12. Credits and lineage
|
||||
|
||||
- **LineageOS** — base operating system and device support.
|
||||
- **microG project** — free Google services reimplementation.
|
||||
- **Magisk** (topjohnwu) — root framework.
|
||||
- **AXP.OS / EXTENDROM** — product philosophy, preroot Magisk packaging, and
|
||||
many userspace behaviours cloned on this port.
|
||||
- **GrapheneOS / Android Hardening** — kernel patch series (via AXP kernel
|
||||
patch collection).
|
||||
- **Community apps:** Aurora, Droidify, Fossify, OpenEUICC, Jelly, etc.
|
||||
|
||||
AXP Resurrection Pro is an **independent community port**. It is not an official
|
||||
LineageOS, Google, or AXP.OS GmbH product.
|
||||
|
||||
---
|
||||
|
||||
## 13. Document history
|
||||
|
||||
| Version | Date | Notes |
|
||||
|---------|------|--------|
|
||||
| 1.1 | 2026-10-11 | Added **§2** delta vs LineageOS (features, removals, framework) |
|
||||
| 1.0 | 2026-10-11 | Initial public feature list for `23.2-20261008` generation |
|
||||
|
||||
For maintainers: internal engineering docs remain separate under `docs/` in the
|
||||
source repository.
|
||||
@@ -0,0 +1,449 @@
|
||||
CVE-2015-7837
|
||||
CVE-2016-3695
|
||||
CVE-2017-18232
|
||||
CVE-2017-5754
|
||||
CVE-2018-20855
|
||||
CVE-2018-5897
|
||||
CVE-2018-9415
|
||||
CVE-2019-10520
|
||||
CVE-2019-11191
|
||||
CVE-2019-12378
|
||||
CVE-2019-12455
|
||||
CVE-2019-12456
|
||||
CVE-2019-12819
|
||||
CVE-2019-15291
|
||||
CVE-2019-16921
|
||||
CVE-2019-18786
|
||||
CVE-2019-19051
|
||||
CVE-2019-19068
|
||||
CVE-2019-19602
|
||||
CVE-2019-20908
|
||||
CVE-2019-3874
|
||||
CVE-2019-9444
|
||||
CVE-2020-0255
|
||||
CVE-2020-15780
|
||||
CVE-2020-16119
|
||||
CVE-2020-29372
|
||||
CVE-2020-8832
|
||||
CVE-2020-BleedingToothExtras
|
||||
CVE-2021-28039
|
||||
CVE-2021-28950
|
||||
CVE-2021-29154
|
||||
CVE-2021-30337
|
||||
CVE-2021-3493
|
||||
CVE-2021-46912
|
||||
CVE-2021-46958
|
||||
CVE-2021-46999
|
||||
CVE-2021-47010
|
||||
CVE-2021-47058
|
||||
CVE-2021-47173
|
||||
CVE-2021-47209
|
||||
CVE-2021-47234
|
||||
CVE-2021-47266
|
||||
CVE-2021-47299
|
||||
CVE-2021-47346
|
||||
CVE-2021-47430
|
||||
CVE-2021-47472
|
||||
CVE-2021-47583
|
||||
CVE-2021-47616
|
||||
CVE-2021-47618
|
||||
CVE-2021-47636
|
||||
CVE-2022-21546
|
||||
CVE-2022-27950
|
||||
CVE-2022-3061
|
||||
CVE-2022-3903
|
||||
CVE-2022-4382
|
||||
CVE-2022-48674
|
||||
CVE-2022-48713
|
||||
CVE-2022-48781
|
||||
CVE-2022-48785
|
||||
CVE-2022-48966
|
||||
CVE-2022-49034
|
||||
CVE-2022-49061
|
||||
CVE-2022-49073
|
||||
CVE-2022-49078
|
||||
CVE-2022-49146
|
||||
CVE-2022-49194
|
||||
CVE-2022-49205
|
||||
CVE-2022-49209
|
||||
CVE-2022-49285
|
||||
CVE-2022-49318
|
||||
CVE-2022-49341
|
||||
CVE-2022-49363
|
||||
CVE-2022-49364
|
||||
CVE-2022-49380
|
||||
CVE-2022-49412
|
||||
CVE-2022-49425
|
||||
CVE-2022-49428
|
||||
CVE-2022-49433
|
||||
CVE-2022-49500
|
||||
CVE-2022-49513
|
||||
CVE-2022-49563
|
||||
CVE-2022-49564
|
||||
CVE-2022-49566
|
||||
CVE-2022-49641
|
||||
CVE-2022-49642
|
||||
CVE-2022-49705
|
||||
CVE-2022-49710
|
||||
CVE-2022-49777
|
||||
CVE-2022-49779
|
||||
CVE-2022-49784
|
||||
CVE-2022-49823
|
||||
CVE-2022-49824
|
||||
CVE-2022-49825
|
||||
CVE-2022-49839
|
||||
CVE-2022-49863
|
||||
CVE-2022-49990
|
||||
CVE-2022-49993
|
||||
CVE-2022-50013
|
||||
CVE-2022-50062
|
||||
CVE-2022-50074
|
||||
CVE-2022-50246
|
||||
CVE-2022-50248
|
||||
CVE-2022-50273
|
||||
CVE-2022-50326
|
||||
CVE-2022-50358
|
||||
CVE-2022-50364
|
||||
CVE-2022-50397
|
||||
CVE-2022-50473
|
||||
CVE-2022-50522
|
||||
CVE-2022-50537
|
||||
CVE-2023-1989
|
||||
CVE-2023-21657
|
||||
CVE-2023-23000
|
||||
CVE-2023-28554
|
||||
CVE-2023-33070
|
||||
CVE-2023-3777
|
||||
CVE-2023-52523
|
||||
CVE-2023-52595
|
||||
CVE-2023-52604
|
||||
CVE-2023-52676
|
||||
CVE-2023-52707
|
||||
CVE-2023-52746
|
||||
CVE-2023-52884
|
||||
CVE-2023-52979
|
||||
CVE-2023-53001
|
||||
CVE-2023-53016
|
||||
CVE-2023-53098
|
||||
CVE-2023-53125
|
||||
CVE-2023-53129
|
||||
CVE-2023-53131
|
||||
CVE-2023-53137
|
||||
CVE-2023-53214
|
||||
CVE-2023-53227
|
||||
CVE-2023-53250
|
||||
CVE-2023-53259
|
||||
CVE-2023-53265
|
||||
CVE-2023-53288
|
||||
CVE-2023-53312
|
||||
CVE-2023-53436
|
||||
CVE-2023-53443
|
||||
CVE-2023-53487
|
||||
CVE-2023-53537
|
||||
CVE-2023-53594
|
||||
CVE-2023-53599
|
||||
CVE-2023-53626
|
||||
CVE-2023-53641
|
||||
CVE-2023-53669
|
||||
CVE-2023-53693
|
||||
CVE-2023-53695
|
||||
CVE-2023-53709
|
||||
CVE-2023-53712
|
||||
CVE-2023-53719
|
||||
CVE-2024-26643
|
||||
CVE-2024-26645
|
||||
CVE-2024-26720
|
||||
CVE-2024-26760
|
||||
CVE-2024-26920
|
||||
CVE-2024-26961
|
||||
CVE-2024-26972
|
||||
CVE-2024-27009
|
||||
CVE-2024-27033
|
||||
CVE-2024-27393
|
||||
CVE-2024-33032
|
||||
CVE-2024-34027
|
||||
CVE-2024-35812
|
||||
CVE-2024-35824
|
||||
CVE-2024-35879
|
||||
CVE-2024-35933
|
||||
CVE-2024-35950
|
||||
CVE-2024-35954
|
||||
CVE-2024-35962
|
||||
CVE-2024-39501
|
||||
CVE-2024-40917
|
||||
CVE-2024-40954
|
||||
CVE-2024-40996
|
||||
CVE-2024-41041
|
||||
CVE-2024-42077
|
||||
CVE-2024-42102
|
||||
CVE-2024-42296
|
||||
CVE-2024-43879
|
||||
CVE-2024-43894
|
||||
CVE-2024-44938
|
||||
CVE-2024-44939
|
||||
CVE-2024-44952
|
||||
CVE-2024-46681
|
||||
CVE-2024-46754
|
||||
CVE-2024-47747
|
||||
CVE-2024-50017
|
||||
CVE-2024-50019
|
||||
CVE-2024-50184
|
||||
CVE-2024-50186
|
||||
CVE-2024-50195
|
||||
CVE-2024-50201
|
||||
CVE-2024-50210
|
||||
CVE-2024-50265
|
||||
CVE-2024-50267
|
||||
CVE-2024-50269
|
||||
CVE-2024-50279
|
||||
CVE-2024-50287
|
||||
CVE-2024-50290
|
||||
CVE-2024-50292
|
||||
CVE-2024-50295
|
||||
CVE-2024-50299
|
||||
CVE-2024-50301
|
||||
CVE-2024-52332
|
||||
CVE-2024-53045
|
||||
CVE-2024-53101
|
||||
CVE-2024-53103
|
||||
CVE-2024-53112
|
||||
CVE-2024-53127
|
||||
CVE-2024-53140
|
||||
CVE-2024-53141
|
||||
CVE-2024-53156
|
||||
CVE-2024-53157
|
||||
CVE-2024-53165
|
||||
CVE-2024-53171
|
||||
CVE-2024-53172
|
||||
CVE-2024-53183
|
||||
CVE-2024-53190
|
||||
CVE-2024-53194
|
||||
CVE-2024-53214
|
||||
CVE-2024-53227
|
||||
CVE-2024-53239
|
||||
CVE-2024-53680
|
||||
CVE-2024-53690
|
||||
CVE-2024-56531
|
||||
CVE-2024-56532
|
||||
CVE-2024-56536
|
||||
CVE-2024-56539
|
||||
CVE-2024-56548
|
||||
CVE-2024-56569
|
||||
CVE-2024-56570
|
||||
CVE-2024-56586
|
||||
CVE-2024-56587
|
||||
CVE-2024-56593
|
||||
CVE-2024-56595
|
||||
CVE-2024-56597
|
||||
CVE-2024-56600
|
||||
CVE-2024-56602
|
||||
CVE-2024-56603
|
||||
CVE-2024-56619
|
||||
CVE-2024-56629
|
||||
CVE-2024-56637
|
||||
CVE-2024-56643
|
||||
CVE-2024-56659
|
||||
CVE-2024-56670
|
||||
CVE-2024-56681
|
||||
CVE-2024-56687
|
||||
CVE-2024-56700
|
||||
CVE-2024-56739
|
||||
CVE-2024-56747
|
||||
CVE-2024-56767
|
||||
CVE-2024-56769
|
||||
CVE-2024-57802
|
||||
CVE-2024-57850
|
||||
CVE-2024-57893
|
||||
CVE-2024-57901
|
||||
CVE-2024-57902
|
||||
CVE-2024-57904
|
||||
CVE-2024-57908
|
||||
CVE-2024-57912
|
||||
CVE-2024-57929
|
||||
CVE-2024-57938
|
||||
CVE-2024-57948
|
||||
CVE-2024-57973
|
||||
CVE-2024-58001
|
||||
CVE-2024-58010
|
||||
CVE-2024-58055
|
||||
CVE-2024-58094
|
||||
CVE-2024-58095
|
||||
CVE-2025-21664
|
||||
CVE-2025-21689
|
||||
CVE-2025-21699
|
||||
CVE-2025-21704
|
||||
CVE-2025-21718
|
||||
CVE-2025-21735
|
||||
CVE-2025-21736
|
||||
CVE-2025-21744
|
||||
CVE-2025-21772
|
||||
CVE-2025-21776
|
||||
CVE-2025-21781
|
||||
CVE-2025-21782
|
||||
CVE-2025-21785
|
||||
CVE-2025-21791
|
||||
CVE-2025-21835
|
||||
CVE-2025-21877
|
||||
CVE-2025-21904
|
||||
CVE-2025-21909
|
||||
CVE-2025-21910
|
||||
CVE-2025-21916
|
||||
CVE-2025-21928
|
||||
CVE-2025-21934
|
||||
CVE-2025-21935
|
||||
CVE-2025-21948
|
||||
CVE-2025-21993
|
||||
CVE-2025-21996
|
||||
CVE-2025-22007
|
||||
CVE-2025-22018
|
||||
CVE-2025-22063
|
||||
CVE-2025-22073
|
||||
CVE-2025-22079
|
||||
CVE-2025-22086
|
||||
CVE-2025-23150
|
||||
CVE-2025-23163
|
||||
CVE-2025-37738
|
||||
CVE-2025-37739
|
||||
CVE-2025-37740
|
||||
CVE-2025-37741
|
||||
CVE-2025-37749
|
||||
CVE-2025-37757
|
||||
CVE-2025-37758
|
||||
CVE-2025-37780
|
||||
CVE-2025-37781
|
||||
CVE-2025-37782
|
||||
CVE-2025-37796
|
||||
CVE-2025-37797
|
||||
CVE-2025-37798
|
||||
CVE-2025-37817
|
||||
CVE-2025-37823
|
||||
CVE-2025-37825
|
||||
CVE-2025-37833
|
||||
CVE-2025-37838
|
||||
CVE-2025-37841
|
||||
CVE-2025-37851
|
||||
CVE-2025-37857
|
||||
CVE-2025-37858
|
||||
CVE-2025-37892
|
||||
CVE-2025-37923
|
||||
CVE-2025-37925
|
||||
CVE-2025-37937
|
||||
CVE-2025-37982
|
||||
CVE-2025-37983
|
||||
CVE-2025-37990
|
||||
CVE-2025-38046
|
||||
CVE-2025-38058
|
||||
CVE-2025-38061
|
||||
CVE-2025-38066
|
||||
CVE-2025-38075
|
||||
CVE-2025-38090
|
||||
CVE-2025-38114
|
||||
CVE-2025-38115
|
||||
CVE-2025-38147
|
||||
CVE-2025-38157
|
||||
CVE-2025-38163
|
||||
CVE-2025-38174
|
||||
CVE-2025-38177
|
||||
CVE-2025-38180
|
||||
CVE-2025-38181
|
||||
CVE-2025-38184
|
||||
CVE-2025-38185
|
||||
CVE-2025-38190
|
||||
CVE-2025-38194
|
||||
CVE-2025-38203
|
||||
CVE-2025-38212
|
||||
CVE-2025-38213
|
||||
CVE-2025-38218
|
||||
CVE-2025-38219
|
||||
CVE-2025-38222
|
||||
CVE-2025-38245
|
||||
CVE-2025-38251
|
||||
CVE-2025-38265
|
||||
CVE-2025-38285
|
||||
CVE-2025-38312
|
||||
CVE-2025-38320
|
||||
CVE-2025-38324
|
||||
CVE-2025-38328
|
||||
CVE-2025-38336
|
||||
CVE-2025-38344
|
||||
CVE-2025-38345
|
||||
CVE-2025-38348
|
||||
CVE-2025-38386
|
||||
CVE-2025-38403
|
||||
CVE-2025-38406
|
||||
CVE-2025-38416
|
||||
CVE-2025-38420
|
||||
CVE-2025-38428
|
||||
CVE-2025-38445
|
||||
CVE-2025-38448
|
||||
CVE-2025-38458
|
||||
CVE-2025-38459
|
||||
CVE-2025-38460
|
||||
CVE-2025-38467
|
||||
CVE-2025-38468
|
||||
CVE-2025-38470
|
||||
CVE-2025-38474
|
||||
CVE-2025-38513
|
||||
CVE-2025-38514
|
||||
CVE-2025-38538
|
||||
CVE-2025-38542
|
||||
CVE-2025-38544
|
||||
CVE-2025-38546
|
||||
CVE-2025-38555
|
||||
CVE-2025-38574
|
||||
CVE-2025-38578
|
||||
CVE-2025-38581
|
||||
CVE-2025-38604
|
||||
CVE-2025-38611
|
||||
CVE-2025-38612
|
||||
CVE-2025-38618
|
||||
CVE-2025-38639
|
||||
CVE-2025-38691
|
||||
CVE-2025-38693
|
||||
CVE-2025-38694
|
||||
CVE-2025-38697
|
||||
CVE-2025-38698
|
||||
CVE-2025-38699
|
||||
CVE-2025-38701
|
||||
CVE-2025-38708
|
||||
CVE-2025-38712
|
||||
CVE-2025-38713
|
||||
CVE-2025-38717
|
||||
CVE-2025-39676
|
||||
CVE-2025-39691
|
||||
CVE-2025-39710
|
||||
CVE-2025-39714
|
||||
CVE-2025-39743
|
||||
CVE-2025-39751
|
||||
CVE-2025-39756
|
||||
CVE-2025-39782
|
||||
CVE-2025-39794
|
||||
CVE-2025-39796
|
||||
CVE-2025-39808
|
||||
CVE-2025-39812
|
||||
CVE-2025-39817
|
||||
CVE-2025-39839
|
||||
CVE-2025-39846
|
||||
CVE-2025-39848
|
||||
CVE-2025-39885
|
||||
CVE-2025-39889
|
||||
CVE-2025-39898
|
||||
CVE-2025-39903
|
||||
CVE-2025-39913
|
||||
CVE-2025-39920
|
||||
CVE-2025-39945
|
||||
CVE-2025-39964
|
||||
CVE-2025-39967
|
||||
CVE-2025-39973
|
||||
CVE-2025-39996
|
||||
CVE-2025-40011
|
||||
CVE-2025-40020
|
||||
CVE-2025-40022
|
||||
CVE-2025-40028
|
||||
CVE-2025-40030
|
||||
CVE-2025-40035
|
||||
CVE-2025-40044
|
||||
CVE-2025-40049
|
||||
CVE-2025-40055
|
||||
CVE-2025-40078
|
||||
CVE-2025-40082
|
||||
@@ -340,7 +340,7 @@ If iodé/vanilla keep failing Yuh KeyMint/RKP, this thread’s stack (SusFS + Tr
|
||||
| Idea | Patch **Magisk** into official GrapheneOS OTAs; keep **AVB + locked bootloader** + root; own OTA channel via [Custota](https://github.com/chenxiaolong/Custota) / GitHub Pages; switch Magisk ↔ rootless by OTA |
|
||||
| Tooling of interest | [avbroot](https://github.com/chenxiaolong/avbroot), Custota, signed OTA pipeline |
|
||||
| Limits (upstream notes) | Stock Magisk Zygisk broken in this setup → banking detection; optional third-party Magisk fork; **KernelSU hard to integrate** with this Magisk-in-OTA approach |
|
||||
| Our use | Inspiration for later **`011`** (project signing / AVB / OTA) and for “locked + root” trade-offs — **not** a Magisk production path (constitution: KernelSU-Next). Do not treat as GrapheneOS-on-sunfish revival |
|
||||
| Our use | Inspiration for later signing / AVB / OTA trade-offs. **This Magisk track (`009`) is the ship root** (KernelSU/`007` standby). Do not treat as GrapheneOS-on-sunfish revival |
|
||||
|
||||
Contrast with §8 (torukk): that one is **sunfish + KSU-Next + SusFS + LOS**; this one is **modern Graphene + Magisk + locked AVB OTA**. Different lessons for different stages.
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
|
||||
|
||||
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
||||
|
||||
# Session handoff — 2026-09-16 (LAB / 007)
|
||||
|
||||
**For the next chat:** read this file first, then `docs/007-kernelsu-runbook.md`.
|
||||
|
||||
@@ -49,7 +49,10 @@ export PRODUCT_DEFAULT_DEV_CERTIFICATE="$CERT_DIR/releasekey"
|
||||
echo "OK: PRODUCT_DEFAULT_DEV_CERTIFICATE=$PRODUCT_DEFAULT_DEV_CERTIFICATE"
|
||||
|
||||
LIVE=kernel/google/msm-4.14
|
||||
BASE=28f9290ae067
|
||||
# Use the kernel revision selected by the pinned LOS manifest. Repeated bacons
|
||||
# are safe because all project patches are uncommitted and HEAD stays at the
|
||||
# upstream commit. AXP_KERNEL_BASE is only for an explicit historical bisect.
|
||||
BASE=${AXP_KERNEL_BASE:-$(git -C "$LIVE" rev-parse HEAD)}
|
||||
KH=vendor/sunfish-a16/patches/009-kernel-hardening
|
||||
LIST_CLEAN="$KH/cve-clean-offset.list"
|
||||
LIST_HI1="$KH/cve-high-offset-batch1.list"
|
||||
@@ -61,6 +64,29 @@ test -f "$LIST_HI2"
|
||||
test -f "$LIST_HI3"
|
||||
test -d "$LIVE"
|
||||
|
||||
# Re-run ship gates + artifact publish from existing out/ (after a post-mka FAIL).
|
||||
if [[ "${AXP_POSTFLIGHT_ONLY:-0}" == 1 ]]; then
|
||||
echo "=== AXP_POSTFLIGHT_ONLY: ship gates + artifacts only $(date -Is) ==="
|
||||
AXP_DEBLOB_WAVE4="${AXP_DEBLOB_WAVE4:-1}"
|
||||
PROD=out/target/product/sunfish
|
||||
shopt -s nullglob
|
||||
_ota_zip=( "$PROD"/lineage-*-PRO-sunfish.zip )
|
||||
shopt -u nullglob
|
||||
if [[ ${#_ota_zip[@]} -lt 1 ]]; then
|
||||
echo "FAIL: missing $PROD/lineage-*-PRO-sunfish.zip (run full bacon first)" >&2
|
||||
exit 1
|
||||
fi
|
||||
_self="$(cd "$(dirname "$0")" && pwd)/$(basename "$0")"
|
||||
_start=$(grep -n '^# Post-ship gates:' "$_self" | head -1 | cut -d: -f1)
|
||||
[[ -n "$_start" ]] || { echo "FAIL: postflight marker missing in $_self" >&2; exit 1; }
|
||||
_pf=$(mktemp /tmp/axp-postflight-XXXX.sh)
|
||||
sed -n "${_start},\$p" "$_self" > "$_pf"
|
||||
bash "$_pf"
|
||||
ec_pf=$?
|
||||
rm -f "$_pf"
|
||||
exit "$ec_pf"
|
||||
fi
|
||||
|
||||
echo "=== reset kernel @ $BASE ==="
|
||||
git -C "$LIVE" reset --hard "$BASE"
|
||||
git -C "$LIVE" clean -fdq
|
||||
@@ -86,7 +112,7 @@ do
|
||||
echo "applied $(basename "$PORT")"
|
||||
done
|
||||
|
||||
# US-S5-1 — Yama + SLAB_FREELIST_RANDOM (Graphene/AXP defconfig gaps)
|
||||
# US-S5-1 — SLAB_FREELIST_RANDOM; keep Yama unset like GOLDEN/AXP.
|
||||
chmod +x "$KH/apply_uss5_1_defconfig.sh" 2>/dev/null || true
|
||||
bash "$KH/apply_uss5_1_defconfig.sh" "$LIVE"
|
||||
|
||||
@@ -118,9 +144,11 @@ if grep -qE "^CONFIG_KSU.*=y" "$DEF"; then
|
||||
fi
|
||||
for k in FORTIFY_SOURCE INIT_ON_ALLOC_DEFAULT_ON INIT_ON_FREE_DEFAULT_ON \
|
||||
SECURITY_DMESG_RESTRICT SLAB_FREELIST_HARDENED \
|
||||
SECURITY_YAMA SLAB_FREELIST_RANDOM; do
|
||||
SLAB_FREELIST_RANDOM; do
|
||||
grep -q "^CONFIG_${k}=y" "$DEF" || { echo "FAIL missing $k" >&2; exit 1; }
|
||||
done
|
||||
grep -q '^# CONFIG_SECURITY_YAMA is not set$' "$DEF" \
|
||||
|| { echo "FAIL: SECURITY_YAMA still enabled (GOLDEN leaves it unset)" >&2; exit 1; }
|
||||
grep -q '^# CONFIG_USERFAULTFD is not set$' "$DEF" \
|
||||
|| { echo "FAIL: USERFAULTFD still enabled (GOLDEN leaves it unset)" >&2; exit 1; }
|
||||
if grep -q '^CONFIG_USERFAULTFD=y$' "$DEF"; then
|
||||
@@ -147,7 +175,15 @@ python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_disable_user_app
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_private_dns_providers.py
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_connectivity_check.py
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_supl_privacy.py
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_product_includes.py
|
||||
grep -q 'sunfish-a16-009-product-includes' device/google/sunfish/lineage_sunfish.mk
|
||||
grep -q 'sunfish-a16-009-board-config' device/google/sunfish/BoardConfigLineage.mk
|
||||
export ANDROID_CERTS_DIR="${ANDROID_CERTS_DIR:-/srv/rom/secrets/android-certs}"
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_axp_identity.py
|
||||
test -f vendor/sunfish-a16/certs/avb.pem
|
||||
test -f vendor/sunfish-a16/certs/avb_pkmd.bin
|
||||
test -f vendor/lineage-priv/keys/releasekey.pk8
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_axp_branding.py
|
||||
grep -q '^VENDOR_SECURITY_PATCH = 2023-09-05$' device/google/sunfish/device-common.mk
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_yama_ptrace.py
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_cmdline_mode.py
|
||||
@@ -181,16 +217,18 @@ if grep -q 'sdk_version: "37"' prebuilts/openeuicc-deps/Android.bp; then
|
||||
fi
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_openssh_packages.py
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_euicc_google.py
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_euicc_disabler_guard.py
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_thermal_cdev_log.py
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_carrier_google.py
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_lineage_tools.py
|
||||
# Wave 4 (diag/bpftool/imsrcsd): only when AXP_DEBLOB_WAVE4=1 (see 009-bacon-wave4-deblob.sh).
|
||||
# Wave 4 (diag/bpftool/imsrcsd) is mandatory for OTAs.
|
||||
# scripts/009-rebuild-from-los.sh and 009-bacon-hardened-malloc.sh set
|
||||
# AXP_DEBLOB_WAVE4=1. Default 0 only for a debug bacon that is not an OTA.
|
||||
AXP_DEBLOB_WAVE4="${AXP_DEBLOB_WAVE4:-0}"
|
||||
if [[ "$AXP_DEBLOB_WAVE4" == 1 ]]; then
|
||||
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_lab_only_commands.py
|
||||
fi
|
||||
# Jelly stays (owner 2026-10-07). Gallery is FossifyGallery. Do not re-add
|
||||
# Gallery2. The product gate requires Jelly.apk and FossifyGallery, and
|
||||
# fails if Gallery2.apk is present.
|
||||
# Jelly stays (owner ship gate). Gallery: LOS Gallery2 and/or Fossify — not gated.
|
||||
|
||||
# Host prebuilts → vendor/sunfish-a16/prebuilt (rsync --delete must not wipe these).
|
||||
mkdir -p vendor/sunfish-a16/prebuilt
|
||||
@@ -206,6 +244,15 @@ link_prebuilt GsfProxy.apk /srv/rom/prebuilts/microg/GsfProxy.apk
|
||||
link_prebuilt AuroraStore.apk /srv/rom/prebuilts/axp-apps/AuroraStore.apk
|
||||
link_prebuilt Droidify.apk /srv/rom/prebuilts/axp-apps/Droidify.apk
|
||||
link_prebuilt FossifyGallery.apk /srv/rom/prebuilts/axp-apps/FossifyGallery.apk
|
||||
|
||||
# GmsCore JNI is deflated with extractNativeLibs=true. Without these files in
|
||||
# /system_ext/app/GmsCore/lib/arm64, Conscrypt/Cronet fail and Google Maps stays brown.
|
||||
GMS_JNI=vendor/sunfish-a16/prebuilt/GmsCore-jni/arm64
|
||||
rm -rf "$GMS_JNI"
|
||||
mkdir -p "$GMS_JNI"
|
||||
unzip -q -j -o vendor/sunfish-a16/prebuilt/GmsCore.apk 'lib/arm64-v8a/*.so' -d "$GMS_JNI"
|
||||
test -s "$GMS_JNI/libconscrypt_gmscore_jni.so" || {
|
||||
echo "FAIL: GmsCore arm64 JNI not extracted into $GMS_JNI" >&2; exit 1; }
|
||||
AAPT=/srv/rom/src/lineage/prebuilts/sdk/tools/linux/bin/aapt
|
||||
"$AAPT" dump permissions vendor/sunfish-a16/prebuilt/Phonesky.apk 2>/dev/null | grep -q USE_EXACT_ALARM
|
||||
|
||||
@@ -263,6 +310,21 @@ case "$AVB_KEY" in
|
||||
esac
|
||||
[[ "$AVB_ALG" == "SHA256_RSA4096" ]] || { echo "FAIL: AVB alg=$AVB_ALG" >&2; exit 1; }
|
||||
|
||||
PRODUCT_PKGS=$(get_build_var PRODUCT_PACKAGES)
|
||||
for _gms in GmsCore GsfProxy Phonesky; do
|
||||
case " $PRODUCT_PKGS " in
|
||||
*" $_gms "*) ;;
|
||||
*) echo "FAIL: PRODUCT_PACKAGES missing $_gms (gms.mk not inherited?)" >&2; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
for _app in AuroraStore Droidify FossifyGallery OpenEUICC; do
|
||||
case " $PRODUCT_PKGS " in
|
||||
*" $_app "*) ;;
|
||||
*) echo "FAIL: PRODUCT_PACKAGES missing $_app (apps.mk not inherited?)" >&2; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
echo "OK: bundled apps in PRODUCT_PACKAGES (AuroraStore Droidify FossifyGallery OpenEUICC)"
|
||||
|
||||
echo "=== mka bacon $(date -Is) signing=$PRODUCT_DEFAULT_DEV_CERTIFICATE ==="
|
||||
set -o pipefail
|
||||
mka bacon -j8
|
||||
@@ -489,18 +551,42 @@ if ! debugfs -R "stat /bin/vim" "$SYSEXT_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
echo "FAIL: expected system_ext/bin/vim present" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! debugfs -R "stat /app/GmsCore/lib/arm64/libconscrypt_gmscore_jni.so" "$SYSEXT_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW" "$SYS_RAW" "$SYSEXT_RAW"
|
||||
echo "FAIL: expected system_ext/app/GmsCore/lib/arm64 JNI (GOLDEN layout)" >&2
|
||||
exit 1
|
||||
fi
|
||||
rm -f "$SYS_RAW" "$SYSEXT_RAW"
|
||||
echo "lineage tools surface OK (no bash/htop/nano/unrar/addon.d; curl+vim kept)"
|
||||
if [[ "$AXP_DEBLOB_WAVE4" == 1 ]]; then
|
||||
VENDOR_RAW=$(mktemp /tmp/axp-vendor-XXXX.img)
|
||||
"$SIMG" "$DEST/vendor.img" "$VENDOR_RAW"
|
||||
for p in /bin/cnss_diag /bin/diag_klog /bin/diag_mdlog /bin/diag_socket_log /bin/diag_uart_log /bin/ssr_diag /bin/test_diag /bin/imsrcsd /bin/disable_configstore /etc/init/imsrcsd.rc; do
|
||||
# target_files can ship vendor.img as raw ext4; simg2img rejects non-sparse input.
|
||||
if [[ "$(od -An -tx4 -N4 "$DEST/vendor.img" | tr -d ' ')" == ed26ff3a ]]; then
|
||||
"$SIMG" "$DEST/vendor.img" "$VENDOR_RAW"
|
||||
else
|
||||
cp "$DEST/vendor.img" "$VENDOR_RAW"
|
||||
fi
|
||||
for p in /bin/cnss_diag /bin/diag_klog /bin/diag_mdlog /bin/diag_socket_log /bin/diag_uart_log /bin/ssr_diag /bin/test_diag /bin/imsrcsd /etc/init/imsrcsd.rc; do
|
||||
if debugfs -R "stat $p" "$VENDOR_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW" "$VENDOR_RAW"
|
||||
echo "FAIL: expected vendor$p absent" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
# disable_configstore must override HIDL configstore HAL (A16 VINTF has no
|
||||
# ISurfaceFlingerConfigs). Expect stub present; real HAL + init rc absent.
|
||||
for p in /bin/hw/android.hardware.configstore@1.1-service /etc/init/android.hardware.configstore@1.1-service.rc; do
|
||||
if debugfs -R "stat $p" "$VENDOR_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW" "$VENDOR_RAW"
|
||||
echo "FAIL: expected vendor$p absent (use disable_configstore override)" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
if ! debugfs -R "stat /bin/disable_configstore" "$VENDOR_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW" "$VENDOR_RAW"
|
||||
echo "FAIL: expected vendor/bin/disable_configstore present (HAL override)" >&2
|
||||
exit 1
|
||||
fi
|
||||
for p in /bin/loc_launcher /bin/lowi-server /bin/xtra-daemon; do
|
||||
if ! debugfs -R "stat $p" "$VENDOR_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW" "$VENDOR_RAW"
|
||||
@@ -509,39 +595,41 @@ if [[ "$AXP_DEBLOB_WAVE4" == 1 ]]; then
|
||||
fi
|
||||
done
|
||||
rm -f "$VENDOR_RAW"
|
||||
echo "lab-only commands surface OK (diag/imsrcsd/debug tools gone; GPS daemons kept)"
|
||||
echo "lab-only commands surface OK (diag/imsrcsd gone; configstore HAL overridden; GPS kept)"
|
||||
fi
|
||||
|
||||
# US-S4-2 — Jelly stays. FossifyGallery stays; Gallery2 does not.
|
||||
# Stale JNI symlink dirs under product/app/Gallery2/lib can remain from
|
||||
# older out/ — gate Gallery2 on the APK.
|
||||
# US-S4-2 — ship gate: Jelly browser on product (owner requirement). Gallery app
|
||||
# (LOS Gallery2 vs Fossify) is not gated; either is fine.
|
||||
if ! debugfs -R "stat /app/Jelly/Jelly.apk" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW"
|
||||
echo "FAIL: US-S4-2 expected Jelly.apk on product.img" >&2
|
||||
exit 1
|
||||
fi
|
||||
if debugfs -R "stat /app/Gallery2/Gallery2.apk" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW"
|
||||
echo "FAIL: US-S4-2 expected Gallery2.apk absent on product.img" >&2
|
||||
exit 1
|
||||
fi
|
||||
if debugfs -R "stat /app/Gallery2" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
echo "WARN: US-S4-2 /app/Gallery2 dir still present (likely stale jni symlinks; no APK)"
|
||||
fi
|
||||
if ! debugfs -R "stat /app/FossifyGallery" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW"
|
||||
echo "FAIL: US-S4-2 expected FossifyGallery present" >&2
|
||||
exit 1
|
||||
fi
|
||||
rm -f "$PROD_RAW"
|
||||
echo "US-S4-2 product surface OK (Jelly + FossifyGallery; no Gallery2 APK)"
|
||||
for _bundled in AuroraStore Droidify FossifyGallery; do
|
||||
if debugfs -R "stat /app/${_bundled}/${_bundled}.apk" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW"
|
||||
echo "FAIL: US-S4-3 AXP parity: ${_bundled} must not be on product.img" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
SYSEXT_RAW=$(mktemp /tmp/axp-systemext-XXXX.img)
|
||||
"$SIMG" "$DEST/system_ext.img" "$SYSEXT_RAW"
|
||||
for _bundled in AuroraStore Droidify FossifyGallery; do
|
||||
if ! debugfs -R "stat /app/${_bundled}/${_bundled}.apk" "$SYSEXT_RAW" 2>&1 | grep -q 'Inode:'; then
|
||||
rm -f "$PROD_RAW" "$SYSEXT_RAW"
|
||||
echo "FAIL: US-S4-3 expected system_ext/app/${_bundled}/${_bundled}.apk" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
rm -f "$PROD_RAW" "$SYSEXT_RAW"
|
||||
echo "US-S4-2/3 surface OK (Jelly product + Aurora/Droidify/FossifyGallery system_ext)"
|
||||
|
||||
{
|
||||
echo "artifact=$DEST"
|
||||
echo "list_clean=$LIST_CLEAN (429)"
|
||||
echo "list_hi=batch1+2+3"
|
||||
echo "kernel_stage1=30 (misc/0021 omitted; base KSYM_NAME_LEN=192 retained)"
|
||||
echo "hardening=Stage1+combo4+FORTIFY + CVE-clean + hi-batch1+2+3 + US-S4-1-no-openssh + US-S4-2-jelly-fossify + US-S5-1-yama-slabrand + CVE-2022-49980-lock-scope"
|
||||
echo "hardening=Stage1+combo4+FORTIFY + CVE-clean + hi-batch1+2+3 + US-S4-1-no-openssh + US-S4-2-jelly + US-S5-1-slabrand-no-yama + CVE-2022-49980-lock-scope"
|
||||
echo "vendor_security_patch=2023-09-05"
|
||||
echo "branding=AXP-Resurection-Pro"
|
||||
echo "signing=$PRODUCT_DEFAULT_DEV_CERTIFICATE"
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
#!/bin/bash
|
||||
# 012 bacon: current ship pack plus Graphene hardened_malloc.
|
||||
# Compiles libc first. The full bacon runs only if that link succeeds.
|
||||
# Does not change AVB flags or run the userspace deblob.
|
||||
# Final ship candidate: closure pack + wave 4 deblob + hardened_malloc (2 GiB regions).
|
||||
# Compiles libc first; full bacon runs only if that link succeeds.
|
||||
# AVB flags 0 (Magisk track). Queue after any in-flight ninja on the same out/.
|
||||
set -e
|
||||
export AXP_AVB_FLAGS=0
|
||||
export WITH_AVB=true
|
||||
export AXP_DEBLOB_WAVE4=1
|
||||
cd /srv/rom/src/lineage
|
||||
export HOME=/home/android-build
|
||||
export CCACHE_DIR=/srv/rom/ccache
|
||||
@@ -26,4 +29,5 @@ breakfast sunfish user
|
||||
echo "=== m libc $(date -Is) ==="
|
||||
m libc -j8
|
||||
echo "=== libc ok, starting bacon $(date -Is) ==="
|
||||
exec /srv/rom/artifacts/bin/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh
|
||||
# Same tree as this file (do not depend on a stale copy under artifacts/bin).
|
||||
exec bash "$(cd "$(dirname "$0")" && pwd)/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh"
|
||||
@@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env bash
|
||||
# Read-only Yuh / banking surface diff: GOLDEN oracle vs LAB.
|
||||
# Requires: adb, both devices authorized, root shell (Magisk su).
|
||||
set -euo pipefail
|
||||
|
||||
GOLDEN=11071JEC203839
|
||||
LAB=11231JEC207477
|
||||
PKG=com.yuh
|
||||
USER_ISLAND=10
|
||||
|
||||
section() { echo; echo "======== $1 ========"; }
|
||||
|
||||
dump_device() {
|
||||
local tag=$1 serial=$2
|
||||
section "$tag ($serial)"
|
||||
adb -s "$serial" shell true >/dev/null 2>&1 || {
|
||||
echo "adb not ready for $serial"
|
||||
return 1
|
||||
}
|
||||
|
||||
adb -s "$serial" shell "su -c '
|
||||
echo --- build ---
|
||||
getprop ro.build.display.id
|
||||
getprop ro.build.version.release
|
||||
getprop ro.build.version.sdk
|
||||
echo --- magisk ---
|
||||
magisk -v 2>/dev/null || true
|
||||
magisk --sqlite \"SELECT key,value FROM settings\" 2>/dev/null | sort
|
||||
echo --- modules (no disable) ---
|
||||
for d in /data/adb/modules/*; do
|
||||
[ -d \"\$d\" ] || continue
|
||||
name=\$(basename \"\$d\")
|
||||
[ -f \"\$d/disable\" ] && state=DISABLED || state=active
|
||||
id=
|
||||
[ -f \"\$d/module.prop\" ] && id=\$(grep -E ^id= \"\$d/module.prop\" | cut -d= -f2)
|
||||
echo \"\$state \$name id=\$id\"
|
||||
done
|
||||
echo --- tricky_store targets ---
|
||||
if [ -f /data/adb/tricky_store/target.txt ]; then
|
||||
cat /data/adb/tricky_store/target.txt
|
||||
else
|
||||
echo missing target.txt
|
||||
fi
|
||||
echo --- denylist (yuh / swissquote) ---
|
||||
magisk --denylist ls 2>/dev/null | grep -E \"yuh|swissquote\" || true
|
||||
echo --- boot props (app-visible) ---
|
||||
getprop ro.boot.verifiedbootstate
|
||||
getprop ro.boot.flash.locked
|
||||
getprop ro.boot.vbmeta.device_state
|
||||
getprop ro.boot.veritymode
|
||||
getprop sys.oem_unlock_allowed
|
||||
echo --- cmdline mode ---
|
||||
ls -l /proc/cmdline
|
||||
echo --- yuh packages ---
|
||||
pm list packages --user 0 \"$PKG\" 2>/dev/null || true
|
||||
pm list packages --user $USER_ISLAND \"$PKG\" 2>/dev/null || true
|
||||
dumpsys package \"$PKG\" 2>/dev/null | grep -E \"versionName|versionCode|firstInstallTime|installerPackage\" | head -20
|
||||
echo --- island ---
|
||||
pm list packages --user $USER_ISLAND com.oasisfeng.island.fdroid 2>/dev/null | head -1
|
||||
dumpsys package com.oasisfeng.island.fdroid 2>/dev/null | grep versionName | head -1
|
||||
echo --- vector props log (tail) ---
|
||||
if [ -f /data/adb/lspd/log/props.txt ]; then
|
||||
tail -30 /data/adb/lspd/log/props.txt
|
||||
else
|
||||
echo no props.txt
|
||||
fi
|
||||
'" 2>&1 | sed 's/\r$//'
|
||||
}
|
||||
|
||||
dump_device GOLDEN "$GOLDEN" || true
|
||||
dump_device LAB "$LAB" || true
|
||||
|
||||
section "Next: Yuh open in Island user $USER_ISLAND on LAB only"
|
||||
echo " adb -s $LAB logcat -c"
|
||||
echo " # open Yuh in Island, reproduce fail"
|
||||
echo " adb -s $LAB logcat -d | grep -iE 'yuh|talsec|keystore2|KeyMint|integrity|DroidGuard|vectord|teesim' | tail -80"
|
||||
@@ -0,0 +1,158 @@
|
||||
#!/bin/bash
|
||||
# Rebuild AXP Resurection from a LineageOS 23.2 sunfish tree on rom-dev01.
|
||||
#
|
||||
# This is the OTA entry point. It always ships:
|
||||
# - Magisk 30.7 preroot + release-keys (009 bacon)
|
||||
# - wave 4 deblob (AXP_DEBLOB_WAVE4=1)
|
||||
# - hardened_malloc 2 GiB (012), after a libc link check
|
||||
# - AVB flags 0 (WITH_AVB=true)
|
||||
#
|
||||
# It does not download the signed nightly zip. The source is the repo tree
|
||||
# at LINEAGE_TREE (default /srv/rom/src/lineage), branch lineage-23.2.
|
||||
#
|
||||
# Usage (host only, detached):
|
||||
# LOS_SYNC=1 /srv/rom/artifacts/bin/rom-detach bacon009ota -- \
|
||||
# bash /path/to/AXP_Resurection/scripts/009-rebuild-from-los.sh
|
||||
#
|
||||
# LOS_SYNC=1
|
||||
# Clean project worktrees, repo sync -c -j8 --force-sync, then check out every project
|
||||
# revision from LOS_MANIFEST. LOS_MANIFEST is mandatory in this mode.
|
||||
# LOS_MANIFEST=/path/to/build-manifest.xml
|
||||
# Exact official nightly build-manifest.xml. After pinning, write repo
|
||||
# manifest -r and fail if any common project revision differs.
|
||||
# LOS_DATE=YYYYMMDD
|
||||
# Nightly date used as LINEAGE_BUILD_DATE, so the zip is named
|
||||
# AXP-Resurection-Pro-23.2-<LOS_DATE>-sunfish.zip.
|
||||
#
|
||||
# Current tree (2026-10-10) was synced 2026-09-13 (vanilla bacon 2026-09-14),
|
||||
# kernel reset each bacon to 28f9290ae067. That is NOT
|
||||
# lineage-23.2-20261008-nightly-sunfish. Set LOS_SYNC=1 to move the tree
|
||||
# forward, then compare manifests before trusting the zip.
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
||||
TREE=${LINEAGE_TREE:-/srv/rom/src/lineage}
|
||||
ART=/srv/rom/artifacts/009-axp-los23-port
|
||||
PROJECT_SOURCE=${AXP_PROJECT_SOURCE:-}
|
||||
|
||||
if [[ ! -d "$TREE/.repo" ]]; then
|
||||
echo "FAIL: $TREE is not a repo checkout" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "$TREE"
|
||||
# rom-dev01: if bacon is started as root, git refuses android-build-owned trees.
|
||||
export HOME="${HOME:-/home/android-build}"
|
||||
mkdir -p "$ART"
|
||||
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
|
||||
|
||||
if [[ "${LOS_SYNC:-0}" == 1 ]]; then
|
||||
if [[ -z "${LOS_MANIFEST:-}" || ! -f "$LOS_MANIFEST" ]]; then
|
||||
echo "FAIL: LOS_SYNC=1 requires an existing LOS_MANIFEST" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "=== clean existing project worktrees $(date -Is) ==="
|
||||
repo forall -c 'git reset --hard -q HEAD; git clean -fdq'
|
||||
echo "=== repo sync -c -j8 --force-sync $(date -Is) ==="
|
||||
# force-sync is needed when upstream changed a project's object-store
|
||||
# association. Project worktrees were reset above; our patch source is
|
||||
# staged outside the repo tree.
|
||||
repo sync -c -j8 --force-sync
|
||||
echo "=== pin projects to $(basename "$LOS_MANIFEST") $(date -Is) ==="
|
||||
python3 - "$LOS_MANIFEST" <<'PY'
|
||||
import pathlib
|
||||
import subprocess
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
root = ET.parse(sys.argv[1]).getroot()
|
||||
missing = []
|
||||
count = 0
|
||||
for el in root.iter("project"):
|
||||
path = pathlib.Path(el.get("path") or el.get("name") or "")
|
||||
rev = el.get("revision")
|
||||
if not path or not rev:
|
||||
continue
|
||||
if not (path / ".git").exists():
|
||||
missing.append(str(path))
|
||||
continue
|
||||
probe = subprocess.run(
|
||||
["git", "-C", str(path), "cat-file", "-e", f"{rev}^{{commit}}"],
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.DEVNULL,
|
||||
)
|
||||
if probe.returncode:
|
||||
sys.exit(f"FAIL: nightly revision unavailable in {path}: {rev}")
|
||||
subprocess.run(
|
||||
["git", "-C", str(path), "checkout", "--detach", "-q", rev],
|
||||
check=True,
|
||||
)
|
||||
subprocess.run(["git", "-C", str(path), "clean", "-fdq"], check=True)
|
||||
count += 1
|
||||
print(f"OK: pinned {count} projects; {len(missing)} nightly-only paths absent locally")
|
||||
for path in missing[:20]:
|
||||
print(f"MISSING_LOCAL {path}")
|
||||
if len(missing) > 20:
|
||||
print(f"... {len(missing) - 20} more missing paths")
|
||||
PY
|
||||
fi
|
||||
|
||||
MANIFEST_OUT="$ART/manifest-${STAMP}.xml"
|
||||
repo manifest -r -o "$MANIFEST_OUT"
|
||||
echo "OK: wrote $MANIFEST_OUT"
|
||||
|
||||
if [[ -n "${LOS_MANIFEST:-}" ]]; then
|
||||
if [[ ! -f "$LOS_MANIFEST" ]]; then
|
||||
echo "FAIL: LOS_MANIFEST not a file: $LOS_MANIFEST" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "=== manifest diff vs $LOS_MANIFEST ==="
|
||||
python3 - "$MANIFEST_OUT" "$LOS_MANIFEST" <<'PY'
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
def revs(path):
|
||||
root = ET.parse(path).getroot()
|
||||
out = {}
|
||||
for el in root.iter("project"):
|
||||
name = el.get("name") or el.get("path")
|
||||
rev = el.get("revision")
|
||||
if name and rev:
|
||||
out[name] = rev
|
||||
return out
|
||||
|
||||
local, nightly = revs(sys.argv[1]), revs(sys.argv[2])
|
||||
only_l = sorted(set(local) - set(nightly))
|
||||
only_n = sorted(set(nightly) - set(local))
|
||||
differ = sorted(n for n in local.keys() & nightly.keys() if local[n] != nightly[n])
|
||||
print(f"projects local={len(local)} nightly={len(nightly)} differ={len(differ)} only_local={len(only_l)} only_nightly={len(only_n)}")
|
||||
for n in differ[:40]:
|
||||
print(f"DIFF {n}\n local {local[n]}\n nightly {nightly[n]}")
|
||||
if len(differ) > 40:
|
||||
print(f"... {len(differ) - 40} more diffs")
|
||||
if differ:
|
||||
sys.exit("FAIL: local source revisions do not match the pinned nightly")
|
||||
PY
|
||||
fi
|
||||
|
||||
if [[ -n "${LOS_DATE:-}" ]]; then
|
||||
[[ "$LOS_DATE" =~ ^[0-9]{8}$ ]] || { echo "FAIL: LOS_DATE must be YYYYMMDD" >&2; exit 1; }
|
||||
echo "$LOS_DATE" > "$TREE/.axp-los-date"
|
||||
echo "OK: build name date = LOS nightly $LOS_DATE"
|
||||
fi
|
||||
|
||||
if [[ -n "$PROJECT_SOURCE" ]]; then
|
||||
if [[ ! -d "$PROJECT_SOURCE/vendor/sunfish-a16" ]]; then
|
||||
echo "FAIL: AXP_PROJECT_SOURCE lacks vendor/sunfish-a16: $PROJECT_SOURCE" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "=== install current AXP working tree into source tree ==="
|
||||
rsync -a --delete --exclude .git \
|
||||
"$PROJECT_SOURCE/vendor/sunfish-a16/" "$TREE/vendor/sunfish-a16/"
|
||||
fi
|
||||
|
||||
echo "=== mandatory ship: wave4 + hardened_malloc + release-keys bacon ==="
|
||||
export AXP_DEBLOB_WAVE4=1
|
||||
export AXP_AVB_FLAGS=0
|
||||
export WITH_AVB=true
|
||||
exec bash "$SCRIPT_DIR/009-bacon-hardened-malloc.sh"
|
||||
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
# After fixing the laptop tree: re-stage and relaunch polish bacon on rom-dev01.
|
||||
set -euo pipefail
|
||||
ROOT=$(cd "$(dirname "$0")/.." && pwd)
|
||||
STAGE="${1:-/srv/rom/artifacts/009-axp-los23-port/worktree-20261016-polish}"
|
||||
SESSION="${BACON_SESSION:-bacon009polish20261016}"
|
||||
SSH=(ssh -F "$ROOT/docs/ssh/config" a16-build)
|
||||
|
||||
"$ROOT/scripts/009-sync-ota-stage-to-host.sh" "$STAGE"
|
||||
|
||||
"${SSH[@]}" "AXP_PROJECT_SOURCE=$STAGE LOS_SYNC=0 LOS_DATE=20261016 \
|
||||
/srv/rom/artifacts/bin/rom-detach $SESSION -- \
|
||||
bash $STAGE/scripts/009-rebuild-from-los.sh"
|
||||
|
||||
echo "OK: bacon relaunched ($SESSION). Check:"
|
||||
echo " ssh -F docs/ssh/config a16-build cat /srv/rom/artifacts/detach-${SESSION}.status"
|
||||
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
# Push OTA rebuild inputs from laptop checkout to rom-dev01 stage dir.
|
||||
# Does NOT change the phone. Apps/bootanim ship only after rom-dev01 bacon + sideload.
|
||||
# Usage: scripts/009-sync-ota-stage-to-host.sh [stage-dir-on-host]
|
||||
set -euo pipefail
|
||||
ROOT=$(cd "$(dirname "$0")/.." && pwd)
|
||||
STAGE=${1:-/srv/rom/artifacts/009-axp-los23-port/worktree-20261010-ota}
|
||||
SSH=(ssh -F "$ROOT/docs/ssh/config" a16-build)
|
||||
RSYNC_RSH="ssh -F $ROOT/docs/ssh/config"
|
||||
"${SSH[@]}" "mkdir -p '$STAGE/scripts' '$STAGE/vendor/sunfish-a16'"
|
||||
rsync -a --delete --exclude .git/ "$ROOT/scripts/" "a16-build:$STAGE/scripts/" -e "$RSYNC_RSH"
|
||||
rsync -a --delete --exclude .git/ "$ROOT/vendor/sunfish-a16/" "a16-build:$STAGE/vendor/sunfish-a16/" -e "$RSYNC_RSH"
|
||||
bash -n "$ROOT/scripts/009-rebuild-from-los.sh" "$ROOT/scripts/009-bacon-hardened-malloc.sh" \
|
||||
"$ROOT/scripts/009-bacon-hardened-malloc.sh" "$ROOT/scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh"
|
||||
"${SSH[@]}" "bash -n '$STAGE/scripts/009-rebuild-from-los.sh'"
|
||||
echo "OK: staged to $STAGE on rom-dev01"
|
||||
@@ -0,0 +1,32 @@
|
||||
# Build / host scripts
|
||||
|
||||
**OTA / rebuild from LOS (use this):**
|
||||
`009-rebuild-from-los.sh`
|
||||
|
||||
Always includes wave 4 deblob + hardened_malloc + Magisk release-keys bacon.
|
||||
Optional `LOS_SYNC=1` runs `repo sync` first. Run on `rom-dev01` via `rom-detach`.
|
||||
|
||||
**Laptop → host stage (OTA inputs only):**
|
||||
|
||||
- `009-sync-ota-stage-to-host.sh` — rsync project tree to
|
||||
`/srv/rom/artifacts/009-axp-los23-port/worktree-*` on `rom-dev01`
|
||||
- `009-relaunch-polish-bacon.sh` — sync + detached `009-rebuild-from-los.sh`
|
||||
(default session `bacon009polish20261016`, `LOS_DATE=20261016`)
|
||||
|
||||
Low-level pieces (called by the rebuild script, not a full OTA by themselves):
|
||||
|
||||
- `009-bacon-hardened-malloc.sh` — malloc link check, then ship bacon with wave 4
|
||||
- `009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` — kernel pack + userspace applies + `mka bacon`
|
||||
- `009-bacon-wave4-deblob.sh` — wave 4 only (no malloc; not an OTA)
|
||||
|
||||
Checklist: `docs/009-upstream-rebase-ota.md`
|
||||
|
||||
**Historical / bisect only** (do not use for routine ship):
|
||||
`009-bacon-axp-stage1-combo4*.sh` without `releasekeys`, `009-wait-flash-*`,
|
||||
`009-watch-then-cve-bacon.sh`, `009-build-fortify-*`, `009-bisect-*`,
|
||||
`009-fortify-select-family.py`.
|
||||
|
||||
LAB helpers: `009-diff-yuh-golden-lab.sh`, `009-read-swissquote-rasp.py`,
|
||||
`check-module-abi.py` (KernelSU module ABI).
|
||||
|
||||
All heavy builds run on `rom-dev01` via `rom-detach` — see `AGENTS.md`.
|
||||
@@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
# Build sunfish bootanimation.tar from two GIFs (loading + loaded finale).
|
||||
# Lineage Android.mk prepends "W H FPS" and appends branding/bootanimation/desc.txt.
|
||||
#
|
||||
# Sequence (desc.txt):
|
||||
# part0 loading — play once
|
||||
# part1 loaded — play once (finale before bootanim waits on part2)
|
||||
# part2 hold — loop last loaded frame until boot completes
|
||||
#
|
||||
# Output: vendor/sunfish-a16/branding/bootanimation/bootanimation.tar
|
||||
set -euo pipefail
|
||||
|
||||
ROOT=$(cd "$(dirname "$0")/.." && pwd)
|
||||
LOADING=${1:-/home/aventura/Downloads/AXP_OS_Resurrection_loading.gif}
|
||||
LOADED=${2:-/home/aventura/Downloads/AXP_OS_Resurrection_loaded.gif}
|
||||
OUT="$ROOT/artifacts/bootanimation-resurrection"
|
||||
WORK="$OUT/work"
|
||||
W=1080
|
||||
H=2340
|
||||
FPS=30
|
||||
|
||||
# Fill frame (no letterbox band); AXP_BOOTANIMATION_FULLSCREEN in branding.mk.
|
||||
VF="scale=${W}:${H}:force_original_aspect_ratio=increase,crop=${W}:${H},format=rgb24"
|
||||
|
||||
rm -rf "$WORK"
|
||||
mkdir -p "$WORK/part0" "$WORK/part1" "$WORK/part2"
|
||||
|
||||
ffmpeg -y -i "$LOADING" -vf "$VF" "$WORK/part0/%05d.png"
|
||||
ffmpeg -y -i "$LOADED" -vf "$VF" "$WORK/part1/%05d.png"
|
||||
|
||||
LAST_LOADED=$(ls -1 "$WORK/part1"/*.png | sort | tail -1)
|
||||
cp "$LAST_LOADED" "$WORK/part2/00001.png"
|
||||
|
||||
cat >"$ROOT/vendor/sunfish-a16/branding/bootanimation/desc.txt" <<'EOF'
|
||||
c 1 0 part0
|
||||
c 1 0 part1
|
||||
c 0 0 part2
|
||||
EOF
|
||||
cp "$ROOT/vendor/sunfish-a16/branding/bootanimation/desc.txt" "$WORK/desc.txt"
|
||||
|
||||
rm -f "$OUT/bootanimation.zip"
|
||||
(cd "$WORK" && zip -0 -q "$OUT/bootanimation.zip" desc.txt && zip -0 -q -r "$OUT/bootanimation.zip" part0 part1 part2)
|
||||
unzip -t "$OUT/bootanimation.zip" >/dev/null
|
||||
|
||||
TAR="$ROOT/vendor/sunfish-a16/branding/bootanimation/bootanimation.tar"
|
||||
(cd "$WORK" && tar cf "$TAR" part0 part1 part2)
|
||||
|
||||
n0=$(ls -1 "$WORK/part0" | wc -l)
|
||||
n1=$(ls -1 "$WORK/part1" | wc -l)
|
||||
identify "$WORK/part0/00001.png" "$WORK/part2/00001.png"
|
||||
ls -lh "$OUT/bootanimation.zip" "$TAR"
|
||||
echo "OK: rebacon (or mka bootanimation.zip) — sync branding to host first"
|
||||
@@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
# Pull recent Bluetooth / pairing / PBAP lines from LAB log buffers (no repro needed).
|
||||
set -euo pipefail
|
||||
LAB="${LAB_SERIAL:-11231JEC207477}"
|
||||
OUT_DIR="${1:-$(cd "$(dirname "$0")/.." && pwd)/.local-artifacts/lab-bt-logs}"
|
||||
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
|
||||
mkdir -p "$OUT_DIR"
|
||||
|
||||
adb -s "$LAB" shell true >/dev/null 2>&1 || {
|
||||
echo "LAB $LAB not visible to adb (USB or wireless debugging)." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
BASE="$OUT_DIR/${STAMP}-lab-bt"
|
||||
echo "LAB identity:"
|
||||
adb -s "$LAB" shell getprop ro.lineage.version ro.build.display.id 2>/dev/null | tr '\n' ' '
|
||||
echo
|
||||
|
||||
adb -s "$LAB" shell settings get global bluetooth_off_timeout >"${BASE}-bt-timeout.txt"
|
||||
|
||||
adb -s "$LAB" logcat -d -v threadtime -t 80000 >"${BASE}-logcat-main.txt"
|
||||
adb -s "$LAB" logcat -b events -d -v threadtime -t 50000 >"${BASE}-logcat-events.txt"
|
||||
|
||||
adb -s "$LAB" shell dumpsys bluetooth_manager >"${BASE}-dumpsys-bluetooth_manager.txt"
|
||||
adb -s "$LAB" shell dumpsys package com.android.bluetooth >"${BASE}-dumpsys-pkg-bluetooth.txt"
|
||||
|
||||
grep -iE 'bluetooth|pbap|phonebook|pair|bond|BtAutoOff|PermissionController|READ_CONTACTS|READ_CALL_LOG' \
|
||||
"${BASE}-logcat-main.txt" >"${BASE}-grep-main.txt" || true
|
||||
grep -iE 'bt_|bond|pair' "${BASE}-logcat-events.txt" >"${BASE}-grep-events.txt" || true
|
||||
|
||||
echo "Wrote:"
|
||||
ls -la "${BASE}"-*
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
# Wallapop runs in Island (user 10, uid 1010271). Plain adb logcat often shows nothing.
|
||||
set -euo pipefail
|
||||
UID_WALLAPOP=1010271
|
||||
echo "Clear log, reproduce login error on Island Wallapop, wait 10s..."
|
||||
adb logcat -c
|
||||
sleep 10
|
||||
adb logcat -d --uid="$UID_WALLAPOP" > "/tmp/wallapop-uid-${UID_WALLAPOP}.log"
|
||||
grep -iE 'error|exception|fail|auth|openid|http|integrity|host|ssl|connect' "/tmp/wallapop-uid-${UID_WALLAPOP}.log" | tail -80
|
||||
echo "--- full log: /tmp/wallapop-uid-${UID_WALLAPOP}.log"
|
||||
@@ -1,6 +1,9 @@
|
||||
# Feature Specifications
|
||||
|
||||
Numbered feature specs for `sunfish-a16-rom`.
|
||||
Numbered feature specs for **AXP_Resurection** (Magisk AXP → LOS 23.2 track).
|
||||
|
||||
Sibling workspace `sunfish-a16-rom` keeps the KernelSU / split-roadmap track.
|
||||
Do not merge those ship intents here unless the owner asks.
|
||||
|
||||
## Structure
|
||||
|
||||
@@ -13,12 +16,6 @@ specs/
|
||||
└── …
|
||||
```
|
||||
|
||||
## Numbering
|
||||
|
||||
- Three-digit, sequential: `001-…`, `002-…`
|
||||
- Short name: lowercase, hyphen-separated
|
||||
- Create a feature directory only when ready to specify/implement it
|
||||
|
||||
## Spec-as-source
|
||||
|
||||
1. Edit requirements only in `spec.md`.
|
||||
@@ -26,37 +23,44 @@ specs/
|
||||
3. Implementation follows the active feature; do not invent decisions missing
|
||||
from the constitution or the active `spec.md`.
|
||||
|
||||
## Active / next features
|
||||
## Active ship
|
||||
|
||||
| Dir | Intent |
|
||||
|-----|--------|
|
||||
| `001-development-environment` | ROM build host env on existing `rom-dev01` (not VM creation) |
|
||||
| `002-axp-reference-capture` | Document GOLDEN AXP oracle + LAB stock rescue; no NeoBackup/wipe of GOLDEN |
|
||||
| `003-lineage-23-vanilla-build` | First vanilla LOS 23.2 on **LAB only** → flash → boot → P1 (**done** 2026-09-14) |
|
||||
| `004-microg-phonesky-integration` | microG + GSF Proxy + patched Phonesky on LAB (packaging done; Self-Check/auth → `005`) |
|
||||
| `005-restricted-signature-spoofing` | Restricted spoofing + bacon zip — **done enough for LAB**; Location UI follow-up open |
|
||||
| `007-kernelsu-sunfish` | ReSukiSU + SusFS bring-up — **incomplete** (banks FAIL; see `docs/007-lab-results-20260916.md`) |
|
||||
| `008-call-rec-flag-secure` | Native DO toggles: call-rec region unlock + global FLAG_SECURE override — **next** |
|
||||
| Dir | Intent | Status |
|
||||
|-----|--------|--------|
|
||||
| **`009-axp-los23-port`** | Magisk like GOLDEN on LOS 23.2 / A16 sunfish; AXP-class userspace | **Active ship** — LAB closure 2026-10-09; see `docs/009-handoff-20261008.md` |
|
||||
|
||||
Handoff snapshot: `docs/session-20260916-handoff.md`.
|
||||
Design: `docs/008-009-design.md`.
|
||||
Resume: [`docs/009-handoff-20261008.md`](../docs/009-handoff-20261008.md)
|
||||
Closure: [`docs/009-closure-parity-20261009.md`](../docs/009-closure-parity-20261009.md)
|
||||
|
||||
## Completed / absorbed foundation
|
||||
|
||||
| Dir | Intent | Status |
|
||||
|-----|--------|--------|
|
||||
| `001-development-environment` | Host env on existing `rom-dev01` | done |
|
||||
| `002-axp-reference-capture` | GOLDEN oracle + LAB rescue notes | done (living inventory) |
|
||||
| `003-lineage-23-vanilla-build` | First vanilla LOS 23.2 on LAB | done 2026-09-14 |
|
||||
| `004-microg-phonesky-integration` | microG + Phonesky packaging | done enough; updates via `009` |
|
||||
| `005-restricted-signature-spoofing` | Restricted spoofing + bacon | done enough for LAB |
|
||||
| `008-call-rec-flag-secure` | Call-rec unlock + FLAG_SECURE DO toggles | landed via `009` pack |
|
||||
|
||||
## Parallel track (not Magisk ship bacon)
|
||||
|
||||
| Dir | Intent | Status |
|
||||
|-----|--------|--------|
|
||||
| `007-kernelsu-sunfish` | ReSukiSU + SusFS | **Parallel** — boot PASS Sept 2026; banks FAIL then; **keep** for retry on current `009` ROM (FR-016). Bridge: `docs/007-parallel-on-009.md` |
|
||||
|
||||
Do not delete `007`. Do not enable KSU inside the Magisk ship bacon. Experiment
|
||||
via separate boot (+ matched vendor) on LAB, then restore Magisk zip/slot.
|
||||
|
||||
## Roadmap (non-binding)
|
||||
|
||||
Later features are created only when prior work supplies enough information.
|
||||
Numbers may shift; this list is guidance, not stubs:
|
||||
|
||||
| # | Theme |
|
||||
|---|--------|
|
||||
| 004 | microG + GSF Proxy + patched Phonesky |
|
||||
| 005 | Restricted native signature spoofing (bacon shipped; **Location UI gap** follow-up) |
|
||||
| 006 | **Rootless** banking baseline — **deferred** (absorbed into `007` gate) |
|
||||
| 007 | ReSukiSU + SusFS — **incomplete** (banking hard-gate FAIL) |
|
||||
| 008+009 | Delivered together as `008-call-rec-flag-secure` (global DO toggles only) |
|
||||
| 010 | Remaining AXP Pro usability/privacy features (matrix spans 004–013; NeoBackup is external) |
|
||||
| 011 | Signing / AVB / OTA + banking regression on signed/relocked ROM |
|
||||
| 012 | Userspace hardening (promote from `docs/hardening-backlog.md`) |
|
||||
| 013 | Kernel hardening + EOL firmware limits documentation |
|
||||
| Theme | Where |
|
||||
|-------|--------|
|
||||
| Magisk ship + hardening + deblob | `009` (active) |
|
||||
| Upstream LOS 23.2 rebase + project OTA zip | `docs/009-upstream-rebase-ota.md` |
|
||||
| APK sideload refresh (FR-019) | `docs/009-sideload-system-updates.md` |
|
||||
| KernelSU recycle | optional later; never mix into Magisk ship boots |
|
||||
| Signing/AVB custody polish | Gate G userspace / secrets on host |
|
||||
|
||||
## New feature
|
||||
|
||||
|
||||
@@ -34,6 +34,14 @@ class NextBaconGuardsTest(unittest.TestCase):
|
||||
self.assertIn("export AXP_AVB_FLAGS=0", wrapper)
|
||||
self.assertIn("export WITH_AVB=true", wrapper)
|
||||
|
||||
def test_ship_script_applies_axp_branding(self) -> None:
|
||||
ship = SHIP.read_text()
|
||||
self.assertIn("apply_009_axp_branding.py", ship)
|
||||
self.assertLess(
|
||||
ship.index("apply_009_axp_identity.py"),
|
||||
ship.index("apply_009_axp_branding.py"),
|
||||
)
|
||||
|
||||
def test_ship_script_applies_axp_timeouts(self) -> None:
|
||||
ship = SHIP.read_text()
|
||||
self.assertIn("apply_009_a15_reboot_timeouts.py", ship)
|
||||
@@ -81,6 +89,38 @@ class NextBaconGuardsTest(unittest.TestCase):
|
||||
ship,
|
||||
)
|
||||
|
||||
def test_bundled_apps_wired_via_product_includes_and_magisk(self) -> None:
|
||||
includes = (
|
||||
ROOT
|
||||
/ "vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_product_includes.py"
|
||||
).read_text()
|
||||
magisk = (ROOT / "vendor/sunfish-a16/magisk.mk").read_text()
|
||||
ship = SHIP.read_text()
|
||||
apps = (ROOT / "vendor/sunfish-a16/apps.mk").read_text()
|
||||
self.assertIn("apply_009_product_includes.py", ship)
|
||||
self.assertIn("vendor/sunfish-a16/apps.mk", includes)
|
||||
self.assertIn("vendor/sunfish-a16/apps.mk", magisk)
|
||||
for name in ("AuroraStore", "Droidify", "FossifyGallery", "OpenEUICC"):
|
||||
self.assertIn(name, apps)
|
||||
self.assertIn("US-S4-3", ship)
|
||||
self.assertIn("system_ext/app/", ship)
|
||||
self.assertIn("must not be on product.img", ship)
|
||||
android_mk = (ROOT / "vendor/sunfish-a16/Android.mk").read_text()
|
||||
for name in ("AuroraStore", "Droidify", "FossifyGallery"):
|
||||
self.assertIn(f"LOCAL_MODULE := {name}", android_mk)
|
||||
self.assertIn("LOCAL_PREBUILT_JNI_LIBS_arm64", android_mk)
|
||||
self.assertIn("gms.mk not inherited?", ship)
|
||||
self.assertIn("libconscrypt_gmscore_jni.so", ship)
|
||||
self.assertIn("apps.mk not inherited?", ship)
|
||||
|
||||
def test_gmscore_jni_extract_before_mka(self) -> None:
|
||||
ship = SHIP.read_text()
|
||||
self.assertIn("unzip -q -j -o vendor/sunfish-a16/prebuilt/GmsCore.apk", ship)
|
||||
self.assertLess(
|
||||
ship.index("unzip -q -j -o vendor/sunfish-a16/prebuilt/GmsCore.apk"),
|
||||
ship.index("mka bacon"),
|
||||
)
|
||||
|
||||
def test_euicc_google_is_stripped_from_the_vendor_makefile(self) -> None:
|
||||
ship = SHIP.read_text()
|
||||
apply = (
|
||||
@@ -94,6 +134,141 @@ class NextBaconGuardsTest(unittest.TestCase):
|
||||
self.assertIn("EuiccSupportPixel", apply)
|
||||
self.assertNotIn("filter-out EuiccGoogle", apps)
|
||||
|
||||
def test_thermal_cdev_log_skips_unbound_devices(self) -> None:
|
||||
ship = SHIP.read_text()
|
||||
apply_path = (
|
||||
ROOT
|
||||
/ "vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_thermal_cdev_log.py"
|
||||
)
|
||||
self.assertIn("apply_009_thermal_cdev_log.py", ship)
|
||||
stock = """void ThermalThrottling::logCoolingDeviceStatus(
|
||||
const std::unordered_map<std::string, CdevInfo> &cooling_device_info_map) {
|
||||
int max_state = 0;
|
||||
std::ostringstream cdev_log;
|
||||
for (const auto &[cdev_name, cdev_info] : cooling_device_info_map) {
|
||||
if (getCdevMaxRequest(cdev_name, &max_state)) {
|
||||
ATRACE_INT((cdev_name + std::string("-state")).c_str(), max_state);
|
||||
if (!cdev_info.apply_powercap) {
|
||||
cdev_log << cdev_name << " state:" << max_state << " ";
|
||||
} else {
|
||||
const auto budget = static_cast<int>(
|
||||
std::lround(cdev_info.state2power[max_state] / cdev_info.multiplier));
|
||||
cdev_log << cdev_name << " state:" << max_state << ",budget:" << budget << " ";
|
||||
ATRACE_INT((cdev_name + std::string("-budget")).c_str(), budget);
|
||||
}
|
||||
}
|
||||
}
|
||||
LOG(INFO) << "CDEV log " << cdev_log.str();
|
||||
}
|
||||
"""
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
top = Path(tmp)
|
||||
path = top / "hardware/google/pixel/thermal/utils/thermal_throttling.cpp"
|
||||
path.parent.mkdir(parents=True)
|
||||
path.write_text(stock)
|
||||
env = {**os.environ, "ANDROID_BUILD_TOP": str(top)}
|
||||
first = subprocess.run(
|
||||
["python3", str(apply_path)],
|
||||
cwd=top,
|
||||
env=env,
|
||||
check=False,
|
||||
text=True,
|
||||
capture_output=True,
|
||||
)
|
||||
self.assertEqual(0, first.returncode, first.stderr)
|
||||
patched = path.read_text()
|
||||
self.assertIn("has no HAL throttle votes (external mitigator)", patched)
|
||||
self.assertIn("cdev_all_request_map_.count(cdev_name)", patched)
|
||||
second = subprocess.run(
|
||||
["python3", str(apply_path)],
|
||||
cwd=top,
|
||||
env=env,
|
||||
check=False,
|
||||
text=True,
|
||||
capture_output=True,
|
||||
)
|
||||
self.assertEqual(0, second.returncode, second.stderr)
|
||||
self.assertIn("already", second.stdout)
|
||||
|
||||
def test_euicc_disabler_guards_missing_packages(self) -> None:
|
||||
ship = SHIP.read_text()
|
||||
apply_path = (
|
||||
ROOT
|
||||
/ "vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_euicc_disabler_guard.py"
|
||||
)
|
||||
self.assertIn("apply_009_euicc_disabler_guard.py", ship)
|
||||
self.assertLess(
|
||||
ship.index("apply_009_drop_euicc_google.py"),
|
||||
ship.index("apply_009_euicc_disabler_guard.py"),
|
||||
)
|
||||
stock = """package org.lineageos.settings;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.util.Log;
|
||||
|
||||
class EuiccDisabler {
|
||||
private static final String TAG = "GoogleParts";
|
||||
private static final String[] EUICC_PACKAGES = new String[]{
|
||||
"com.google.android.euicc",
|
||||
"com.google.euiccpixel",
|
||||
"com.google.android.ims"
|
||||
};
|
||||
|
||||
private static boolean shouldDisable(PackageManager pm) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void enableOrDisableEuicc(Context context) {
|
||||
PackageManager pm = context.getPackageManager();
|
||||
boolean disable = shouldDisable(pm);
|
||||
int flag = disable
|
||||
? PackageManager.COMPONENT_ENABLED_STATE_DISABLED
|
||||
: PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
|
||||
for (String pkg : EUICC_PACKAGES) {
|
||||
pm.setApplicationEnabledSetting(pkg, flag, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
top = Path(tmp)
|
||||
path = (
|
||||
top
|
||||
/ "device/google/sunfish/parts/src/org/lineageos/settings/EuiccDisabler.java"
|
||||
)
|
||||
path.parent.mkdir(parents=True)
|
||||
path.write_text(stock)
|
||||
env = {**os.environ, "ANDROID_BUILD_TOP": str(top)}
|
||||
first = subprocess.run(
|
||||
["python3", str(apply_path)],
|
||||
cwd=top,
|
||||
env=env,
|
||||
check=False,
|
||||
text=True,
|
||||
capture_output=True,
|
||||
)
|
||||
self.assertEqual(0, first.returncode, first.stderr)
|
||||
patched = path.read_text()
|
||||
self.assertIn("isInstalled(pm, pkg)", patched)
|
||||
self.assertIn("Do not retarget to OpenEUICC", patched)
|
||||
self.assertNotIn(
|
||||
"for (String pkg : EUICC_PACKAGES) {\n"
|
||||
" pm.setApplicationEnabledSetting(pkg, flag, 0);",
|
||||
patched,
|
||||
)
|
||||
second = subprocess.run(
|
||||
["python3", str(apply_path)],
|
||||
cwd=top,
|
||||
env=env,
|
||||
check=False,
|
||||
text=True,
|
||||
capture_output=True,
|
||||
)
|
||||
self.assertEqual(0, second.returncode, second.stderr)
|
||||
self.assertIn("already", second.stdout)
|
||||
|
||||
def test_carrier_google_is_stripped_where_it_is_added(self) -> None:
|
||||
ship = SHIP.read_text()
|
||||
apply = (
|
||||
@@ -271,12 +446,13 @@ class NextBaconGuardsTest(unittest.TestCase):
|
||||
"cnss_diag",
|
||||
"diag_mdlog",
|
||||
"imsrcsd",
|
||||
"disable_configstore",
|
||||
"bpftool",
|
||||
"alloctop",
|
||||
"apexd-lsof.sh",
|
||||
):
|
||||
self.assertIn(name, text)
|
||||
self.assertIn("ensure_disable_configstore", text)
|
||||
self.assertIn("disable_configstore", text)
|
||||
for name in ("loc_launcher", "lowi-server", "xtra-daemon"):
|
||||
self.assertIn(f'"{name}"', text)
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
@@ -311,12 +487,15 @@ class NextBaconGuardsTest(unittest.TestCase):
|
||||
" test_diag \\\n"
|
||||
" xtra-daemon\n"
|
||||
)
|
||||
# Simulate prior bad wave4: empty Configstore stanza (HAL would ship).
|
||||
(device / "device-lineage.mk").write_text(
|
||||
"# CHRE\n"
|
||||
"PRODUCT_PACKAGES += \\\n"
|
||||
" chre_daemon_msm\n"
|
||||
"\n"
|
||||
"# Configstore\n"
|
||||
"PRODUCT_PACKAGES += \\\n"
|
||||
" disable_configstore\n"
|
||||
"\n"
|
||||
)
|
||||
(product / "base_system.mk").write_text(
|
||||
"PRODUCT_PACKAGES += \\\n"
|
||||
@@ -372,7 +551,10 @@ class NextBaconGuardsTest(unittest.TestCase):
|
||||
self.assertIn(" loc_launcher \\\n", vendor_text)
|
||||
self.assertIn(" xtra-daemon\n", vendor_text)
|
||||
self.assertIn("cnss-daemon", vendor_text)
|
||||
self.assertNotIn("disable_configstore", (device / "device-lineage.mk").read_text())
|
||||
device_text = (device / "device-lineage.mk").read_text()
|
||||
self.assertIn("disable_configstore", device_text)
|
||||
self.assertIn("chre_daemon_msm", device_text)
|
||||
self.assertIn("restored", first.stdout)
|
||||
base = (product / "base_system.mk").read_text()
|
||||
self.assertNotIn(" pbtombstone \\\n ping\n", base)
|
||||
self.assertIn("PRODUCT_HOST_PACKAGES += \\\n fastboot \\\n pbtombstone \\\n", base)
|
||||
|
||||
@@ -13,6 +13,11 @@ LOCAL_OVERRIDES_PACKAGES := com.google.android.gms
|
||||
LOCAL_SRC_FILES := prebuilt/GmsCore.apk
|
||||
LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/prebuilt/GmsCore.apk
|
||||
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
|
||||
# GmsCore ships deflated JNI with extractNativeLibs=true; system apps never get
|
||||
# them extracted, so install them as /system_ext/app/GmsCore/lib/arm64 like
|
||||
# GOLDEN (MicrogGmsCore_GH_presigned/lib/arm64). The bacon script unpacks them.
|
||||
LOCAL_PREBUILT_JNI_LIBS_arm64 := \
|
||||
$(patsubst $(LOCAL_PATH)/%,%,$(wildcard $(LOCAL_PATH)/prebuilt/GmsCore-jni/arm64/*.so))
|
||||
# microG v0.3.16+ declares required uses-library com.android.location.provider
|
||||
LOCAL_USES_LIBRARIES := com.android.location.provider
|
||||
LOCAL_OPTIONAL_USES_LIBRARIES := \
|
||||
@@ -50,12 +55,12 @@ LOCAL_OPTIONAL_USES_LIBRARIES := \
|
||||
androidx.window.sidecar
|
||||
include $(BUILD_PREBUILT)
|
||||
|
||||
# 009 bundled apps (PRESIGNED; host prebuilts via symlink) → product
|
||||
# 009 bundled apps (PRESIGNED) → system_ext (AXP PRO parity; not product).
|
||||
# Optional window libs: same manifest tags as Phonesky/GmsCore (A16 enforce check).
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := AuroraStore
|
||||
LOCAL_MODULE_CLASS := APPS
|
||||
LOCAL_PRODUCT_MODULE := true
|
||||
LOCAL_SYSTEM_EXT_MODULE := true
|
||||
LOCAL_CERTIFICATE := PRESIGNED
|
||||
LOCAL_SRC_FILES := prebuilt/AuroraStore.apk
|
||||
LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/prebuilt/AuroraStore.apk
|
||||
@@ -68,7 +73,7 @@ include $(BUILD_PREBUILT)
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := Droidify
|
||||
LOCAL_MODULE_CLASS := APPS
|
||||
LOCAL_PRODUCT_MODULE := true
|
||||
LOCAL_SYSTEM_EXT_MODULE := true
|
||||
LOCAL_CERTIFICATE := PRESIGNED
|
||||
LOCAL_SRC_FILES := prebuilt/Droidify.apk
|
||||
LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/prebuilt/Droidify.apk
|
||||
@@ -81,7 +86,7 @@ include $(BUILD_PREBUILT)
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := FossifyGallery
|
||||
LOCAL_MODULE_CLASS := APPS
|
||||
LOCAL_PRODUCT_MODULE := true
|
||||
LOCAL_SYSTEM_EXT_MODULE := true
|
||||
LOCAL_CERTIFICATE := PRESIGNED
|
||||
LOCAL_OVERRIDES_PACKAGES := Gallery Gallery2 Glimpse
|
||||
LOCAL_SRC_FILES := prebuilt/FossifyGallery.apk
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
# Bundled user apps (009) — Aurora Store, Droidify, Fossify Gallery.
|
||||
# APKs live on host at /srv/rom/prebuilts/axp-apps/ (never Git).
|
||||
# Symlink into vendor/sunfish-a16/prebuilt/ before bacon.
|
||||
# Bundled user apps (009) — Aurora + Droidify + Fossify on system_ext only.
|
||||
# APKs: /srv/rom/prebuilts/axp-apps/ → vendor/sunfish-a16/prebuilt/ (bacon symlinks).
|
||||
#
|
||||
# OpenEUICC is the privileged LPA, same as AXP GOLDEN: system_ext priv-app,
|
||||
# platform certificate, privapp whitelist. Source is not an APK prebuilt.
|
||||
# Host tree: packages/apps/OpenEUICC @ upstream 89d677e07d0e (2026-09-28).
|
||||
# Not the AXP fork tag. Datastore comes from LOS androidx.
|
||||
# prebuilts/openeuicc-deps @ 5402167 (zxing only).
|
||||
# OpenEUICC: system_ext priv-app (platform cert), not an APK prebuilt here.
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
AuroraStore \
|
||||
|
||||
@@ -11,3 +11,11 @@
|
||||
# local track marker only.
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
ro.axp.resurection.track=pro
|
||||
|
||||
# Shown in setup / some system UI (%1$s fallbacks).
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
ro.product.system.brand=AXP \
|
||||
ro.product.system.manufacturer=AXP Resurrection
|
||||
|
||||
# Sunfish bootanimation: full 1080x2340 frames (Lineage default is width/3 band).
|
||||
AXP_BOOTANIMATION_FULLSCREEN := true
|
||||
@@ -0,0 +1,16 @@
|
||||
# AXP visual branding (009)
|
||||
|
||||
Source: [AXP.OS/android_vendor_lineage](https://git.disroot.org/AXP.OS/android_vendor_lineage)
|
||||
(`upstream_a13`), bootanimation + `overlay/` tree. Applied at build time by
|
||||
`apply_009_axp_branding.py` into `vendor/lineage/bootanimation` and
|
||||
`vendor/lineage/overlay/`.
|
||||
|
||||
**Resurrection** copy: setup welcome string → “Welcome to AXP Resurrection”.
|
||||
Boot animation frames and wallpapers stay AXP artwork (no baked “LineageOS” in
|
||||
those assets). About / version strings use `AXP-Resurection-Pro` from identity.
|
||||
|
||||
Do not commit secrets. Regenerate frames:
|
||||
|
||||
`scripts/build-bootanimation-from-gifs.sh` → `bootanimation.tar` (1080×2340,
|
||||
`AXP_BOOTANIMATION_FULLSCREEN` in `branding.mk`). Sequence: loading once,
|
||||
loaded once, hold last frame until boot finishes.
|
||||
@@ -0,0 +1,71 @@
|
||||
#
|
||||
# Copyright (C) 2016 The CyanogenMod Project
|
||||
# 2017-2019 The LineageOS Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
TARGET_GENERATED_BOOTANIMATION := $(TARGET_OUT_INTERMEDIATES)/BOOTANIMATION/bootanimation.zip
|
||||
$(TARGET_GENERATED_BOOTANIMATION): INTERMEDIATES := $(call intermediates-dir-for,BOOTANIMATION,bootanimation)
|
||||
$(TARGET_GENERATED_BOOTANIMATION): $(SOONG_ZIP)
|
||||
@echo "Building bootanimation.zip"
|
||||
@rm -rf $(dir $@)
|
||||
@mkdir -p $(INTERMEDIATES)
|
||||
$(hide) tar xfp vendor/lineage/bootanimation/bootanimation.tar -C $(INTERMEDIATES)
|
||||
$(hide) if [ $(TARGET_SCREEN_HEIGHT) -lt $(TARGET_SCREEN_WIDTH) ]; then \
|
||||
IMAGEWIDTH=$(TARGET_SCREEN_HEIGHT); \
|
||||
else \
|
||||
IMAGEWIDTH=$(TARGET_SCREEN_WIDTH); \
|
||||
fi; \
|
||||
IMAGESCALEWIDTH=$$IMAGEWIDTH; \
|
||||
if [ "$(AXP_BOOTANIMATION_FULLSCREEN)" = "true" ]; then \
|
||||
IMAGESCALEHEIGHT=$(TARGET_SCREEN_HEIGHT); \
|
||||
IMAGEHEIGHT=$(TARGET_SCREEN_HEIGHT); \
|
||||
else \
|
||||
IMAGESCALEHEIGHT=$$(expr $$IMAGESCALEWIDTH / 3); \
|
||||
IMAGEHEIGHT=$$(expr $$IMAGEWIDTH / 3); \
|
||||
fi; \
|
||||
if [ "$(TARGET_BOOTANIMATION_HALF_RES)" = "true" ]; then \
|
||||
IMAGEWIDTH="$$(expr "$$IMAGEWIDTH" / 2)"; \
|
||||
fi; \
|
||||
RESOLUTION="$$IMAGEWIDTH"x"$$IMAGEHEIGHT"; \
|
||||
for part_cnt in 0 1 2 3 4; do \
|
||||
mkdir -p $(INTERMEDIATES)/part$$part_cnt; \
|
||||
done; \
|
||||
prebuilts/tools-lineage/${HOST_OS}-x86/bin/mogrify -resize $$RESOLUTION -colors 250 $(INTERMEDIATES)/*/*.png; \
|
||||
echo "$$IMAGESCALEWIDTH $$IMAGESCALEHEIGHT 60" > $(INTERMEDIATES)/desc.txt; \
|
||||
cat vendor/lineage/bootanimation/desc.txt >> $(INTERMEDIATES)/desc.txt
|
||||
$(hide) $(SOONG_ZIP) -L 0 -o $@ -C $(INTERMEDIATES) -D $(INTERMEDIATES)
|
||||
|
||||
ifeq ($(TARGET_BOOTANIMATION),)
|
||||
TARGET_BOOTANIMATION := $(TARGET_GENERATED_BOOTANIMATION)
|
||||
endif
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := bootanimation.zip
|
||||
LOCAL_MODULE_CLASS := ETC
|
||||
LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT)/media
|
||||
|
||||
include $(BUILD_SYSTEM)/base_rules.mk
|
||||
|
||||
$(LOCAL_BUILT_MODULE): $(TARGET_BOOTANIMATION)
|
||||
@cp $(TARGET_BOOTANIMATION) $@
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
BOOTANIMATION_SYMLINK := $(TARGET_OUT_PRODUCT)/media/bootanimation-dark.zip
|
||||
$(BOOTANIMATION_SYMLINK): $(LOCAL_INSTALLED_MODULE)
|
||||
@mkdir -p $(dir $@)
|
||||
$(hide) ln -sf bootanimation.zip $@
|
||||
|
||||
ALL_DEFAULT_INSTALLED_MODULES += $(BOOTANIMATION_SYMLINK)
|
||||
@@ -0,0 +1,17 @@
|
||||
#
|
||||
# Copyright (C) 2017 The LineageOS Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/BOOTANIMATION)
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |