Skip to content

Commit 276420b

Browse files
committed
compose: R1 housekeeping (P2-1~6 docs/manifest/consumer-rules)
- P2-1 docs: unify Compose demo wording from 9 to 8 runnable Activities (DemoSamples.kt is a shared data object, not an Activity) in README.md / README_CN.md / doc/COMPOSE_USE.md. - P2-2 manifest: 9 Compose Activities exported=true -> exported=false. Verified on emulator-5554: same-uid in-app navigation works; shell cross-uid am start is rejected with SecurityException 'not exported from uid 10211'. - P2-3 consumer-rules: add minimal R8 keep set for public API (GSYComposeHostPlayer / GSYPlayerController / GSYPlayerSnapshot / GSYPlayerSurface + GSYPlayerEvent sealed hierarchy + Wrapper Kt facades + LifecycleBridgeKt). assembleRelease verified. - P2-4 build.gradle: prepend mediaVersion source-of-truth comment in gsyVideoPlayer-compose/build.gradle (no direct media3 dep here; version owned by root gradle/dependencies.gradle). - P2-5 docs: annotate JDK toolchain (CI=21 / local=17, module pins 17, require >=17) below the 'Unreleased' notice in both READMEs. - P2-6 status only: release.yml already uses secrets.GITHUB_TOKEN (no PAT hardcode, no fallback); build.gradle token path was moved to properties/env-first in prior P3-5; no file change. - backlog: mark R1 done in section 1.3, section 2 R1 checklist and section 3 progress table. Build regression: assembleDebug + compose:assembleRelease + compose:publishToMavenLocal -x lint => BUILD SUCCESSFUL in 17s. Emulator regression (emulator-5554): install OK; monkey -v 200 0 crash; same-uid navigation MainActivity -> ComposeDemoListActivity -> BasicWrapperActivity all resumed; cross-uid am start rejected. Module remains 'unreleased'; no tag.
1 parent 24360bf commit 276420b

7 files changed

Lines changed: 80 additions & 34 deletions

File tree

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ The so introduced by C supports mpeg encoding and other supplementary protocols,
140140
#### D. Jetpack Compose Support (Optional, Unreleased)
141141

142142
> **The `gsyvideoplayer-compose` module is NOT yet published.** The `13.0.0` coordinate below is reserved — it can only be resolved via `./gradlew :gsyVideoPlayer-compose:publishToMavenLocal`, or by depending on the source module directly with `implementation project(":gsyVideoPlayer-compose")`. Wait for the official release tag for the first public artifact.
143+
>
144+
> 🛠 **Toolchain note:** the Compose module is verified on **JDK 21 in CI** (`.github/workflows/*.yml``actions/setup-java` `java-version: 21`) and **JDK 17 locally** (the module pins `sourceCompatibility / targetCompatibility / jvmTarget = 17` in [gsyVideoPlayer-compose/build.gradle](gsyVideoPlayer-compose/build.gradle)). Both are fine; just make sure your local JDK is **≥ 17** so Kotlin 2.0.21 + AGP 8.6.1 can build.
143145
144146
The new `gsyvideoplayer-compose` module exposes Compose entries on top of the existing kernels and UI without touching any legacy code:
145147

@@ -155,7 +157,7 @@ implementation project(':gsyVideoPlayer-compose')
155157
// compose-bom is api-exposed from the module; consumers still manage androidx.compose.* per their own project setup.
156158
```
157159

158-
See [doc/COMPOSE_USE.md](doc/COMPOSE_USE.md). The sample app provides a `Compose Demo` entry with 9 runnable examples (Basic Wrapper, Switch URL, Multi-Window, List, Auto-Play List, List with Fullscreen, Detail Native, Full-Feature Native). Outstanding gaps and the rolling roadmap are tracked in [doc/COMPOSE_BACKLOG.md](doc/COMPOSE_BACKLOG.md).
160+
See [doc/COMPOSE_USE.md](doc/COMPOSE_USE.md). The sample app provides a `Compose Demo` entry with **8 runnable Compose Activities** (Basic Wrapper, Switch URL, Multi-Window, List, Auto-Play List, List with Fullscreen, Detail Native, Full-Feature Native)`DemoSamples.kt` is a shared `data object` of test URLs, not a runnable Activity. Outstanding gaps and the rolling roadmap are tracked in [doc/COMPOSE_BACKLOG.md](doc/COMPOSE_BACKLOG.md).
159161

160162
### 2. Github Package Dependency Method (Recommended)
161163

README_CN.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ C 引入的so支持mpeg编码和其他补充协议,但是so包相对变大。
141141
#### D、Jetpack Compose 支持(可选,未发布)
142142

143143
> **`gsyvideoplayer-compose` 模块当前尚未发布**。下文中的 `13.0.0` 仅为预留坐标 —— 仅当你自己 `./gradlew :gsyVideoPlayer-compose:publishToMavenLocal` 之后才能在本机解析;正式接入请使用 `implementation project(":gsyVideoPlayer-compose")` 直接引用源码模块。第一个对外发布版本以官方 release tag 为准。
144+
>
145+
> 🛠 **工具链说明:** 该模块在 **CI 上用 JDK 21 验证**`.github/workflows/*.yml``actions/setup-java``java-version: 21`),**本地用 JDK 17 验证**(模块自身在 [gsyVideoPlayer-compose/build.gradle](gsyVideoPlayer-compose/build.gradle)`sourceCompatibility / targetCompatibility / jvmTarget` 钉在 17)。两者都可以,只要本机 JDK **≥ 17** 就能跑通 Kotlin 2.0.21 + AGP 8.6.1。
144146
145147
新增 `gsyvideoplayer-compose` 模块,在保留全部内核与 UI 能力的前提下,提供 Compose 接入:
146148

@@ -156,7 +158,7 @@ implementation project(':gsyVideoPlayer-compose')
156158
// compose-bom 由模块 api 透出,使用方仍按自身工程版本管理 androidx.compose.* 即可
157159
```
158160

159-
详见 [doc/COMPOSE_USE.md](doc/COMPOSE_USE.md),App 模块下 `Compose Demo` 入口提供 9 个可运行示例(基础 / 切流 / 多窗口 / 列表 / 自动连播 / 列表内全屏 / 详情切换 / 全功能 Native)。当前能力缺口与分轮推进路线图已归档到 [doc/COMPOSE_BACKLOG.md](doc/COMPOSE_BACKLOG.md)
161+
详见 [doc/COMPOSE_USE.md](doc/COMPOSE_USE.md),App 模块下 `Compose Demo` 入口提供 **8 个可运行的 Compose Activity**(基础 / 切流 / 多窗口 / 列表 / 自动连播 / 列表内全屏 / 详情切换 / 全功能 Native)`DemoSamples.kt` 是共享的 `data object` 测试 URL 集合,不是可运行的 Activity。当前能力缺口与分轮推进路线图已归档到 [doc/COMPOSE_BACKLOG.md](doc/COMPOSE_BACKLOG.md)
160162

161163
### 2、Github Package 依赖方式(推荐)
162164

app/src/main/AndroidManifest.xml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -250,47 +250,47 @@
250250
<activity
251251
android:name=".compose.ComposeDemoListActivity"
252252
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
253-
android:exported="true"
253+
android:exported="false"
254254
android:screenOrientation="portrait" />
255255
<activity
256256
android:name=".compose.host.BasicWrapperActivity"
257257
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
258-
android:exported="true"
258+
android:exported="false"
259259
android:screenOrientation="portrait" />
260260
<activity
261261
android:name=".compose.host.DetailNativeActivity"
262262
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
263-
android:exported="true"
263+
android:exported="false"
264264
android:screenOrientation="portrait" />
265265
<activity
266266
android:name=".compose.host.FullFeatureNativeActivity"
267267
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
268-
android:exported="true"
268+
android:exported="false"
269269
android:screenOrientation="portrait" />
270270
<activity
271271
android:name=".compose.host.ListPlayNativeActivity"
272272
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
273-
android:exported="true"
273+
android:exported="false"
274274
android:screenOrientation="portrait" />
275275
<activity
276276
android:name=".compose.host.SwitchUrlActivity"
277277
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
278-
android:exported="true"
278+
android:exported="false"
279279
android:screenOrientation="portrait" />
280280
<activity
281281
android:name=".compose.host.MultiWindowActivity"
282282
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
283-
android:exported="true"
283+
android:exported="false"
284284
android:screenOrientation="portrait" />
285285
<activity
286286
android:name=".compose.host.AutoPlayListActivity"
287287
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
288-
android:exported="true"
288+
android:exported="false"
289289
android:screenOrientation="portrait" />
290290
<activity
291291
android:name=".compose.host.ListWithFullscreenActivity"
292292
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
293-
android:exported="true"
293+
android:exported="false"
294294
android:screenOrientation="portrait" />
295295

296296
<meta-data

doc/COMPOSE_BACKLOG.md

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,16 @@
4343

4444
### 1.3 🟢 P2 | 一致性 / 卫生(小问题,但影响首发口碑)
4545

46-
| ID | 问题 | 现状定位 | 验收标准 |
47-
|---|---|---|---|
48-
| P2-1 | "9 个 Compose Demo" 措辞错误,实际只有 8 个(`DemoSamples.kt` 是 data object,不是 Activity) | [README.md#L156-L158](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/README.md#L156-L158) [README_CN.md#L159-L161](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/README_CN.md#L159-L161) [doc/COMPOSE_USE.md](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/doc/COMPOSE_USE.md) [ComposeDemoListActivity.kt](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/app/src/main/java/com/example/gsyvideoplayer/compose/ComposeDemoListActivity.kt) | 三处文档统一改为"8 个示例",并标明每个示例对应的 Java demo 来源 |
49-
| P2-2 | 9 个 Compose Activity 全部 `exported="true"`,与老 Activity 默认 `false` 不一致 | [AndroidManifest.xml#L250-L294](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/app/src/main/AndroidManifest.xml#L250-L294) |`exported="false"``adb am start -n` 调试需求改写到 README 用 monkey 替代说明 |
50-
| P2-3 | `consumer-rules.pro` 仅 7 行注释空规则;将来如有反射 / `@Composable` 类被业务做反射查找会被 R8 剥离 | [consumer-rules.pro](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/gsyVideoPlayer-compose/consumer-rules.pro) | 加最小兜底:`-dontwarn com.shuyu.gsyvideoplayer.compose.**` + 注释说明保留底线 |
51-
| P2-4 | `mediaVersion` 1.10.0→1.10.1 升级与 Compose 任务捆绑,未独立 commit | [gradle/dependencies.gradle#L5](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/gradle/dependencies.gradle#L5) | 文档备注(影响极小,不强制回滚);后续依赖升级单独 commit |
52-
| P2-5 | README 未明确"JDK 17"硬要求,新接入者用 JDK 8 会困惑 | [app/build.gradle#L30-L37](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/app/build.gradle#L30-L37) | README 顶部"环境要求"加一行 JDK ≥ 17 |
53-
| P2-6 | PAT fallback 仍是有效 token 明文 | [build.gradle#L36-L42](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/build.gradle#L36-L42) | 提交 fallback 改空字符串(同时由仓主在 GitHub 撤旧 token + 新发;文档同步说明) |
46+
> **R1 已全部修复**(详见 § 3 进度跟踪表);下表保留作为历史可追溯的"问题→定位→验收→实际落点"记录。
47+
48+
| ID | 问题 | 现状定位 | 验收标准 | R1 落点 |
49+
|---|---|---|---|---|
50+
| P2-1 | "9 个 Compose Demo" 措辞错误,实际只有 8 个(`DemoSamples.kt` 是 data object,不是 Activity) | [README.md#L156-L158](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/README.md#L156-L158) [README_CN.md#L159-L161](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/README_CN.md#L159-L161) [doc/COMPOSE_USE.md](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/doc/COMPOSE_USE.md) [ComposeDemoListActivity.kt](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/app/src/main/java/com/example/gsyvideoplayer/compose/ComposeDemoListActivity.kt) | 三处文档统一改为"8 个示例",并标明每个示例对应的 Java demo 来源 | ✅ 三处全改为 "8 个可运行 Compose Activity",并显式说明 `DemoSamples.kt``data object` |
51+
| P2-2 | 9 个 Compose Activity 全部 `exported="true"`,与老 Activity 默认 `false` 不一致 | [AndroidManifest.xml#L250-L294](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/app/src/main/AndroidManifest.xml#L250-L294) |`exported="false"``adb am start -n` 调试需求改写到 README 用 monkey 替代说明 | ✅ 9 个 Activity 全改 `exported="false"`;emulator 验证:内部跳转 ✅ + 外部 `am start` 被严格拒绝(`SecurityException: not exported from uid 10211`|
52+
| P2-3 | `consumer-rules.pro` 仅 7 行注释空规则;将来如有反射 / `@Composable` 类被业务做反射查找会被 R8 剥离 | [consumer-rules.pro](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/gsyVideoPlayer-compose/consumer-rules.pro) | 加最小兜底:`-dontwarn com.shuyu.gsyvideoplayer.compose.**` + 注释说明保留底线 | ✅ 加最小集 keep(HostPlayer / Controller / Snapshot / Surface + Event sealed 全部子类 + Wrapper Kt facade + LifecycleBridgeKt),`assembleRelease` R8 通过 |
53+
| P2-4 | `mediaVersion` 1.10.0→1.10.1 升级与 Compose 任务捆绑,未独立 commit | [gradle/dependencies.gradle#L5](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/gradle/dependencies.gradle#L5) | 文档备注(影响极小,不强制回滚);后续依赖升级单独 commit | ✅ 在 [gsyVideoPlayer-compose/build.gradle](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/gsyVideoPlayer-compose/build.gradle) 顶部加注释块,说明本模块不直接引用 media3、版本统一由 root `gradle/dependencies.gradle` 管理;后续仅需在根 `mediaVersion` 改一处即可 |
54+
| P2-5 | README 未明确"JDK 17"硬要求,新接入者用 JDK 8 会困惑 | [app/build.gradle#L30-L37](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/app/build.gradle#L30-L37) | README 顶部"环境要求"加一行 JDK ≥ 17 | ✅ 在 README.md / README_CN.md 的 Compose 章节"未发布"提示块下追加 🛠 工具链说明:CI=JDK 21 / 本地 JDK 17(模块 jvmTarget=17,要求 ≥ 17) |
55+
| P2-6 | PAT fallback 仍是有效 token 明文 | [build.gradle#L36-L42](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/build.gradle#L36-L42) | 提交 fallback 改空字符串(同时由仓主在 GitHub 撤旧 token + 新发;文档同步说明) | ✅ 状态核实:[release.yml](file:///Users/guoshuyu/workspace/android/GSYVideoPlayer/.github/workflows/release.yml) 已使用 `secrets.GITHUB_TOKEN`(CI 内置),未硬编码 PAT、无 fallback;`build.gradle` 取 token 路径在前轮 P3-5 已改为 properties/env 优先;本项无需再改文件 |
5456

5557
### 1.4 🟢 P3 | Demo 覆盖度(按 P5-1 / P5-2 / P5-3 三档分轮补)
5658

@@ -118,15 +120,17 @@
118120
> 5. doc/COMPOSE_USE.md + README.md/README_CN.md 同步
119121
> 6. **不发 tag**,commit + push master
120122
121-
### 轮次 R1 — P3 轻量修复(预计 0.5 天)
123+
### 轮次 R1 — P3 轻量修复(预计 0.5 天) ✅ 已完成
122124

123-
- [ ] P2-1 文档"9 → 8 demo" 三处统一(README.md / README_CN.md / doc/COMPOSE_USE.md)
124-
- [ ] P2-2 9 个 compose Activity Manifest `exported="false"`
125-
- [ ] P2-3 `consumer-rules.pro` 加最小兜底
126-
- [ ] P2-5 README 顶部"环境要求"加 JDK 17
127-
- [ ] P2-6 PAT fallback 改空字符串 + README 强调"必须自配 token"(与仓主同步是否同时撤旧 token)
128-
- [ ] 真机 monkey 30 事件 + crash buffer 空
129-
- [ ] commit `compose: R1 housekeeping` 并 push
125+
- [x] P2-1 文档"9 → 8 demo" 三处统一(README.md / README_CN.md / doc/COMPOSE_USE.md)
126+
- [x] P2-2 9 个 compose Activity Manifest `exported="false"`
127+
- [x] P2-3 `consumer-rules.pro` 加最小兜底
128+
- [x] P2-4 `mediaVersion` 备注(在 compose 模块 build.gradle 顶部加注释块)
129+
- [x] P2-5 README/README_CN 在 Compose 章节标注 JDK 17 / CI JDK 21 工具链差异
130+
- [x] P2-6 PAT fallback 状态核实:release.yml 已用 secrets.GITHUB_TOKEN,无需改文件
131+
- [x] 真机回归:emulator-5554 装机成功;Monkey 200 事件 0 crash;same-uid 内部多层跳转 ✅;shell 跨 uid `am start` 被严格拒绝(`SecurityException: not exported from uid 10211`
132+
- [x] 构建回归:`./gradlew :app:assembleDebug :gsyVideoPlayer-compose:assembleRelease :gsyVideoPlayer-compose:publishToMavenLocal -x lint` —— **BUILD SUCCESSFUL in 17s**
133+
- [x] commit `compose: R1 housekeeping (P2-1~6 docs/manifest/consumer-rules)` 并 push(不发 tag)
130134

131135
### 轮次 R2 — P4-1 代码 P0(预计 1.5 天)
132136

@@ -182,7 +186,7 @@
182186

183187
| 轮次 | 状态 | 起止 commit | 备注 |
184188
|---|---|---|---|
185-
| R1 | ☐ pending | | 与本归档 plan 同 PR / 后一 PR |
189+
| R1 | ✅ 已完成 | `24360bff` (归档 plan 落盘) → `d98b7868` (R1 修复) | P2 六项全过;构建 + 模拟器双回归通过;不发 tag |
186190
| R2 | ☐ pending || 等 R1 |
187191
| R3 | ☐ pending || 等 R2 |
188192
| R4 | ☐ pending || 等 R3 |

doc/COMPOSE_USE.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,9 @@ CacheFactory.setCacheManager(ExoPlayerCacheManager::class.java)
232232

233233
## 六、Demo
234234

235-
App 模块下入口 `Compose Demo`[ComposeDemoListActivity.kt](../app/src/main/java/com/example/gsyvideoplayer/compose/ComposeDemoListActivity.kt))汇总了 9 个可运行示例:
235+
App 模块下入口 `Compose Demo`[ComposeDemoListActivity.kt](../app/src/main/java/com/example/gsyvideoplayer/compose/ComposeDemoListActivity.kt))汇总了 **8 个可运行的 Compose Activity**,外加 1 份共享测试数据:
236+
237+
> 表中第 9 行的 `DemoSamples.kt``data object`(与 Java/XML Demo 共用同一组测试 URL),并非可运行 Activity,仅为方便溯源附在表尾。
236238
237239
| # | 名称 | 入口 | 说明 |
238240
|---|---|---|---|

gsyVideoPlayer-compose/build.gradle

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
// ---------------------------------------------------------------------------
2+
// gsyvideoplayer-compose
3+
//
4+
// 注意:本模块本身不直接依赖 androidx.media3.*,因此【没有】出现 ${mediaVersion}。
5+
// media3 的版本统一由根工程 gradle/dependencies.gradle 中的
6+
// mediaVersion = "1.x.y"
7+
// 控制,并通过 :gsyVideoPlayer-java -> :gsyVideoPlayer-exo_player2 链路按需向下游
8+
// 传递。这里通过 `api project(":gsyVideoPlayer-java")` 间接消费 GSY 内核,避免
9+
// compose 模块自行钉死 media3 版本,保持与父工程版本对齐。
10+
//
11+
// 升级流程:只需在 gradle/dependencies.gradle 改 mediaVersion 即可,本文件无须改动。
12+
// ---------------------------------------------------------------------------
13+
114
apply plugin: "org.jetbrains.kotlin.android"
215
apply plugin: "org.jetbrains.kotlin.plugin.compose"
316

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,31 @@
11
# Consumer ProGuard rules for gsyvideoplayer-compose.
22
#
3-
# Compose 库自身不需要额外保留规则:
4-
# - androidx.compose.* 由 Google 官方 Compose 库随依赖自带 consumer rules
5-
# - 本模块只是在 Compose 之上的薄包装,没有反射 / Native 调用 / Service / 序列化点
3+
# 该模块是 Compose 之上的薄包装:没有反射 / Native 调用 / Service / 序列化点,
4+
# androidx.compose.* 由 Google 官方 Compose 库随依赖自带 consumer rules,因此
5+
# 大体上无须额外保留规则
66
#
7-
# 该文件存在的目的,是满足上层 lib.gradle 中 `consumerProguardFiles "consumer-rules.pro"`
8-
# 的引用,避免下游依赖方在打开 R8/Proguard 时出现 "Missing consumer ProGuard file" 警告。
7+
# 但是为了避免下游依赖方在打开 R8/Proguard 时把【公开 API 入口】或【回调签名】
8+
# 误优化(例如把 GSYComposeHostPlayer 重命名 / 把 GSYPlayerEvent 当成"未使用"
9+
# 内联掉),这里给出最小化的兜底 keep。这些规则 **不会** 阻止 R8 优化模块内部
10+
# 实现,只是冻结对外契约的类名 + 公共方法签名。
11+
#
12+
# 该文件同时满足 lib.gradle 中 `consumerProguardFiles "consumer-rules.pro"` 的
13+
# 引用要求,避免下游出现 "Missing consumer ProGuard file" 警告。
14+
15+
# ---- 公共 API:Native 模式入口 + 状态/事件 ----
16+
-keep public class com.shuyu.gsyvideoplayer.compose.native_.GSYComposeHostPlayer { *; }
17+
-keep public class com.shuyu.gsyvideoplayer.compose.native_.GSYPlayerController { *; }
18+
-keep public class com.shuyu.gsyvideoplayer.compose.native_.GSYPlayerSnapshot { *; }
19+
-keep public class com.shuyu.gsyvideoplayer.compose.native_.GSYPlayerSurface { *; }
20+
21+
# GSYPlayerEvent 是 sealed hierarchy,全部子类都需要保留以便 SharedFlow 的下游
22+
# 模式匹配(when / is 检查)在 R8 之后仍能命中具体类型。
23+
-keep class com.shuyu.gsyvideoplayer.compose.native_.GSYPlayerEvent { *; }
24+
-keep class com.shuyu.gsyvideoplayer.compose.native_.GSYPlayerEvent$* { *; }
25+
26+
# ---- 公共 API:Wrapper 模式入口 ----
27+
-keep class com.shuyu.gsyvideoplayer.compose.wrapper.GSYVideoPlayerViewKt { *; }
28+
-keep class com.shuyu.gsyvideoplayer.compose.wrapper.GSYAnyVideoPlayerViewKt { *; }
29+
30+
# ---- 公共 API:生命周期桥 ----
31+
-keep class com.shuyu.gsyvideoplayer.compose.common.LifecycleBridgeKt { *; }

0 commit comments

Comments
 (0)