# Android port `Android.mk` builds `libsetprotocol.so` from the same C99 sources used by MCU and desktop builds. `setprotocol_jni.c` contains only JNI marshalling; protocol rules remain in the core. Add the Kotlin directory as an Android source directory and include this `Android.mk` from the application NDK build. The JNI streaming parser returns fixed 15-byte records `SEQ | FLAGS | CAN_ID_LE | DLC | DATA[8]`. Dynamic allocation is confined to the Android adapter for protocol operations; the portable protocol core remains allocation free. `nativeSpectrum` calls the shared host DSP module `set_spectrum.c` (bounded heap workspace, up to 2×16384 doubles). `trends/SpectrumAnalyzer` maps timestamps and errors but does not duplicate FFT/filter math. Run it off the UI thread. `trends/PlotViewport` is a toolkit-free normalized zoom/pan model. `legacycan/LegacyCanTerminal.kt` contains the two historical CAN_terminal wire formats, the complete Projects.ini node/command catalog, and shared codecs for register writes and command frames. Android UI code must use this module instead of reproducing the Delphi byte rotation or CAN-ID routing rules. `kotlin/ru/setcorp/setprotocol/update/FirmwareCatalog.kt` is a UI-independent firmware release client. It reads the optional `firmware.releases` array from the shared `update.json`, accepts only HTTPS assets, limits their size and returns image bytes only after SHA-256 verification. Applications provide their own UI and pass optional HTTP Basic credentials.