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 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
.debugsuffix so they install beside a release build. - Release builds:
armeabi-v7aonly. Debug builds also only packagearmeabi-v7atoday; 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).