ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Pure Live Android 主弹幕模板事务化与辅助语义修复:schema 2 校验、整行开关与原生回归审计实践

Pure Live Android 主弹幕模板事务化与辅助语义修复:schema 2 校验、整行开关与原生回归审计实践 音视频直播移动开发【免费下载链接】pure_live纯粹直播:哔哩哔哩/虎牙/斗鱼/快手/抖音/网易cc/YY直播/Twitch直播/SOOP直播/M38自定义源应有尽有。项目地址https://gitcode.com/gh_mirrors/pur/pure_live点击查看免费下载主弹幕设置是 Pure Live 直播客户端中高频使用、且横跨直播间嵌入页与独立设置页的核心交互面。本文以 2026-09-12 的 Android 原生审计为骨架完整讲解其暴露的四大缺陷嵌入页缺恢复入口、模板恢复部分提交、旧模板兼容缺失、控件辅助语义不全、schema 2 模板的解析与事务化设计、确定性回归验证流程以及真实 Bilibili 直播间中经由 ADB 完成的可重复原生往返验证。读完本文你将掌握如何把“保存/恢复模板”从字段级写值升级为“先整体校验、后一次性提交”的事务模型并为滑块、计数器与开关补齐可被无障碍服务与自动化脚本读取的具名语义。审计结论与闭环范围精确产品提交cc3ab5b2完整 SHA-256cc3ab5b221eff2368a5c595fa4c690440a972838修复了主弹幕设置的模板事务与辅助语义并构建为 Android arm64 Debug 候选包可重复原生脚本提交为9cc76caa85e7486b839aec5dda12918a4f973174。随后在25102RKBEC / myron / Android 17设备上通过显式网络 ADB192.168.1.2:5555完成了同签名覆盖安装、小窗弹幕设置回归以及真实 Bilibili 直播间中的主弹幕模板「保存 → 修改 → 恢复 → 重启往返」验证。该轮审计标记 A2-04 继续RUN本批已关闭的子项包括Android 主弹幕模板保存/恢复/重启往返嵌入页恢复入口主设置开关、滑块、计数器的具名语义小窗设置回归。宏观状态保持20 PASS / 34 RUN / 8 NR42 组未闭环Windows 双栏 GUI、颜色与其余滑块的逐项原生输入、真实系统小窗中的完整视觉对照和长时性能仍为RUN。根因四个相互关联的缺口修改前存在四个问题任何一个都足以让“保存的模板”变得不可信嵌入页能力缺失直播间嵌入式弹幕设置隐藏了“恢复已保存模板”动作与独立页面能力不一致用户切入口不同却获得不同功能。部分提交partial commit模板恢复时按 JSON 字段依次写入 Rx 响应式状态一旦后部字段损坏前部字段区域、留白、速度、字号等已经改变界面处于“改了一半”的中间态。保存内容不完整保存内容未包含纯文字noEmoji模式旧模板新增字段没有兼容回退也没有完整数值边界校验。辅助语义缺失自定义Row Switch、主滑块和CountButton没有完整的设置名、当前值及增减动作语义无障碍服务与自动化脚本无法读取“这是什么、现在是多少、怎么改”。这四个缺口相互关联模板是否可信取决于“保存了什么、恢复如何提交、损坏如何拒绝”而所有这些最终都要通过控件语义暴露给原生层验证。修订一schema 2 的 DanmakuViewingTemplate 事务化解析核心实现在 lib/domains/live/presentation/playback/widgets/danmaku/danmaku_viewing_preset.dart。新增的DanmakuViewingTemplate以schemaVersion 2标记核心设计是在任何设置写入前完整解析类型、有限值、整数与范围解码失败则不触碰任何 Rx 值。static const int schemaVersion 2; String encode() jsonEncode({ version: schemaVersion, noEmojiMode: noEmojiMode, area: area, top: top, bottom: bottom, speed: speed, fontSize: fontSize, fontWeight: fontWeight, fontBorder: fontBorder, opacity: opacity, stroke: stroke, fps: fps, autoFps: autoFps, });tryDecode是事务的入口它先jsonDecode再对每个字段做类型与边界校验任何FormatException/TypeError都返回null调用方直接拒绝整份模板不产生任何副作用。校验规则一览字段校验规则取值范围area必填 double有限值0 ~ 1top/bottom必填 double有限值0 ~ 300pxspeed必填 double有限值20 ~ 400px/sfontSize必填 double有限值10 ~ 30pxfontWeight必填整数可被 100 整除100 ~ 900fontBorder必填 double有限值0 ~ 4pxopacity必填 double有限值0 ~ 1stroke可选 bool缺失回退当前值true / falsefps可选整数缺失回退当前值30 ~ 240autoFps可选 bool缺失回退当前值true / falsenoEmojiMode可选 bool缺失回退当前值true / false关键细节旧模板兼容noEmojiMode、stroke、fps、autoFps这些 schema 2 新增字段在旧模板中缺失时不报错而是保留调用方传入的当前值fallbackNoEmojiMode、fallbackStroke、fallbackFps、fallbackAutoFps非有限值拒绝_requiredDouble显式检查result.isFiniteNaN/Infinity一律抛错整数严格性_optionalInt校验raw.toDouble() ! result.toDouble()非整数如fps: 59.5直接拒绝字重归一化_normalizeFontWeight将任意 100~900 的值吸附到百位步进。保存与恢复的调用链保存与恢复都在 lib/domains/live/presentation/playback/pages/danmaku_settings_page.dart 中实现_saveTemplate()从当前 Rx 状态构造完整DanmakuViewingTemplate含纯文字、FPS、自动 FPSencode()后写入savedDanmakuTemplateHive 持久化键见 lib/core/config/danmaku_settings_controller.dart_restoreTemplate()先tryDecode整体解析返回null时只提示模板无效不写任何字段解析成功后一次性提交全部 13 项到各 Rx 值形成“要么全部生效、要么全部拒绝”的事务语义。这正是修复“部分提交”的核心与旧实现“逐字段写入、后部出错前部已变”不同新实现把“解析验证”与“状态提交”拆成两个阶段验证阶段完全无副作用。修订二嵌入页与独立页统一主开关整行可点弹幕设置界面由 lib/domains/live/presentation/playback/pages/danmaku_settings_page.dart 的DanmakuSettingsContent提供竖屏嵌入直播间标签页、全屏/横屏嵌入自适应侧栏共用同一个DanmakuSettingsSource契约lib/domains/live/presentation/playback/widgets/danmaku/danmaku_settings_source.dart从源头避免两套范围、默认值与持久化行为漂移。本次修订后嵌入页与独立页始终提供“保存当前模板”和“恢复已保存模板”两个动作OutlinedButton.icon分别带save_outlined/restore_rounded图标自定义Row Switch全部替换为整行可点的SwitchListTile点击整行即可切换开关不再要求精确点中 Switch 拇指。修订三七类滑块与计数器的具名辅助语义_slider为每个滑块设置semanticFormatterCallback原生语义输出格式为设置名, 格式化值semanticFormatterCallback: (dynamic semanticValue) $title, ${semanticValueBuilder((semanticValue as num).toDouble())},实际公布的原生语义示例与审计日志完全一致区域画面顶部占用高度, 41%字号字体大小, 12.0。七类主滑块全部覆盖区域、透明度、最大显示数、速度、字号、字重、描边宽度另有小窗缩放x0.40格式与 FPS30 FPS格式。_counter则通过CountButton公布具名当前值以及增加/减少两个动作当前值顶部留白像素, 0/1增加动作增加顶部留白像素减少动作减少顶部留白像素。这些语义由semanticLabel、decrementSemanticLabel、incrementSemanticLabel参数生成小窗PiP统一颜色与最大显示数也一并补齐。对自动化回归而言uiautomator dump 可以直接按文本定位控件、按动作描述执行点击无需坐标猜测。修订四启动与备份导入的数值归一化模板的健壮性不仅依赖解码期校验还依赖运行时入口的归一化。lib/core/config/danmaku_settings_controller.dart 的onInit在启动时对全部主弹幕数值做统一钳制非有限值回落到集中默认值越界值钳到控件实际范围。danmakuTopArea/danmakuBottomArea0 ~ 300danmakuArea/danmakuOpacity0 ~ 1danmakuSpeed20 ~ 400danmakuFontSize10 ~ 30danmakuFontBorder0 ~ 4danmakuLetterSpacing-2 ~ 8danmakuFps30 ~ 240。同一控制器还提供parseConfig/extractConfig分别服务备份导入与 WebDAV 配置提取同样走_boundedDouble/_boundedInt/normalizeFontWeight的统一钳制路径因此“启动、当前格式备份、旧格式提取”三条入口对主弹幕数值的归一化行为完全一致。默认常量也集中在控制器顶部如defaultDanmakuSpeed 120.0、defaultDanmakuFps 60、defaultDanmakuAutoFps true供恢复与边界钳制共用。确定性回归红灯记录与 Focused 测试套件修订前的有效红灯记录于local-artifacts/build-records/20260912T113326275Z-quality-focused.json嵌入式设置中找不到恢复入口一个后部opacity字段损坏的模板在报错前已改变区域、留白、速度、字号等前部设置——直接证明部分提交存在。修订后用当前工具提交9cc76caa运行确定性回归.\tool\local_ci.ps1 -Scope Focused -TestPath ( test/danmaku_settings_surface_test.dart, test/danmaku_viewing_preset_test.dart, test/pip_danmaku_preview_test.dart, test/danmaku_settings_controller_test.dart, test/danmaku_refresh_rate_policy_test.dart, test/backup_import_validation_test.dart, test/translation_contract_test.dart ) -Analyze -SkipPubGet结果Flutter52 / 52 PASSAnalyzeNo issues found仓库审计4802 个跟踪文件、0 个未跟踪文件、0 error质量记录local-artifacts/build-records/20260912T121230459Z-quality-focused.json仓库审计local-artifacts/repository-audits/20260912T121102267Z-focused.json。新增覆盖包括模板全部字段往返、旧模板回退、损坏/越界/非整数模板整体拒绝、非有限备份值归一化、嵌入页恢复入口、整行开关、滑块与计数器语义、小窗颜色与计数器语义——每一条都对应根因清单中的一个缺口。候选构建与同签名覆盖安装Android 候选严格绑定产品提交cc3ab5b2参数如下项目值文件local-artifacts/3.1.8-4121/PureLive-3.1.8-4121-android-arm64-v8a-debug.apk版本3.1.84121Manifest versionCode6121ABIarm64-v8a大小288808125BSHA-256168FBAE87863684A76D8A3997D63CE639B4BA3FA9F2471303BBCD84288C4658DELF 最小 LOAD 对齐0x4000构建记录local-artifacts/build-records/20260912T115639759Z-build-androidarm64-debug.jsontool/android_pip_danmaku_settings_smoke.ps1使用adb install -r -t完成同签名覆盖安装firstInstallTime保持2026-07-21 18:07:53不变证明是覆盖而非全新安装安装前规范 Hive 与安装后首启前 SHA-256 均为701C666A...8EA60C设备base.apk哈希与候选完全一致——安装操作没有污染任何数据。小窗弹幕设置原生回归证据local-artifacts/diagnostics/android-pip-danmaku-settings-20260912T195738455/summary.json。主开关状态序列开 → 关 → 进程重启仍关 → 开 → 进程重启仍开Switch 数为 4 → 1 → 1 → 4 → 4证明开关状态跨进程持久化四个可见 Switch 均具名字号滑块原生语义为字体大小, 12.0恢复确认取消保持自定义关闭状态确认后恢复 14 项小窗默认值并跨进程保持候选覆盖安装保留数据设备 APK 与候选哈希一致结束时规范 Hive 精确恢复Pure Live 进程退出。主弹幕模板原生往返真实 Bilibili 直播间验证可重复脚本为tool/android_danmaku_template_settings_smoke.ps1通过记录local-artifacts/diagnostics/android-danmaku-template-settings-20260912T200727935/summary.json。脚本在真实 Bilibili 直播间进入“弹幕设置”标签并逐阶段断言阶段纯文字顶部留白区域滑块原生语义模板动作基线关0画面顶部占用高度, 41%保存、恢复均可见自定义开1画面顶部占用高度, 41%使用具名增加动作立即恢复关0画面顶部占用高度, 41%两项一起回到保存值进程重启关0画面顶部占用高度, 41%恢复结果持续存在计数器同时暴露顶部留白像素, 0/1、增加顶部留白像素与减少顶部留白像素。纯文字整行点击立即改变 Switch 状态恢复动作一次将该开关与计数器共同还原随后强制结束并重新进入直播间仍保持——事务一次性提交与跨进程持久化同时得到验证。前两轮脚本迭代分别记录于...T200328381与...T200559315第一轮只因页面标题断言使用了较短别名第二轮只因计数器解析先匹配到标题节点两轮settingsFileRestoredExactlytrue、appStoppedtrue说明产品行为本身无回归仅是证据解析口径问题。修正证据解析后第三轮完整通过。脚本本身的工程约束也值得借鉴见 tool/android_danmaku_template_settings_smoke.ps1强制绑定-s $Serial与Get-Identity校验设备型号/设备名/root 身份杜绝选错设备Save-UiState用uiautomator dump --compressed落 XML、screencap落 PNG逐阶段留存证据Find-LabeledNode按文本/content-desc候选、控件 class、clickable/checkable 多条件定位节点直接消费本次修复的具名语义每轮先停止 Pure Live 再复制规范 Hive结束时按原 UID/GID/mode 写回并restorecon保证设备环境可复原。设备与清理边界每轮实际命令均绑定-s 192.168.1.2:5555身份再次确认为25102RKBEC / myronsu -c id为uid0(root)设备同时出现固定 IP 和 mDNS 两条 transport测试始终使用明确固定 IP不按列表顺序选择全部原生操作通过tool/run_android_device_test_turn.ps1 -NoRotation取得设备轮次未重启手机/adbd、未更改 Wi-Fi/ADB 端口/调试授权、未执行adb kill-server也未更新 Root/LSP/模块每轮先停止 Pure Live 再复制规范 Hive结束时按原 UID/GID/mode 写回并restorecon原始/恢复 SHA-256 均为701C666A664A784F5E466D5274F5A13C015DEAAF893BFBA51801ED989D8EA60C最终stay_on_while_plugged_in0、Pure Live 无进程、前台为com.miui.home/.launcher.Launcher。提交与同步产品修复cc3ab5b2已推送origin/master原生回归脚本9cc76caa已推送origin/master两次均在推送后用git ls-remote origin refs/heads/master核对远端完整 SHA杜绝“本地以为推送成功、远端实际不同”的假闭环。给工程实践者的要点提炼模板类数据一律“先验证、后提交”DanmakuViewingTemplate.tryDecode的失败返回null且零副作用是消除部分提交的最简单可靠模型新增字段用“缺失回退当前值”而非“强制默认值”保证旧模板在 schema 升级后不丢用户既有偏好数值边界必须在解码期与启动期双保险解码期拒绝越界启动/导入期钳制残留脏数据两条路径缺一不可辅助语义是自动化测试的燃料设置名, 格式化值与具名增减动作让 uiautomator 脚本可以按语义定位与操作而不是靠像素坐标同签名覆盖安装 Hive 哈希核对是“不破坏用户数据”的验收底线而“固定 IP 而非按列表选设备”是多人多设备环境的纪律。更多关联材料可继续阅读 DANMAKU_RENDERING_CONSISTENCY_AUDIT_2026_09_12.md渲染一致性审计与 SHIELD_MANAGEMENT_AUDIT_2026_09_09.md屏蔽管理审计以获取主弹幕渲染与过滤链路的完整视图。赞分享音视频直播移动开发【免费下载链接】pure_live纯粹直播:哔哩哔哩/虎牙/斗鱼/快手/抖音/网易cc/YY直播/Twitch直播/SOOP直播/M38自定义源应有尽有。项目地址https://gitcode.com/gh_mirrors/pur/pure_live点击查看免费下载相关推荐CANN ops-nn Sigmoid 算子实战指南aclnn 两段式接口调用、图模式构图与内核实现剖析CANN ops nn Sigmoid 算子实战指南aclnn 两段式接口调用、图模式构图与内核实现剖析 本文是 CANN 神经网络算子库 ops nn 中音视频直播移动开发Pure Live 小窗弹幕设置页原生审计基于 ADB 语义化路由与重启持久化的自动化验收实践Pure Live 小窗弹幕设置页原生审计基于 ADB 语义化路由与重启持久化的自动化验收实践 导读 本文以 Pure Live com.mystyle.p音视频直播移动开发pi-web 工作区终端深度解析PTY 生命周期、SSE 传输与 node-pty 原生模块管理pi web 工作区终端深度解析PTY 生命周期、SSE 传输与 node pty 原生模块管理 工作区终端Workspace Terminals是 pi音视频直播移动开发上一篇Trianglify代码重构案例提升可维护性的重构策略下一篇Shannon支持的10种常见Web漏洞类型及检测方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表