# Build environment Recorded at project bootstrap. These choices are part of the implementation contract after bootstrap; they are not silently upgraded during implementation (see `gradle/libs.versions.toml` for the pinned versions). | Item | Value | | --- | --- | | JDK | Temurin 17.0.16+8 (via mise; `scripts/setup-android-sdk.sh` / `scripts/setup-gradle.sh` bootstrap the toolchain) | | Gradle | 8.10.2 (wrapper `./gradlew`) | | Android Gradle Plugin | 8.6.1 | | Kotlin | 2.0.21 (KSP 2.0.21-1.0.28, compose plugin) | | Compose | BOM 2026.01.00 → Compose UI 1.10.1 | | Compose for TV | tv-material 1.1.0 | | AndroidX | lifecycle 2.9.4, core-ktx 1.16.0, activity-compose 1.9.2 | | Room | 2.6.1 (KSP codegen) | | DataStore | 1.1.1 | | Media3 | 1.4.1 | | Ktor (server, CIO) | 2.3.12 | | OkHttp | 4.12.0 | | Hilt | 2.52 | | kotlinx.serialization | 1.7.3 | | kotlinx.coroutines | 1.9.0 | | BouncyCastle | 1.78.1 (Argon2id for backup encryption) | | libtorrent4j | 2.1.0-31 (`libtorrent4j-android-arm` ships `lib/armeabi-v7a/libtorrent4j.so`) | | Android SDK | platform 35, build-tools 34.0.0, platform-tools | | compileSdk | 35 | | targetSdk | 34 (the Streamer runs Android 14 for TV = API 34) | | minSdk | 23 (TV Compose needs 21+; 23 keeps leanback-era devices possible) | ## Device build measured; remaining M0 acceptance pending The [2026-10-02 read-only capture](device/2026-10-02/README.md) measured Android 14 / SDK 34 on build `UTTK.260317.003`, with app ABIs `armeabi-v7a,armeabi` and no advertised 64-bit app ABI. This confirms the existing targetSdk 34 and ARMv7 native-packaging assumptions; no version pins were changed. CompileSdk 35 remains the dependency-driven choice above. M0 is still incomplete: DRM playback and reboot/reconnect acceptance were not performed. ## Application identity - Application ID: **`dev.hzz.streamer`** (chosen once at bootstrap). - Debug builds add the `.debug` suffix so they install beside a release build. - Release builds: `armeabi-v7a` only. Debug builds also only package `armeabi-v7a` today; when an Android TV emulator is used for UI tests, add emulator ABIs and keep native engines stubbed/guarded on load (engines detect a missing native library and report unavailable instead of crashing). ## Signing Release signing is configured from an uncommitted `keystore.properties` (`storeFile`, `storePassword`, `keyAlias`, `keyPassword`). When absent, release builds fall back to the debug key so `adb install -r` works during development. Real releases must be signed with the held key (see CI notes in `docs/decisions.md`).