面向个人使用的 PiliPlus fork,主要在 Pixel 10 Pro / Android 17(API 37)/ Tensor 平台上做发热耗电优化、系统原生画中画、以及一些播放交互的打磨。保留 Bilibili 的完整日常体验,不做大规模阉割,SponsorBlock / 空降助手继续可用。
- 基于:上游 PiliPlus
v2.0.9+1(commit90eee40f9“flutter 3.44.5”)。 - 上游原版 README 已归档到 docs/archive/README.upstream.md。
- 详细逐轮改动见 UPDATE.md,待办与限制见 TODO.md。
按返回键让视频以系统原生 PiP 继续播放,同时回到 PiliPlus 的上一页——且不露出上一个 app。
- 单
MainActivity无法让系统 PiP 盖在本 app 的上一页之上(PiP 是 Activity 级能力)。方案是新增独立的原生PipActivity作为 PiP 壳,把 libmpv 的视频输出 surface 从 Flutter 纹理热切换到壳的TextureView——播放器不重建、不缓冲。 - Android 13+ 用
ActivityOptions.makeLaunchIntoPip直接以 PiP 形态启动,无全屏闪现。 - PiP 为纯系统原生窗口:原生圆角、捏合缩放、拖动、关闭区,附带 快退10s / 播放暂停 / 快进10s 控件(经媒体会话)。
- 点展开 → 无缝回到视频页;拖到关闭区 → 停止播放、上报进度、销毁播放器。
- 为此把
media_kit_video转为本地维护(third_party/media_kit_video,基于上游 forkversion_1.2.5),新增externalSurfaceActive开关,PiP 接管期间挂起其自动重挂,避免输出被抢回 Flutter 纹理导致黑屏。 - 取舍:PiP 窗口内不显示弹幕(弹幕由 Flutter 渲染,无法进入原生窗口)。
- 备选:应用内浮动小窗(
返回时小窗播放,默认关),带弹幕、可拖动吸边。
- 前台请求本应用 60Hz 渲染刷新率,降低发热与耗电(
Android 17/Tensor 省电刷新率,API 37+ 默认开)。 - 调整 Android 默认播放负载:Wi-Fi 默认 1080P、蜂窝 720P,解码偏好 HEVC/AVC/AV1。
- 迁移路径默认关闭播放器预初始化与超分,但保留后台音频服务与高音质,不影响锁屏 / 后台 / PiP 听歌。
- 旧版逐帧累加的亮度/音量调节稍滑就跳;新版改为「捕获手势起点值 + 相对起点总位移映射」,跟手不漂移。
- 亮度额外过一条 gamma(2.2) 感知曲线,暗处更细腻,接近原版 B 站丝滑手感。
- 旧逻辑保留为设置项
使用旧版滑动调节(默认关)。
- 默认白色版 bilibili 图标(自适应 + 传统各尺寸)。
- 设置
应用图标可在国际版 bilibili/原版 PiliPlus间切换 (activity-alias + 运行时 PackageManager 切换组件)。
- 设置首项新增独立页
个性化改动,集中本 fork 新增的所有开关, 避免散落在原版繁杂设置里。原版自带设置保持原位。
- 「关于」页手动检查更新、启动时自动检查,现在只看
ArthurADDDDD/PiliPlus自己的 正式 GitHub Release(GET /releases/latest),不再指向上游仓库。 - 判断是否有新版本只看 Release tag 里的 build number(如
v2.0.9+5103的5103),不靠创建时间猜测;tag 与pubspec.yaml版本号由 CI 强制校验一致。 - Android 按手机 CPU 架构(
arm64-v8a/armeabi-v7a/x86_64)自动匹配对应 APK 下载链接;没有匹配资产时打开 Release 页面,不静默失败、不在 App 内静默安装。 - 正式发布走
.github/workflows/build.yml的手动触发流程,必须用固定 release keystore 签名,缺密钥直接失败,不会退回临时签名;额外配置EXPECTED_SIGNING_CERT_SHA256后,构建前后都会校验实际证书指纹与预期一致, 防止误传另一把有效但不同的 keystore。完整发布步骤(含"沿用现有签名免卸载 迁移" vs "新建专用签名"两种方案的取舍)见docs/RELEASE_GUIDE.md。 - 截至本文档更新时,这个 fork 还没有发布过任何正式 Release,也没有在
真机上验证过检查更新弹窗、下载、覆盖安装的完整链路——上面这些都是代码
已完成、待用户后续执行首次发布和实机验证的状态,见
TODO.md。
播放设置
返回键进入原生画中画:默认开。返回键回上一页并以系统原生 PiP 继续播放。返回时小窗播放:默认关。上一项关闭时生效,改用应用内浮动小窗(带弹幕)。后台画中画:默认开。进入后台时以系统 PiP 播放。关闭画中画时暂停:默认开。PiP 拖到关闭区后停止播放。画中画不加载弹幕:默认关。使用旧版滑动调节:默认关。开启回到旧版逐帧亮度/音量调节。
视频设置
Android 17/Tensor 省电刷新率:API 37+ 默认开,请求本应用 60Hz 渲染。
- PiP 默认大小/落点无法由 App 指定:Android 不提供公开 API,系统自行决定并记忆用户上次拖动/缩放的结果(实测
setSourceRectHint在 Pixel 上不改变落点)。 - 两种 PiP 记忆各自独立:回桌面 PiP(
MainActivity,带弹幕)与返回键 PiP(PipActivity,无弹幕)由系统按 Activity 组件分别记忆,无法用 API 合并;统一记忆需牺牲其中一种的弹幕,故保持现状。 - 微信分享仍为纯文字+链接:原版卡片链接需微信开放平台 SDK + 绑定本包名/签名的 AppID,个人包无法获得,暂不实现(详见 TODO.md)。
- 实机验证:Pixel 10 Pro,Android 17 / API 37,arm64-v8a。
- 随仓库发布:release/PiliPlus-arm64-v8a-release.apk
- 最新 SHA256:
B7EE0035A102DD46B8A6AE03B17D381B9F9A1494B8ABBC294331C56AB6A636DC - 构建日期:2026-07-10
依赖上游 fork 的自定义 media_kit 等(见 pubspec.yaml 的 git/path 依赖,media_kit_video 已 vendored 到 third_party/)。arm64 release:
flutter pub get
flutter build apk --release --split-per-abi --target-platform android-arm64
本次开发使用的临时工具链(Flutter 3.44.5 / Android SDK / JDK 17 等)放在仓库外的 D:\CodexTemp,不提交。
想发布一个正式、签名固定、能让已安装用户收到更新提示的版本,
不要用上面的本地命令,改走 .github/workflows/build.yml 的 GitHub Actions
手动触发流程(首次需要配置 4 个签名 Secrets),完整步骤见
docs/RELEASE_GUIDE.md。