gioser

tawasuyu/llimphi

Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.

Rust 614Markdown 274TOML 149RON 310606 Sutichaykuna

⎇ c1b11b2c01d7623a4f346519b9d1ec435be30b95 android/LEEME.md Markdown · 108 siq'ikuna · 3.8 KB Ñawpa willay ch'uya

feat: llimphi standalone — framework UI soberano extraído del monorepo e65e9cc62 · Sergio ·

1# Llimphi · Android
2
3Port nativo de Llimphi a Android. Una `NativeActivity` en C que
4delega al `android_main` que `android-activity` exporta desde la
5`.so` Rust, idéntico patrón que un binario `main()` en desktop.
6
7## Estado
8
9| crate | estado |
10|---|---|
11| `clear-screen-android` | ✓ APK firmado v2, instalable en Android 7+ |
12| resto de apps Llimphi | pendientes — el patrón es reusar `android_main` |
13
14## Tesis
15
16El motor Llimphi (HAL + raster + layout + text + ui) **no se toca**.
17Lo único nuevo por target Android es:
18
191. Entry-point `#[no_mangle] android_main(app: AndroidApp)` en vez de
20   `fn main()`.
212. Construir el `EventLoop` con `with_android_app(app)` para que
22   `winit` reciba `Resumed` / `Suspended` / `InputAvailable` desde el
23   Looper de Android.
243. Recrear la `Surface` en cada `Resumed`: Android invalida la
25   NativeWindow al pasar a background. El `App::state: Option<State>`
26   ya está estructurado para eso.
27
28Las apps existentes que viven sobre Llimphi compilan sin cambios — lo
29que se reescribe es el **lifecycle wrapper**, no la lógica de render
30ni los widgets.
31
32## Cómo construir
33
34Una sola pasada — el script wrapper:
35
36```sh
37./scripts/build-android.sh clear-screen-android
38```
39
40Resultado: `target/x/release/android/clear-screen-android.apk`
41firmado con APK Signature Scheme v2, listo para
42`adb install -r <apk>`.
43
44## Setup inicial (una vez por máquina)
45
46```sh
47# Targets Rust
48rustup target add aarch64-linux-android x86_64-linux-android
49
50# Wrapper de build de Rust mobile (binario `x`)
51cargo install xbuild
52
53# NDK r27c (~640 MB descomprimido, ~1.5 GB)
54curl -L -o /tmp/ndk.zip \
55  https://dl.google.com/android/repository/android-ndk-r27c-linux.zip
56unzip /tmp/ndk.zip -d $HOME/
57export ANDROID_NDK_HOME=$HOME/android-ndk-r27c
58
59# SDK (sólo build-tools + platform-tools, no se necesita la plataforma
60# completa porque el APK se genera con aapt2 + apksigner del SDK).
61# En Artix viene del paquete `android-sdk-build-tools`.
62```
63
64El script `build-android.sh` genera automáticamente un PEM RSA2048
65self-signed en `~/.local/share/llimphi-android/debug.pem` la primera
66vez que corre. Para firma de release usar un PEM propio y exportarlo
67en `LLIMPHI_PEM`.
68
69## Estructura del APK generado
70
71```
72clear-screen-android.apk
73├── AndroidManifest.xml          ← xbuild genera; NativeActivity
74└── lib/arm64-v8a/
75    └── libclear_screen_android.so  ← 7.5 MB sin strip, ~2 MB stripped
76```
77
78Sin assets, sin recursos, sin Java/Kotlin. Todo el "código" de la app
79es la `.so` Rust. El bootstrap Java de NativeActivity lo provee el
80framework Android.
81
82## Apps por portar (orden de menor a mayor fricción)
83
84Las apps que **menos** se modifican al portar son las que ya tienen
85poca interacción con teclado/mouse y mucho rendering:
86
871. **mirada-image-viewer-llimphi** — visor de imágenes, gestos = ok
882. **nahual-text-viewer-llimphi** — sólo scroll + zoom
893. **nahual-image-viewer-llimphi** — idem
904. **pluma-md-reader** — visor markdown, mismo patrón que la web
915. **chasqui-explorer-llimphi** — listas y tarjetas, taps obvios
926. **shuma-shell-llimphi** — teclado virtual, ya casi no usa shortcuts
937. **mirada-app-llimphi** — el compositor; touch desktop = problema UX
94
95Las apps con paleta de comandos (nada, pluma-app full) son las
96**últimas** porque su UX core (Ctrl+Shift+P, multi-pane splitter,
97file picker) necesita ser repensada para touch.
98
99## Próximos hitos
100
101- **Tier 1.5**: hello-world con vello rasterizando un texto + figura
102  (smoke test del stack raster completo en Android).
103- **Tier 2**: portar `mirada-image-viewer-llimphi` — primer APK
104  funcional con UI real.
105- **Tier 3**: input handling proper (touch events, soft keyboard,
106  back button), theming responsivo (dpi/density).
107- **Tier 4**: distribución (Play Store internal track, F-Droid build
108  reproducible).

LEEME.md

Llimphi · Android

Port nativo de Llimphi a Android. Una NativeActivity en C que delega al android_main que android-activity exporta desde la .so Rust, idéntico patrón que un binario main() en desktop.

Estado

crateestado
clear-screen-android✓ APK firmado v2, instalable en Android 7+
resto de apps Llimphipendientes — el patrón es reusar android_main

Tesis

El motor Llimphi (HAL + raster + layout + text + ui) no se toca. Lo único nuevo por target Android es:

  1. Entry-point #[no_mangle] android_main(app: AndroidApp) en vez de fn main().
  2. Construir el EventLoop con with_android_app(app) para que winit reciba Resumed / Suspended / InputAvailable desde el Looper de Android.
  3. Recrear la Surface en cada Resumed: Android invalida la NativeWindow al pasar a background. El App::state: Option<State> ya está estructurado para eso.

Las apps existentes que viven sobre Llimphi compilan sin cambios — lo que se reescribe es el lifecycle wrapper, no la lógica de render ni los widgets.

Cómo construir

Una sola pasada — el script wrapper:

./scripts/build-android.sh clear-screen-android

Resultado: target/x/release/android/clear-screen-android.apk firmado con APK Signature Scheme v2, listo para adb install -r <apk>.

Setup inicial (una vez por máquina)

# Targets Rust
rustup target add aarch64-linux-android x86_64-linux-android

# Wrapper de build de Rust mobile (binario `x`)
cargo install xbuild

# NDK r27c (~640 MB descomprimido, ~1.5 GB)
curl -L -o /tmp/ndk.zip \
  https://dl.google.com/android/repository/android-ndk-r27c-linux.zip
unzip /tmp/ndk.zip -d $HOME/
export ANDROID_NDK_HOME=$HOME/android-ndk-r27c

# SDK (sólo build-tools + platform-tools, no se necesita la plataforma
# completa porque el APK se genera con aapt2 + apksigner del SDK).
# En Artix viene del paquete `android-sdk-build-tools`.

El script build-android.sh genera automáticamente un PEM RSA2048 self-signed en ~/.local/share/llimphi-android/debug.pem la primera vez que corre. Para firma de release usar un PEM propio y exportarlo en LLIMPHI_PEM.

Estructura del APK generado

clear-screen-android.apk
├── AndroidManifest.xml          ← xbuild genera; NativeActivity
└── lib/arm64-v8a/
    └── libclear_screen_android.so  ← 7.5 MB sin strip, ~2 MB stripped

Sin assets, sin recursos, sin Java/Kotlin. Todo el "código" de la app es la .so Rust. El bootstrap Java de NativeActivity lo provee el framework Android.

Apps por portar (orden de menor a mayor fricción)

Las apps que menos se modifican al portar son las que ya tienen poca interacción con teclado/mouse y mucho rendering:

  1. mirada-image-viewer-llimphi — visor de imágenes, gestos = ok
  2. nahual-text-viewer-llimphi — sólo scroll + zoom
  3. nahual-image-viewer-llimphi — idem
  4. pluma-md-reader — visor markdown, mismo patrón que la web
  5. chasqui-explorer-llimphi — listas y tarjetas, taps obvios
  6. shuma-shell-llimphi — teclado virtual, ya casi no usa shortcuts
  7. mirada-app-llimphi — el compositor; touch desktop = problema UX

Las apps con paleta de comandos (nada, pluma-app full) son las últimas porque su UX core (Ctrl+Shift+P, multi-pane splitter, file picker) necesita ser repensada para touch.

Próximos hitos