# Gsy Proguard R8

在启用了 R8 优化 / Full Mode / Configuration Analyzer 的项目里，为 GSYVideoPlayer 配置正确、最小面积的保留规则。

- Repository: https://github.com/CarGuo/GSYVideoPlayer (21524 stars)
- Category: Engineering
- License: Apache-2.0
- Last updated: 2026-10-10
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add CarGuo/GSYVideoPlayer --skill gsy-proguard-r8 -g -a claude-code -y`
Codex: `npx skills add CarGuo/GSYVideoPlayer --skill gsy-proguard-r8 -g -a codex -y`
Cursor: `npx skills add CarGuo/GSYVideoPlayer --skill gsy-proguard-r8 -g -a cursor -y`
Gemini CLI: `npx skills add CarGuo/GSYVideoPlayer --skill gsy-proguard-r8 -g -a gemini-cli -y`

## Description

在启用了 R8 优化 / Full Mode / Configuration Analyzer 的项目里，为 GSYVideoPlayer 配置正确、最小面积的保留规则。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# gsy-proguard-r8

## 三个必须的反射热点

分别在源代码里：
1. **PlayerFactory** [#L11-L13](../../gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/PlayerFactory.java), , `Class.newInstance()` 反射构造 `IPlayerManager` 实现。
2. **CacheFactory**, , 同上，构造 `ICacheManager` 实现（见 [CacheFactory](../../gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/cache/CacheFactory.java)）。
3. **GSYBaseVideoPlayer.startWindowFullscreen**, , 通过 `getConstructor(Context, Boolean)` 复刻自身，实现"全屏时另起一份 player"，见 [GSYBaseVideoPlayer](../../gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/video/base/GSYBaseVideoPlayer.java)。

## 推荐 `proguard-rules.pro`（IJK 内核，含 Media3 抑警）

```proguard
# ---- ijkplayer JNI ----
-keep class tv.danmaku.ijk.media.player.** { *; }
-dontwarn tv.danmaku.ijk.media.player.**

# ---- GSYVideoPlayer 反射热点 ----
-keep class * extends com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer {
    public <init>(android.content.Context);
    public <init>(android.content.Context, java.lang.Boolean);
}
-keep class * implements com.shuyu.gsyvideoplayer.player.IPlayerManager {
    public <init>();
}
-keep interface com.shuyu.gsyvideoplayer.player.IPlayerManager { *; }
-keep class * implements com.shuyu.gsyvideoplayer.cache.ICacheManager {
    public <init>();
}
-keep interface com.shuyu.gsyvideoplayer.cache.ICacheManager { *; }

# ---- Media3 aar 已自带 consumer rules，仅抑警 ----
-dontwarn androidx.media3.**
-dontwarn com.google.android.exoplayer2.**

# ---- 常规序列化 ----
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
```

完整版参照仓库当前的 [proguard-rules.pro](../../app/proguard-rules.pro)。

The rest: https://github.com/CarGuo/GSYVideoPlayer/blob/HEAD/skills/13-gsy-proguard-r8/SKILL.md
