包名: - debug 使用 com.lxh.qingting_player.dev(应用名"清听 Dev"),可与 release 并存 - release 保持 com.lxh.qingting_player - Android 包名每一段必须以字母开头,因此用 .dev 而非 _dev - AGP 9 需显式开启 buildFeatures.resValues;移除 manifest 中已废弃的 package 属性 元数据(两个独立原因叠加): 1. song_key 之前用 String.hashCode / 本地临时文件 mtime,都不稳定; 2. songs.remote_path 存的是完整 URL,而所有查询都用相对路径(song.id), getSongByPath 永远 miss,UI 只能回退到文件名。 - 新增 utils/song_key.dart:songKeyFor(url,size)=md5(url|size),跨进程稳定 - metadata_service: remote_path 改存 fileId(相对路径),并改用稳定 song_key - audio_service / file_provider: 同步使用稳定键 - 数据库升级 v5:清空 songs / metadata_cache(可再生缓存;歌单与收藏按路径存储,不受影响) - device-check.ps1: 支持 -Package,默认校验 dev 包,启动组件改为向 PackageManager 解析 验证:两次独立 dart 进程 song_key 输出一致;真机 debug/release 并存安装,单实例自检通过。
23 lines
1008 B
Dart
23 lines
1008 B
Dart
// lib/utils/song_key.dart
|
|
import 'dart:convert';
|
|
import 'package:crypto/crypto.dart';
|
|
|
|
/// 歌曲缓存键(song_key)。
|
|
///
|
|
/// 只使用「远程路径 + 文件大小」这类稳定信息:
|
|
/// - 不能用 String.hashCode:语义上不保证跨运行稳定(虽然当前 VM 实现是稳定的),
|
|
/// 用它做持久化键属于依赖未定义行为;
|
|
/// - 不能用本地临时文件的 mtime:WebDAV 的元数据预览文件会被系统清缓存、
|
|
/// 或超过 24h 后重新下载,mtime 每次都变,键跟着变 → 缓存永远 miss。
|
|
///
|
|
/// 因此这里用 md5(url|size)。文件被替换但大小不变时不会自动失效,
|
|
/// 由“清除单曲缓存 / forceRefresh”兜底。
|
|
String songKeyFor(String url, int fileSize) {
|
|
return md5.convert(utf8.encode('$url|$fileSize')).toString();
|
|
}
|
|
|
|
/// 只依赖 URL 的稳定键,用于临时文件命名、拿不到 stat 的场景。
|
|
String songKeyForUrl(String url) {
|
|
return md5.convert(utf8.encode(url)).toString();
|
|
}
|