# OpenDance Studio —— R8 / ProGuard 规则 # # release 构建开启 minifyEnabled + shrinkResources。以下 keep 规则覆盖: # - MediaPipe(大量 JNI 与反射,且 tasks-vision 的 AutoValue 生成类需保留) # - OkHttp / Okio(平台相关实现按类名查找) # - Kotlin 协程与元数据 # 删掉这些规则会导致 release 包在真机上运行时崩溃(debug 包不会暴露该问题)。 # ---------------------------------------------------------------- MediaPipe # # T-AND-012:release 崩溃(ExceptionInInitializerError / UnsatisfiedLinkError) # 的一大来源就是 R8 把 MediaPipe 的类裁掉或改名。以下规则逐条对应: # 1. 整个包保持原样(JNI 按类名/方法名查找); # 2. **native 方法所在的类与其声明类名必须保留**(仅 keep class 不够, # R8 仍可能裁剪方法名,导致 JNI 注册失败); # 3. 生成 seeds 文件,发布前可用 -printseeds 核对关键类没被裁掉。 -keep class com.google.mediapipe.** { *; } -keep interface com.google.mediapipe.** { *; } -keepclasseswithmembernames class com.google.mediapipe.** { native ; } -keepclasseswithmembernames class * { native ; } -dontwarn com.google.mediapipe.** # MediaPipe 使用 AutoValue 生成不可变类,依赖注解与泛型签名 -keep class com.google.auto.value.** { *; } -dontwarn com.google.auto.value.** -keepclassmembers class * { @com.google.auto.value.AutoValue.Builder ; } # MediaPipe / TFLite 的 native 入口 -keepclasseswithmembernames class * { native ; } # protobuf(MediaPipe 依赖) -keep class com.google.protobuf.** { *; } -dontwarn com.google.protobuf.** # ---------------------------------------------------------------- OkHttp / Okio -dontwarn okhttp3.** -dontwarn okio.** -dontwarn org.conscrypt.** -dontwarn org.bouncycastle.** -dontwarn org.openjsse.** -keep class okhttp3.internal.platform.** { *; } -keep class org.conscrypt.** { *; } -keep class org.bouncycastle.** { *; } -keep class org.openjsse.** { *; } # ---------------------------------------------------------------- Kotlin / 协程 -keepattributes Signature, InnerClasses, EnclosingMethod, *Annotation* -keep class kotlin.Metadata { *; } -dontwarn kotlin.** -keepclassmembers class kotlinx.coroutines.** { volatile ; } # ---------------------------------------------------------------- AndroidX / Compose -dontwarn androidx.** -keep class androidx.camera.** { *; }