dart format --output=none --set-exit-if-changed lib test
dart analyze --fatal-infos lib test
flutter test --dart-define=DISABLE_REMOTE_IMAGES=true
flutter test --dart-define=DISABLE_REMOTE_IMAGES=true --dart-define=ALL_SOURCES=true
cd native
go test -race ./...
go test -race -ldflags="-X duanjuapp/native/core.buildAllSources=true" ./...
红果鉴 / 真果鉴
Flutter 多端独立短剧 / 影视应用
使用
站源可用性、清晰度和区域限制取决于源站及网络;应用不解除源站 VIP 或其他授权限制。
安装包与平台状态
hongguojian.exe/zhenguojian.exe,保留所有 DLL 与data;局域网原生发现依赖 Windows 10 1903+CFBundleDisplayName使用英文HongGuoJian/ZhenGuoJian以通过 iloader 等侧载工具注册 App ID 时的名称校验,中文名写入zh-Hans.lproj/InfoPlist.strings(开发快照,未经 Xcode 构建验证);待 Xcode 构建与真机验收,无已签名 IPAINSTALL_FAILED_NO_MATCHING_ABIS表示 APK 与设备架构不匹配,请更换对应架构安装包。GitHub Actions
工作流只能手动触发,推送和 PR 不再自动运行检查。
发布流程:提升
pubspec.yaml的version,在CHANGELOG.md写好同名版本一节(标题如## 0.2.72+79,会写入 Release 说明),推送到main,再在 Actions 中手动运行 Build app packages(只能选main)。工作流先检查版本:tagapp-v{version}(+替换为-)或同名 Release 已存在时,直接失败,不进入构建。然后同时构建三个平台的两版(默认与--all-sources):*-android*-windows*-ios-unsignedchecks(格式、分析、测试不阻塞)、Android、Windows、iOS 全部成功后才创建 tag 和 Release;任一平台失败就不发布。已有 Release 不会被覆盖。手动发布流程为开发快照,尚未完成首次运行验证。
Android 签名只使用仓库 Secrets:
ANDROID_KEYSTORE_BASE64、ANDROID_KEYSTORE_PASSWORD、ANDROID_KEY_ALIAS、ANDROID_KEY_PASSWORD;同时需要配置仓库变量ANDROID_CERT_SHA256(证书 SHA-256,冒号和大小写不限)。缺少任意一项都会发布失败。CI 通过环境变量把签名传给 Gradle;本机构建使用android/key.properties。key.properties和证书文件不入库。开发与构建
Flutter
3.47.4、Dart3.12+、Go1.24.1+、Python3.10+。 Android 需要 JDK 17、SDK 36、NDK28.2.13676358; Windows 需要 Visual Studio C++ 桌面组件及 MinGW-w64 x64; iOS 需要 macOS、完整 Xcode 和 CocoaPods。构建脚本对子进程默认设置
GOPROXY=https://goproxy.cn,direct、GOSUMDB=off,同名环境变量可覆盖。产物在
dist/android、dist/windows、dist/ios,红果版以hongguojian-开头,全站源版以zhenguojian-开头。首次 Android 调试先编译对应架构核心,再运行:
调试全站源版:先给
build_native.py加--all-sources,再flutter run --dart-define=ALL_SOURCES=true;iOS 对应build_ios.py --core-only --all-sources。脚本会同步设置 Dart 常量和 Go 编译参数,应用启动时校验二者一致,避免混装原生库。播放器使用 media_kit / libmpv,合并和导出使用 FFmpegKit min-gpl(含 GPL 媒体组件)。FFmpegKit 不参与正常播放或下载的转码。
集中检查
目录结构
libnative/core、native/bridgeandroid、windows、iosassets/video_enhancement、packages/media_kit_libs_windows_videoscripts、.github/workflowstest站源开发约定
站源是 Go 原生 provider(
native/core/provider_*.go),不是运行期加载的 Python 源。新增站源需接入:provider_huangguo.go(常量 / 白名单 /canonicalProviderSource/GetHuangguoChapters)、provider_media.go(baseURL / host 反查 / 播放分派)、app_categories.go、app_cover_metadata.go、app_runtime.go(Config 字段 + 目录 / 搜索 / 详情分派 + 空页放行),并在lib/models.dart登记SourceSite。注意:Go RE2 正则不支持 lookahead。解析多线路播放列表时不能用
(?=...)做分段,否则非捕获组会消耗下一段开头;应改用显式字符串截断(从容器标记之后查找下一段标记)。