26.10.06 14:18
Technology Stack
| Technical specification | Architecture | Requirements | Build and verification |
This reference describes the checked-in build configuration, not a guarantee that every variant has a published download. For installable packages, use the product download section or GitHub Releases.
Version sources of truth
- Gradle version catalog owns the catalogued dependency versions and plugin aliases.
- Root build configuration owns the explicitly declared build plugins.
- Gradle wrapper selects the Gradle distribution.
- Phone configuration, Wear configuration and Watch-face configuration define packaging, SDK levels and variant-specific dependencies.
The pins below are maintained by scripts/quality/generate-toolchain-pins.ps1; they are not a second manually maintained version table.
- compileSdk: 37
- targetSdk: 36
- minSdk (standard): 26
- minSdk (legacy): 23
- Kotlin: 2.2.10
- Room: 2.7.0
- Media3 (ExoPlayer): 1.11.0
- Glide: 5.0.9
Build system
| Component | Declared version or setting |
|---|---|
| Gradle wrapper | 9.4.1 |
| Android Gradle Plugin | 9.2.1 |
| Kotlin and Compose compiler plugin | 2.2.10 |
| KSP | 2.3.8 |
| Hilt plugin | 2.59 |
| Chaquopy plugin | 17.0.0 |
| Java bytecode target for phone and Wear | 17 |
| Java used by Android CI | 21 |
Java used to run Gradle and Java bytecode emitted for the app are different settings. Dependency processing uses KSP; a plugin declaration at the root alone does not mean a module applies it.
Modules and packaging
| Module | Purpose | UI or implementation |
|---|---|---|
app_v2 |
Android phone, tablet, TV, automotive and headset variants | XML layouts and ViewBinding; some existing Compose surfaces |
wear |
Wear OS application and phone integration | Jetpack Compose |
watchface |
Separate Watch Face Format v4 package | Resource-only XML; no Kotlin or Java runtime code |
lint-rules |
Project-specific Android lint checks | Build-time tooling |
benchmark |
Benchmark and baseline-profile tooling | Test tooling, not the normal user application |
The wear namespace is com.sza.fastmediasorter.wear, but its application ID is com.sza.fastmediasorter, matching the phone application. Phone/watch Data Layer pairing also depends on matching signing identity. The watch face has its own application ID, com.sza.fastmediasorter.watchface.
The included Gradle modules are defined in settings.gradle.kts. A repository directory does not automatically become a Gradle module.
Platform baseline
compileSdk:37for both modules (app_v2andwear); the separate watch face compiles against SDK 36.targetSdk:36for both modules’ default configurations; the phonevrflavor overrides targetSdk to 34 and minSdk to 29.- Other edition-specific installation floors are listed in the technical requirements.
Variant matrix
The phone build declares standard, noLegal, lite, photos, legacy, vr, xr and foss. Wear declares standard and noLegal. Phone build types are debug, staging and release; Wear uses debug and release.
For the authoritative capability-by-edition grid, read the generated flavor matrix. It is derived from the phone build’s capability flags. Do not infer support merely from a dependency being present, and do not infer public availability from a variant being declared.
Dependency highlights
- Hilt provides dependency injection; Room provides persistence; WorkManager provides background scheduling.
- Media3 provides media playback and the optional streaming protocol modules. Casting uses the edition-specific Cast SDK path and a local
nanohttpd:2.3.1proxy. - Glide is used for phone-side image loading; Coil is used in Wear Compose surfaces.
- SMBJ, JSch and Apache Commons Net provide SMB, SFTP and FTP integrations respectively.
org.bouncycastle:bcprov-jdk18on:1.75is also explicitly declared in the phone module for the encrypted-container implementation, including editions without network access. The build asserts the resolved crypto version rather than silently forcing it. - Google Drive, Dropbox and OneDrive integrations have separate authentication and provider requirements.
- Compose BOM is declared as
2024.12.01; Wear Compose libraries are declared as1.4.1in the version catalog. These are separate version families, not the Kotlin compiler version. - Chaquopy, Python download integrations and OpenXR dependencies are variant-specific. Presence in
maindoes not imply inclusion in the standard Play package.
The version catalog and module dependency blocks are the current inventory. Gradle resolves transitive dependencies; the dependency-scan workflow publishes SBOM artifacts and submits the dependency graph.
Storage and network constraints
Local storage, Android document-tree access, SMB, SFTP, FTP and cloud storage do not have identical permissions or mutation guarantees. Remote folder transfers can leave completed entries after cancellation; they are not a transactional whole-folder move. Cloud availability and service limits are controlled by the provider.
Internet streams may use progressive HTTP/ICY, HLS, DASH or RTSP when the edition includes the required playback stack. Cleartext HTTP streams are supported by the application, but are not encrypted transport. Playback still depends on the source, codec and device.
Build outputs
Phone APKs use app_v2/build/outputs/apk/<flavor>/<buildType>/; Wear APKs use wear/build/outputs/apk/<flavor>/<buildType>/. App bundles are under each module’s build/outputs/bundle/ directory. The watch face is packaged separately from Wear application logic.
APK size varies by edition, ABI, build type and release processing. Historical local debug sizes, source-line counts and effort estimates are not current installation requirements.