# jUPnP uses reflection heavily for UPnP actions / arguments / DIDL-Lite. -keep class org.jupnp.** { *; } -dontwarn org.jupnp.** # Jetty 9.4 (jUPnP's transport) touches servlet + NIO classes reflectively. -keep class org.eclipse.jetty.** { *; } -dontwarn org.eclipse.jetty.** -dontwarn javax.servlet.** -dontwarn javax.naming.** -dontwarn org.slf4j.** # SLF4J 2.x discovers its logging provider via java.util.ServiceLoader # (META-INF/services/org.slf4j.spi.SLF4JServiceProvider). R8 doesn't trace # ServiceLoader references and will prune the JDK14 provider classes as # "unused", leaving SLF4J unable to find a binding at runtime — symptom # is "No SLF4J providers were found. Defaulting to no-operation (NOP) # logger implementation" in logcat. Without a working SLF4J binding, # jUPnP's discovery / SSDP / control-point logs all go to /dev/null, # which makes UPnP failures undebuggable. -keep class org.slf4j.jul.** { *; } -keep class org.slf4j.spi.SLF4JServiceProvider { *; } -keepnames class org.slf4j.** { *; } # Kotlinx serialization -keepattributes *Annotation*, InnerClasses -dontnote kotlinx.serialization.AnnotationsKt -keep,includedescriptorclasses class dev.stave.**$$serializer { *; } -keepclassmembers class dev.stave.** { *** Companion; } -keepclasseswithmembers class dev.stave.** { kotlinx.serialization.KSerializer serializer(...); } # Media3 -keep class androidx.media3.** { *; } -dontwarn androidx.media3.** # ── Raw Cast client (observer / follower mode) ────────────────────── # Hand-rolled Cast v2 wire codec + TLS with permissive trust for the # Chromecast's self-signed cert, all on raw SSLSocket. First minified # release coincided with TV follow failing 100% while debug worked; # no confirmed R8 victim yet (no reflection in the package), so keep # the whole package as a conservative shield until a release logcat # trace (tag: EarhornCast) names the exact failure. Size cost: a few KB. -keep class dev.stave.cast.raw.** { *; } -dontwarn dev.stave.cast.raw.**