1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 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.**