Headline numbers from a fresh `./gradlew assemble`:
- :commons material_symbols_outlined.ttf 11M -> 409K (subset to the 210
codepoints actually referenced from MaterialSymbols.kt)
- :amethyst per-ABI APKs no longer built in CI (-PdisableAbiSplits=true);
~600M of stripped_native_libs intermediates skipped per run
Changes:
- .git-hooks/pre-push runs only :amethyst:testPlayDebugUnitTest plus jvmTest
on the KMP modules instead of `./gradlew test`, which was compiling all six
amethyst variants (play/fdroid x debug/release/benchmark)
- amethyst/build.gradle adds three opt-in fast-build flags:
-PdisableAbiSplits=true skip per-ABI APK splits
-PdisableUniversalApk=true skip the universal APK output
-Pamethyst.skipMapping=true disable R8 (release+benchmark)
Defaults are unchanged; release pipelines must not set skipMapping.
- .github/workflows/build.yml uses gradle/actions/setup-gradle@v4 with
cache-read-only on PRs / cache-write on main, drops --no-daemon, collapses
the Android job to a single Gradle invocation (lint + focused debug unit
tests + assembleBenchmark with -PdisableAbiSplits=true), and globs both
APK naming patterns for the upload step.
- tools/material-symbols-subset/{subset.sh,README.md} regenerates the font
from upstream + MaterialSymbols.kt; run after adding/removing icons.
Verified: ./gradlew :amethyst:help with all three new -P flags parses cleanly,
and ./gradlew :commons:jvmJar --rerun-tasks succeeds with the subsetted font
(commons-jvm jar shrinks from ~13M to 2.9M).
https://claude.ai/code/session_01YSmkagXXN5AwGcY4upiUh1
1.6 KiB
Material Symbols Subset
The font shipped at
commons/src/commonMain/composeResources/font/material_symbols_outlined.ttf
is a subset of Google's Material Symbols
Outlined variable font,
trimmed to only the codepoints referenced from
commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/icons/symbols/MaterialSymbols.kt.
| Full upstream | Subset | |
|---|---|---|
| Size | ~11 MB | ~410 KB |
| Glyphs | ~3500 | ~210 |
The subset cuts >10 MB out of every commons build artifact, every Android APK, and every Desktop app bundle.
When to regenerate
Run subset.sh whenever you:
- add or remove a
MaterialSymbol("\uXXXX")entry inMaterialSymbols.kt - pin a newer upstream font version
Prerequisites
pip install fonttools brotli
Regenerating
From the repo root:
./tools/material-symbols-subset/subset.sh
That downloads the upstream variable font, intersects its codepoints with the
ones referenced from MaterialSymbols.kt, and overwrites the checked-in
material_symbols_outlined.ttf.
If you already have an upstream .ttf on disk:
./tools/material-symbols-subset/subset.sh /path/to/MaterialSymbolsOutlined-Regular.ttf
Commit the regenerated .ttf alongside the MaterialSymbols.kt change.
How it works
pyftsubset (from fonttools) reads the codepoints we care about, drops every
glyph and OpenType feature not reachable from those codepoints, and rewrites
name, cmap, and GSUB tables accordingly. The Compose resource pipeline
treats the result as a normal TTF — no code changes needed.