EARHORNMUSIC UPnP · Android TV · Phones · Android Auto · GNU/Linux
Release 0.5.0

keep.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
Resource shrinker keep-list.

Manifest-only references that the shrinker can't see:
- Fonts (fraunces, inter): loaded dynamically via Resources.getIdentifier
  rather than as compile-time R.font.* references. Without this keep,
  release builds with isShrinkResources = true strip the fonts and every
  string in the app falls back to system Serif / SansSerif.
- TV launcher banner (tv_banner): referenced only from AndroidManifest.xml's
  android:banner attribute, which the shrinker analyzes separately from
  resource references in code. Symptom when stripped: Android TV launchers
  render the wrong drawable in the banner slot — typically ic_launcher
  (the round phone-launcher badge) cropped to 16:9, because shrinker rewrites
  the manifest banner reference to a surviving resource ID.
- Launcher icons (ic_launcher, ic_launcher_round): also only referenced from
  manifest attributes (android:icon, android:roundIcon, android:logo). Kept
  defensively for the same reason.
- Notification icon (ic_notification): referenced from PlaybackService via
  R.drawable.ic_notification, so the shrinker DOES see it — but kept here
  alongside the others to make the brand-asset surface explicit.
- Bronze clef large-icon fallback (empty_clef): referenced from
  BrowseScreen Kotlin code. Kotlin references are visible to the shrinker,
  but kept here for the same explicit-surface reason.
- Earhorn badge (earhorn_badge): the canonical brand mark, referenced by
  several painterResource calls in Compose UI AND by LocalRenderer's
  defaultArtworkUri which builds an android.resource:// URI from the
  resource ID at runtime. The string-formatted URI is opaque to the
  shrinker; without this keep, release builds could strip the resource
  even though painterResource sites still reference it (defense in depth).

tools:keep forces the shrinker to retain these entries even though no code
references them statically (or, in some cases, even when code DOES reference
them — defense in depth for brand assets).
-->
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@font/fraunces,@font/inter,@drawable/tv_banner,@mipmap/ic_launcher,@mipmap/ic_launcher_round,@drawable/ic_notification,@drawable/empty_clef,@drawable/earhorn_badge" />