# kotlinx.serialization # # The generated $$serializer classes are referenced only reflectively, so R8 # strips them without an explicit keep and every decode fails at runtime with a # SerializationException — release-only, and invisible until the feed comes back # empty on a signed build. -keepattributes *Annotation*, InnerClasses -dontnote kotlinx.serialization.** -keep,includedescriptorclasses class social.grain.**$$serializer { *; } -keepclassmembers class social.grain.** { *** Companion; } -keepclasseswithmembers class social.grain.** { kotlinx.serialization.KSerializer serializer(...); } # The models are the serialized surface; keep their fields so names survive. -keep class social.grain.data.model.** { *; } -keep class social.grain.data.api.** { *; } -keep class social.grain.data.upload.GalleryDraft { *; } -keep class social.grain.data.upload.GalleryDraft$* { *; } -keep class social.grain.data.auth.StoredAccount { *; } # OkHttp -dontwarn okhttp3.** -dontwarn okio.** # H3 (com.uber:h3-android) # # libh3-java.so finds its Java side by name and the aar ships no consumer rules, # so R8 is free to rename the very classes the native code looks up. JNI_OnLoad # calls FindClass on `com/uber/h3core/util/LatLng` and # `com/uber/h3core/exceptions/H3Exception`, and the 63 entry points are bound # implicitly as `Java_com_uber_h3core_NativeMethods_*` — a rename breaks either # path. What comes back is not an exception but a JNI abort: SIGABRT with # "java_class == null in call to GetMethodID", which kills the process outright. # LocationServices wraps H3 in runCatching precisely because it expects H3 to be # absent on some devices, and that cannot catch a native abort. -keep class com.uber.h3core.** { *; } -dontwarn com.uber.h3core.**