安全修复: - usesCleartextTraffic=false + network_security_config.xml (LAN例外) - 备份规则排除数据库/SP/缓存 (backup_rules.xml, data_extraction_rules.xml) - ProGuard Release移除 Log.d/Log.v - EmbyRepository 日志脱敏 + API Key安全注释 - EmbyServer URL长度/主机名/端口验证 UI一致性: - LumaDesignSystem 新增16个颜色令牌 + LumaBorders + 2个排版令牌 - 6个屏幕文件硬编码颜色统一到LumaColors - 排版统一 17sp→18sp, 30sp→32sp, 34sp→32sp 功能修复: - 首页MyMediaGrid点击导航到库列表 - 搜索齿轮图标导航到设置 - FavoritesAllScreen/HomeLibraryAllScreen 添加下拉刷新 - RecordsScreen 13+硬编码中文→stringResource() + 修复count bug - 新增16个日历字符串(中英文) 性能优化: - TMDB数据类添加@Immutable注解 - HomeContentCache添加LRU驱逐策略(最多3个快照) - VideoPlayerScreen内部轮询从250ms降至500ms Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
72 lines
2.8 KiB
Prolog
72 lines
2.8 KiB
Prolog
# ── Room entities & DAOs (reflection-based by Room) ──
|
|
-keep class com.example.myapplication.data.ServerEntity { *; }
|
|
-keep class com.example.myapplication.data.FavoriteEntity { *; }
|
|
-keep class com.example.myapplication.data.WatchlistEntity { *; }
|
|
-keep class com.example.myapplication.data.IconLibraryEntity { *; }
|
|
-keep class com.example.myapplication.data.*Dao { *; }
|
|
-keep class com.example.myapplication.data.AppDatabase { *; }
|
|
|
|
# ── Gson / Retrofit (keep serialized field names) ──
|
|
-keepattributes Signature
|
|
-keepattributes *Annotation*
|
|
-dontwarn sun.misc.**
|
|
-keep class com.google.gson.** { *; }
|
|
-keep class retrofit2.** { *; }
|
|
-keepclassmembers,allowobfuscation class * {
|
|
@com.google.gson.annotations.SerializedName <fields>;
|
|
}
|
|
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
|
|
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
|
|
|
|
# ── Keep Emby API models (Gson deserialization) ──
|
|
-keep class com.example.myapplication.data.EmbyItem { *; }
|
|
-keep class com.example.myapplication.data.EmbyServer { *; }
|
|
-keep class com.example.myapplication.data.EmbyPerson { *; }
|
|
-keep class com.example.myapplication.data.EmbyMediaStream { *; }
|
|
-keep class com.example.myapplication.data.EmbyMediaSource { *; }
|
|
-keep class com.example.myapplication.data.EmbyChapter { *; }
|
|
-keep class com.example.myapplication.data.EmbyUserData { *; }
|
|
-keep class com.example.myapplication.data.EmbyNamedReference { *; }
|
|
-keep class com.example.myapplication.data.EmbyAuthRequest { *; }
|
|
-keep class com.example.myapplication.data.EmbyAuthResponse { *; }
|
|
-keep class com.example.myapplication.data.EmbyUser { *; }
|
|
-keep class com.example.myapplication.data.EmbyMediaFoldersResponse { *; }
|
|
-keep class com.example.myapplication.data.EmbyMediaFolder { *; }
|
|
-keep class com.example.myapplication.data.EmbyItemsResponse { *; }
|
|
-keep class com.example.myapplication.data.EmbyPlaybackInfoResponse { *; }
|
|
-keep class com.example.myapplication.data.EmbyResourceStats { *; }
|
|
|
|
# ── OkHttp ──
|
|
-dontwarn okhttp3.**
|
|
-dontwarn okio.**
|
|
-keep class okhttp3.** { *; }
|
|
|
|
# ── OkHttp Logging Interceptor ──
|
|
-dontwarn okhttp3.logging.**
|
|
|
|
# ── Coil ──
|
|
-dontwarn coil.**
|
|
|
|
# ── Media3 / ExoPlayer ──
|
|
-keep class androidx.media3.** { *; }
|
|
-dontwarn androidx.media3.**
|
|
|
|
# ── Kyant Backdrop ──
|
|
-keep class com.kyant.backdrop.** { *; }
|
|
-dontwarn com.kyant.backdrop.**
|
|
|
|
# ── Miuix ──
|
|
-keep class top.yukonga.miuix.** { *; }
|
|
-dontwarn top.yukonga.miuix.**
|
|
|
|
# ── Palette ──
|
|
-keep class androidx.palette.** { *; }
|
|
|
|
# ── Strip debug/verbose logs in Release builds ──
|
|
-assumenosideeffects class android.util.Log {
|
|
public static int d(...);
|
|
public static int v(...);
|
|
}
|
|
# Keep error and warning logs for crash reporting
|
|
# Log.e and Log.w are intentionally NOT stripped
|