merge: keep Dart-named drawables from the resource shrinker
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
package es.freetimelab.pluriwave
|
||||
|
||||
/**
|
||||
* Anchors the drawables that only Dart names, so the Android build cannot
|
||||
* decide they are unused.
|
||||
*
|
||||
* These icons are handed to `audio_service` as plain strings
|
||||
* (`MediaControl.custom(androidIcon: 'drawable/ic_auto_eq_on')`) and resolved
|
||||
* at runtime through `getResources().getIdentifier(...)`. Nothing on the
|
||||
* Android side of the build ever mentions them, so as far as the resource
|
||||
* pipeline is concerned they are dead weight — and they were dropped from
|
||||
* every release APK.
|
||||
*
|
||||
* The damage was not a missing icon. `getResourceId` returns 0 for a name it
|
||||
* cannot find, `PlaybackStateCompat.CustomAction.Builder` throws on a 0 icon,
|
||||
* and that throw aborts `AudioService.setState` before the media session is
|
||||
* ever activated. Android Auto was left holding a frozen, inactive session:
|
||||
* dead playback screen, a play button that never became pause, the app losing
|
||||
* its pane to whichever app did have a live session, and audio that played
|
||||
* "as if it were not the app". One absent file, four symptoms, from 31 July
|
||||
* (commit 2540556) until this.
|
||||
*
|
||||
* Verified rather than assumed. Pulling the installed APK off the device and
|
||||
* reading its resource table showed `ic_stat_pluriwave` present and both
|
||||
* equalizer icons absent — and `ic_stat_pluriwave` is the one drawable of the
|
||||
* three that Kotlin references directly (`R.drawable.ic_stat_pluriwave`, four
|
||||
* call sites across the alarm notifications). That contrast is the whole
|
||||
* diagnosis: a real `R.drawable` reference survives, a name that exists only
|
||||
* inside a Dart string does not.
|
||||
*
|
||||
* So this object is not defensive tidiness — it is the reference that was
|
||||
* missing. Any future drawable that Dart resolves by name must be added here
|
||||
* AND to the resource guard in `.gitea/workflows/build.yml`, which reads the
|
||||
* built APK's resource table and fails the build if one of them is gone.
|
||||
*/
|
||||
@Suppress("unused")
|
||||
internal object RecursosResueltosPorNombre {
|
||||
val anclados: IntArray =
|
||||
intArrayOf(
|
||||
R.drawable.ic_auto_eq_on,
|
||||
R.drawable.ic_auto_eq_off,
|
||||
R.drawable.ic_stat_pluriwave,
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Protects the drawables that only Dart names from the resource shrinker.
|
||||
|
||||
Flutter's own Gradle plugin turns shrinking on for every release build
|
||||
(FlutterPlugin.kt: `releaseBuildType.isMinifyEnabled = true` and
|
||||
`isShrinkResources = true`), regardless of what app/build.gradle.kts says.
|
||||
The shrinker keeps what it can see referenced — and it cannot see
|
||||
`MediaControl.custom(androidIcon: 'drawable/ic_auto_eq_on')`, because that
|
||||
is a string inside Dart, resolved at runtime via
|
||||
`getResources().getIdentifier(...)`. So it removed both equalizer icons
|
||||
from every release APK.
|
||||
|
||||
The consequence was not a blank button. `getResourceId` returns 0 for a
|
||||
name it cannot resolve, `PlaybackStateCompat.CustomAction.Builder` throws
|
||||
on a 0 icon, and that throw aborts `AudioService.setState` before the media
|
||||
session is activated — leaving Android Auto with a frozen, inactive
|
||||
session. Dead playback screen, play that never became pause, the app losing
|
||||
its pane to any app with a live session, and audio playing "as if it were
|
||||
not the app". One shrunk file, four symptoms, from 31 July (commit 2540556).
|
||||
|
||||
Proven, not assumed: the installed APK was pulled off the device and its
|
||||
resource table read. `ic_stat_pluriwave` was present, both equalizer icons
|
||||
were not — and `ic_stat_pluriwave` is the only one of the three that Kotlin
|
||||
references as a real `R.drawable`, from the alarm notifications. A genuine
|
||||
reference survives shrinking; a name living in a Dart string does not.
|
||||
|
||||
ANY new drawable that Dart resolves by name must be listed here, and in the
|
||||
resource guard in .gitea/workflows/build.yml, which reads the built APK's
|
||||
resource table and fails the build if one of them went missing.
|
||||
-->
|
||||
<resources xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:keep="@drawable/ic_auto_eq_on,@drawable/ic_auto_eq_off,@drawable/ic_stat_pluriwave,@drawable/station_art_*" />
|
||||
Reference in New Issue
Block a user