build+fix: debug 包独立为 .dev,并修复元数据缓存永远查不到

包名:
- 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 并存安装,单实例自检通过。
This commit is contained in:
2026-10-22 23:47:32 +08:00
parent 87011c7adc
commit 46a9add5cb
8 changed files with 77 additions and 25 deletions
+14 -2
View File
@@ -42,10 +42,22 @@ android {
}
}
// AGP 9 默认关闭 resValue 生成,这里显式打开(debug 需要 "清听 Dev" 的应用名)
buildFeatures {
resValues = true
}
buildTypes {
debug {
// 测试包与正式包并存安装:com.lxh.qingting_player.dev
// 说明:Android 包名每一段必须以字母开头,所以没法直接写 "_dev",
// 这里用 ".dev" 后缀,等价于给 debug 打上 dev 标记。
applicationIdSuffix = ".dev"
resValue("string", "app_name", "清听 Dev")
}
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
// TODO: 上线前换成正式签名(当前沿用 debug keystore)
resValue("string", "app_name", "清听")
signingConfig = signingConfigs.getByName("debug")
}
}
+3 -3
View File
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lxh.qingting_player"> <!-- ⭐ 改这里 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- package 由 build.gradle.kts 的 namespace / applicationId 决定;AGP 9 已忽略这里的 package 属性 -->
<!-- 权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -12,7 +12,7 @@
<application
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:label="清听"
android:label="@string/app_name"
android:usesCleartextTraffic="true"
android:foregroundServiceType="mediaPlayback">
<activity