The generated scaffold was a Views-based Material 2 shell with no activity,
no Kotlin sources, and a placeholder package. Replace it with the real base
the conversion work builds on.
Build configuration, with three AGP 9 specifics that contradict most
tutorials still in circulation:
- AGP 9 has built-in Kotlin. Applying org.jetbrains.kotlin.android now fails
the build, so the absence of that plugin is deliberate, not an oversight.
- The Compose compiler plugin is still separate and must be applied, pinned
to 2.2.10 to match the kotlin-gradle-plugin AGP 9.3.1 brings transitively.
Pinning it to the newest Kotlin release instead would mismatch.
- android.kotlinOptions {} was removed; jvm configuration moves to a
top-level kotlin { compilerOptions {} }.
Java compatibility goes 11 -> 17 (AGP 9 requires JDK 17), abiFilters
restrict packaging to arm64-v8a and x86_64, and jniLibs packaging is set
uncompressed so the APK zip-aligns native libraries on 16 KB boundaries.
Every dependency version in the catalog was checked to resolve against
Google Maven rather than copied from documentation. Note that KSP has moved
to standalone versioning (2.3.11) and no longer uses the old
<kotlin>-<ksp> scheme; it is catalogued but left unapplied until Room lands.
Set applicationId to dev.jasonmross.mediaconverter. com.example.* is
rejected by the Play Console, and the application ID is permanent once
published, so it has to be right before the first upload. The display name
is just a string resource and stays changeable.
Document the split license posture: source is MIT, but the distributed
binary will be GPL-3.0 because it bundles FFmpeg built with x264/x265.
LICENSES/README.md records why, including that libass is ISC rather than
GPL, so subtitle burn-in is not what forces the GPL choice.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
63 lines
2.5 KiB
Markdown
63 lines
2.5 KiB
Markdown
# Licensing
|
|
|
|
This project has a **split license**, and the distinction matters.
|
|
|
|
## Source code — MIT
|
|
|
|
Everything in this repository that we wrote is MIT licensed. See [`../LICENSE`](../LICENSE).
|
|
|
|
## Distributed binary (APK / AAB) — GPL-3.0
|
|
|
|
The shipped application binary is **GPL-3.0**, not MIT.
|
|
|
|
The app bundles FFmpeg built with `--enable-gpl`, which pulls in **x264** and **x265**
|
|
(both GPL-2.0-or-later). Combining those with the application makes the *distributed
|
|
binary* a GPL work. MIT → GPL is a compatible direction, so our own source stays MIT;
|
|
the combined binary you install is GPL-3.0.
|
|
|
|
### Why GPL rather than LGPL
|
|
|
|
Building without `--enable-gpl` would keep the binary LGPL, and most features survive
|
|
that: hardware H.264/HEVC encode via MediaCodec, MP3 via libmp3lame, AV1, VP9, Opus,
|
|
FLAC, and even subtitle burn-in (libass is ISC licensed, not GPL — a common
|
|
misconception).
|
|
|
|
What GPL specifically buys is **x264/x265 software encode**, which is the only way to
|
|
get CRF and 2-pass rate control. Those are the tools that actually deliver
|
|
quality-per-bitrate for "compress this video well", and no hardware encoder on Android
|
|
exposes either. That capability was judged worth the license.
|
|
|
|
### Corresponding source
|
|
|
|
GPL-3.0 requires that complete corresponding source accompany the binary. For each
|
|
release we publish, alongside the APK:
|
|
|
|
- the exact FFmpeg source tarball or commit used,
|
|
- the full `configure` line, and
|
|
- any patches applied.
|
|
|
|
FFmpeg's own guidance says to host the source "on the same webserver" as the binary.
|
|
That is not literally possible for a Google Play listing, so the source is attached to
|
|
the corresponding **GitHub Release next to the APK**, and linked from both the Play
|
|
listing and the in-app About screen.
|
|
|
|
## Third-party components
|
|
|
|
| Component | License | Notes |
|
|
|---|---|---|
|
|
| AndroidX / Jetpack Compose | Apache-2.0 | |
|
|
| AndroidX Media3 (Transformer, Effect) | Apache-2.0 | primary hardware conversion path |
|
|
| FFmpeg | LGPL-2.1+, **GPL-2.0+ as built here** | `--enable-gpl` |
|
|
| x264 | GPL-2.0+ | the reason the binary is GPL |
|
|
| x265 | GPL-2.0+ | |
|
|
| libass | **ISC** | subtitle burn-in; not GPL |
|
|
| libmp3lame | LGPL | MP3 encode |
|
|
| libvpx, dav1d, SVT-AV1, libopus | BSD-style | |
|
|
|
|
### Explicitly excluded
|
|
|
|
- **`--enable-nonfree`** is never used. FFmpeg states it makes the resulting binary
|
|
*unredistributable*. This rules out `libfdk_aac` and `decklink`.
|
|
- **OpenH264** is not used. Its BSD-2 source license is *not* a patent grant — Cisco's
|
|
royalty payment covers only Cisco's own precompiled binary module.
|