gsy-proguard-r8
在启用了 R8 优化 / Full Mode / Configuration Analyzer 的项目里,为 GSYVideoPlayer 配置正确、最小面积的保留规则。
来源信息
- 仓库
- CarGuo/GSYVideoPlayer
- 最近来源活动
- 2026年9月1日 06:44
- 检测到的 SKILL.md 语言
- 中文
- 星标
- 21,494
- 分支
- 4,316
安装方式
默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。
检查来源文件
决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。
正在显示 SKILL.md
SKILL.md
来源说明 · 只读预览- name
- gsy-proguard-r8
- description
- 在启用了 R8 优化 / Full Mode / Configuration Analyzer 的项目里,为 GSYVideoPlayer 配置正确、最小面积的保留规则。
- when_to_use
- minifyEnabled true 之后运行崩溃;集成 AGP 8.6+/Media3 需要迁移规则;用 R8 Configuration Analyzer 做 keep 规则精简。
- inputs
- [{"name":"kernel","description":"使用的内核(ijk/exo/aliyun)","required":true}]
- outputs
- ["proguard-rules.pro 覆盖三处反射热点 + JNI 层 + 序列化,release 构建不崩。"]
- references
- [{"file":"app/proguard-rules.pro"},{"file":"doc/R8_ANALYZER_REPORT.md"},{"file":"gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/PlayerFactory.java"},{"file":"gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/cache/CacheFactory.java"},{"file":"gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/video/base/GSYBaseVideoPlayer.java"}]
# gsy-proguard-r8
## 三个必须的反射热点
分别在源代码里:
1. **PlayerFactory** [#L11-L13](file:///D:/workspace/project/GSYVideoPlayer/gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/PlayerFactory.java#L11-L13) —— `Class.newInstance()` 反射构造 `IPlayerManager` 实现。
2. **CacheFactory** —— 同上,构造 `ICacheManager` 实现(见 [CacheFactory](file:///D:/workspace/project/GSYVideoPlayer/gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/cache/CacheFactory.java))。
3. **GSYBaseVideoPlayer.startWindowFullscreen** —— 通过 `getConstructor(Context, Boolean)` 复刻自身,实现"全屏时另起一份 player",见 [GSYBaseVideoPlayer](file:///D:/workspace/project/GSYVideoPlayer/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](file:///D:/workspace/project/GSYVideoPlayer/app/proguard-rules.pro)。
## Aliyun 内核追加
```proguard
-keep class com.aliyun.player.** { *; }
-keep class com.cicada.player.** { *; }
-dontwarn com.aliyun.player.**
```
## R8 Configuration Analyzer 使用
AGP 8.6.x 未内置独立任务,但可以:
1. 在 `settings.gradle` 里覆盖 R8 版本到 9.4.14+:
```groovy
buildscript {
dependencies { classpath 'com.android.tools:r8:9.4.14' }
}
```
2. 用 system property 触发报告输出(AGP 9.3+ 或 R8 9.4+):
```
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=D:/absolute/path/report
```
3. `./gradlew :app:assembleRelease` 后打开 report/index.html 查看 Blast Radius。
4. 用仓库脚本 [build/r8-analyzer/score.mjs](file:///D:/workspace/project/GSYVideoPlayer/build/r8-analyzer/score.mjs) 提取 Shrinking / Optimization / Obfuscation 三档分数并做前后对比。
## 分数对比示例
见 [doc/R8_ANALYZER_REPORT.md](file:///D:/workspace/project/GSYVideoPlayer/doc/R8_ANALYZER_REPORT.md):本项目将 `-keep class com.shuyu.gsyvideoplayer.** { *; }` 全量 keep 收敛成 3 条精准 keep 后,Shrinking / Optimization / Obfuscation 三档分数、live class/method 数、APK 尺寸对比。
## 校验清单(发版前)
| 步骤 | 命令/操作 |
|---|---|
| release 构建 | `./gradlew :app:assembleRelease` |
| 直接安装真机 | `adb install -r app/build/outputs/apk/release/*.apk` |
| 手动跑主流程 | 详情播放 → 全屏 → 手势 → seek → 缓存命中 → 列表 → 广告 → 投屏(若集成) |
| logcat | `adb logcat -s System.err AndroidRuntime GSYVideoPlayer` 无 `ClassNotFoundException` / `NoSuchMethodException` |
## 常见崩溃 -> 规则映射
| 崩溃症状 | 原因 | 增补规则 |
|---|---|---|
| `NoSuchMethodException: xxxVideoPlayer.<init>(Context, Boolean)` | 未保留自定义 View 的 Boolean 构造 | `-keep class * extends GSYBaseVideoPlayer` 那条 |
| `InstantiationException` on switching kernel | Manager 实现类被去除或改名 | `-keep class * implements IPlayerManager` |
| `UnsatisfiedLinkError` `libijkplayer.so` | ijkplayer JNI 回调找不到 Java 类 | `-keep class tv.danmaku.ijk.media.player.** { *; }` |
| `ClassNotFoundException: androidx.media3...*` | Exo/Media3 未抑警且 aar consumer 未生效 | `-dontwarn androidx.media3.**` + 检查 aar 是否 include |
| List 页 seek 后 seek 失效 | 序列化模型被混淆 | 保留 `Serializable` / `Parcelable` |
## 常见坑
- 用 `-allowaccessmodification` + `Full Mode` 时,父子类构造器可见性会被改写;`-keep <init>` 一定要写。
- `consumer-rules.pro` 只在 aar 打包时打入,本地源码模块不生效;如果 SDK 是源码依赖,需要把 keep 规则同时放到 app `proguard-rules.pro`。
- Media3 aar 会覆盖旧的 `com.google.android.exoplayer2.**`,两者规则并存无害,但只用其一时可只保留对应 `-dontwarn`。
在 GitHub 查看