# ODY Release Proguard Rules # ───────────────────────────────────────────────────────────────────────────── # ── Kotlin ──────────────────────────────────────────────────────────────────── -keep class kotlin.** { *; } -keep class kotlin.Metadata { *; } -dontwarn kotlin.** -keepclassmembers class **$WhenMappings { ; } -keepclassmembers class kotlin.Lazy { *; } # ── Kotlin Coroutines ───────────────────────────────────────────────────────── -keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} -keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} -keepclassmembernames class kotlinx.** { volatile ; } -dontwarn kotlinx.coroutines.** # ── Jetpack Compose ─────────────────────────────────────────────────────────── -keep class androidx.compose.** { *; } -keepclassmembers class androidx.compose.** { *; } -dontwarn androidx.compose.** # ── ODY Guards (müssen vollständig erhalten bleiben) ───────────────────────── -keep class de.ody.guards.** { *; } -keepclassmembers class de.ody.guards.** { *; } # ── ODY Runtime Interface + Adapter ────────────────────────────────────────── -keep interface de.ody.runtime.LocalModelRuntime { *; } -keep class de.ody.runtime.** { *; } -keepclassmembers class de.ody.runtime.** { *; } # ── ODY Application + MainActivity ─────────────────────────────────────────── -keep class de.ody.ODYApplication { *; } -keep class de.ody.app.ODYApplication { *; } -keep class de.ody.app.MainActivity { *; } # ── LlamaContext (librnllama.so JNI) — Fix direct-mmap3 ───────────────────── # LlamaContext darf NICHT durch R8/ProGuard umbenannt oder entfernt werden, # da librnllama.so die Klasse per JNI-Name findet. -keep class org.nehuatl.llamacpp.** { *; } -keepclassmembers class org.nehuatl.llamacpp.** { *; } -keepclassmembers class org.nehuatl.llamacpp.LlamaContext { public (int, java.util.Map); public long getContext(); public void setTokenCallback(kotlin.jvm.functions.Function1); public java.util.Map completion(java.util.Map); public void stopCompletion(); public boolean isPredicting(); public void release(); native ; } -dontwarn org.nehuatl.llamacpp.** # ── LiteRT-LM (Google AI Edge) ──────────────────────────────────────────────── -keep class com.google.ai.edge.** { *; } -dontwarn com.google.ai.edge.** # ── Enum-Klassen vollständig erhalten ───────────────────────────────────────── -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # ── Data-Klassen (Serialisierung, Reflection) ───────────────────────────────── -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # ── Entferne Logging in Release ─────────────────────────────────────────────── -assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static int v(...); public static int d(...); } # ── Entferne Debug-Assertions ───────────────────────────────────────────────── -assumenosideeffects class kotlin.jvm.internal.Intrinsics { static void checkParameterIsNotNull(java.lang.Object, java.lang.String); static void checkNotNullParameter(java.lang.Object, java.lang.String); static void checkExpressionValueIsNotNull(java.lang.Object, java.lang.String); static void checkNotNullExpressionValue(java.lang.Object, java.lang.String); static void checkReturnedValueIsNotNull(java.lang.Object, java.lang.String, java.lang.String); static void checkReturnedValueIsNotNull(java.lang.Object, java.lang.String); static void throwUninitializedPropertyAccessException(java.lang.String); static void throwNpe(java.lang.String); static void throwJavaNpe(); static void throwIfNull(java.lang.Object, java.lang.String); }