diff --git a/analysis_options.yaml b/analysis_options.yaml index 0d29021..5671d4c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -7,6 +7,10 @@ # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. +analyzer: + exclude: + - build/** + - android/** include: package:flutter_lints/flutter.yaml linter: diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 9bd1a3c..5e4f79a 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -20,25 +20,31 @@ android { versionCode = flutter.versionCode versionName = flutter.versionName - // ⭐ 仅打包 arm64-v8a(与你的 jniLibs 目录匹配) + // 仅打包 arm64-v8a ndk { abiFilters.addAll(listOf("arm64-v8a")) } } - // ⭐ 显式指定 jniLibs 源目录(确保 .so 文件被包含) + // 显式指定 jniLibs 源目录 sourceSets { getByName("main") { jniLibs.srcDirs("src/main/jniLibs") } } - // ⭐ 关键:打包配置,确保 .so 不被压缩,且处理重复 + tasks.withType { + if (name.startsWith("merge") && name.endsWith("JniLibFolders")) { + from("src/main/jniLibs") + into("$buildDir/intermediates/merged_jni_libs/debug/out") + } + } + // 打包配置 packagingOptions { jniLibs { - useLegacyPackaging = true // 兼容 Android 7.0+ + useLegacyPackaging = true } - pickFirsts += "**/*.so" // 如有重复则选第一个 + pickFirsts += "**/*.so" } buildTypes { @@ -47,7 +53,6 @@ android { release { signingConfig = signingConfigs.getByName("debug") - // ⭐ 建议开启混淆时保留某些 native 方法(media_kit 会自动处理) proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/android/app/src/main/jniLibs/arm64-v8a/libavcodec.so b/android/app/src/main/jniLibs/arm64-v8a/libavcodec.so index 4c2c6e8..180ec2c 100644 Binary files a/android/app/src/main/jniLibs/arm64-v8a/libavcodec.so and b/android/app/src/main/jniLibs/arm64-v8a/libavcodec.so differ diff --git a/android/app/src/main/jniLibs/arm64-v8a/libavdevice.so b/android/app/src/main/jniLibs/arm64-v8a/libavdevice.so index dd81279..5f7cc6b 100644 Binary files a/android/app/src/main/jniLibs/arm64-v8a/libavdevice.so and b/android/app/src/main/jniLibs/arm64-v8a/libavdevice.so differ diff --git a/android/app/src/main/jniLibs/arm64-v8a/libavfilter.so b/android/app/src/main/jniLibs/arm64-v8a/libavfilter.so index 612cd6f..44bc583 100644 Binary files a/android/app/src/main/jniLibs/arm64-v8a/libavfilter.so and b/android/app/src/main/jniLibs/arm64-v8a/libavfilter.so differ diff --git a/android/app/src/main/jniLibs/arm64-v8a/libavformat.so b/android/app/src/main/jniLibs/arm64-v8a/libavformat.so index 71dd15d..333e790 100644 Binary files a/android/app/src/main/jniLibs/arm64-v8a/libavformat.so and b/android/app/src/main/jniLibs/arm64-v8a/libavformat.so differ diff --git a/android/app/src/main/jniLibs/arm64-v8a/libavutil.so b/android/app/src/main/jniLibs/arm64-v8a/libavutil.so index 0349904..bb8244e 100644 Binary files a/android/app/src/main/jniLibs/arm64-v8a/libavutil.so and b/android/app/src/main/jniLibs/arm64-v8a/libavutil.so differ diff --git a/android/app/src/main/jniLibs/arm64-v8a/libmediakitandroidhelper.so b/android/app/src/main/jniLibs/arm64-v8a/libmediakitandroidhelper.so deleted file mode 100644 index eda5b29..0000000 Binary files a/android/app/src/main/jniLibs/arm64-v8a/libmediakitandroidhelper.so and /dev/null differ diff --git a/android/app/src/main/jniLibs/arm64-v8a/libmpv.so b/android/app/src/main/jniLibs/arm64-v8a/libmpv.so index f2a50d3..71841d9 100644 Binary files a/android/app/src/main/jniLibs/arm64-v8a/libmpv.so and b/android/app/src/main/jniLibs/arm64-v8a/libmpv.so differ diff --git a/android/app/src/main/jniLibs/arm64-v8a/libplayer.so b/android/app/src/main/jniLibs/arm64-v8a/libplayer.so new file mode 100644 index 0000000..fc94331 Binary files /dev/null and b/android/app/src/main/jniLibs/arm64-v8a/libplayer.so differ diff --git a/android/app/src/main/jniLibs/arm64-v8a/libswresample.so b/android/app/src/main/jniLibs/arm64-v8a/libswresample.so index b4d40e0..b14d114 100644 Binary files a/android/app/src/main/jniLibs/arm64-v8a/libswresample.so and b/android/app/src/main/jniLibs/arm64-v8a/libswresample.so differ diff --git a/android/app/src/main/jniLibs/arm64-v8a/libswscale.so b/android/app/src/main/jniLibs/arm64-v8a/libswscale.so index 4fdfa8b..238306d 100644 Binary files a/android/app/src/main/jniLibs/arm64-v8a/libswscale.so and b/android/app/src/main/jniLibs/arm64-v8a/libswscale.so differ diff --git a/android/app/src/main/kotlin/com/example/qt_player/MainActivity.kt b/android/app/src/main/kotlin/com/example/qt_player/MainActivity.kt index 1183b2b..46f9e55 100644 --- a/android/app/src/main/kotlin/com/example/qt_player/MainActivity.kt +++ b/android/app/src/main/kotlin/com/example/qt_player/MainActivity.kt @@ -4,17 +4,41 @@ import android.os.Build import android.os.Bundle import android.util.Log import androidx.core.content.FileProvider -import com.ryanheise.audioservice.AudioServiceActivity +import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel import java.io.File -class MainActivity : AudioServiceActivity() { +class MainActivity : FlutterActivity() { private val CHANNEL = "com.lxh.qingting_player/file_provider" + override fun onCreate(savedInstanceState: Bundle?) { + // ⭐ 强制加载 libmediakitandroidhelper.so,触发 JNI_OnLoad,缓存 JavaVM + try { + System.loadLibrary("mediakitandroidhelper") + Log.d("MainActivity", "✅ libmediakitandroidhelper loaded") + } catch (e: UnsatisfiedLinkError) { + Log.e("MainActivity", "❌ libmediakitandroidhelper load failed", e) + } + + // ⭐ 可选:预加载 libmpv.so(让系统 linker 也可见,增强兼容性) + try { + System.loadLibrary("mpv") + Log.d("MainActivity", "✅ libmpv loaded") + } catch (e: UnsatisfiedLinkError) { + Log.e("MainActivity", "❌ libmpv load failed", e) + } + + super.onCreate(savedInstanceState) + + setHighRefreshRate() + } + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) + + // FileProvider MethodChannel for sharing artwork via content:// URI MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL) .setMethodCallHandler { call, result -> if (call.method == "getContentUri") { @@ -46,20 +70,6 @@ class MainActivity : AudioServiceActivity() { } } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - // 🔥 测试 libmpv.so 能否被系统加载 - try { - System.loadLibrary("mpv") - Log.e("MPV_TEST", "🔥 libmpv LOAD SUCCESS") - } catch (e: Throwable) { - Log.e("MPV_TEST", "🔥 libmpv LOAD FAILED", e) - } - - setHighRefreshRate() - } - override fun onResume() { super.onResume() setHighRefreshRate() @@ -77,17 +87,4 @@ class MainActivity : AudioServiceActivity() { Log.e("QTPlayer", "设置高刷失败: ${e.message}") } } - - private fun clearRefreshRate() { - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - val params = window.attributes - params.preferredRefreshRate = 0f - window.attributes = params - Log.d("QTPlayer", "恢复默认刷新率") - } - } catch (e: Exception) { - Log.e("QTPlayer", "恢复默认刷新率失败: ${e.message}") - } - } } \ No newline at end of file diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 5915089..950c9a5 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -20,7 +20,7 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" id("com.android.application") version "9.0.1" apply false - id("org.jetbrains.kotlin.android") version "1.9.0" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false } include(":app") diff --git a/lib/widgets/global_mini_player.dart b/lib/widgets/global_mini_player.dart index a1622c5..14a1383 100644 --- a/lib/widgets/global_mini_player.dart +++ b/lib/widgets/global_mini_player.dart @@ -46,7 +46,8 @@ class GlobalMiniPlayer extends StatelessWidget { child: InkWell( onTap: () { // ⭐ 使用 Navigator.of(context) 替代 navigatorKey - Navigator.of(context).pushNamed('/player'); + Navigator.of(context, rootNavigator: true) + .pushNamed('/player'); }, // ⭐ 替换弃用的 withOpacity 为 withValues highlightColor: Colors.white.withValues(alpha: 0.05), diff --git a/pubspec.lock b/pubspec.lock index 722f886..e46fe66 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -332,10 +332,10 @@ packages: dependency: transitive description: name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + sha256: "31bd099b47c10cd1aeb55146a2d46ce0277630ecef3f7dae54ad7873f36696cd" url: "https://pub.flutter-io.cn" source: hosted - version: "0.12.19" + version: "0.12.20" material_color_utilities: dependency: transitive description: @@ -353,21 +353,61 @@ packages: source: hosted version: "1.2.6" media_kit_libs_android_audio: - dependency: "direct main" + dependency: transitive description: name: media_kit_libs_android_audio sha256: "8f8f9759e537e12d66f08bc4d5279eb1bb21a0ccc519ff3442c68a9f3b6dd68b" url: "https://pub.flutter-io.cn" source: hosted version: "1.3.8" + media_kit_libs_audio: + dependency: "direct main" + description: + name: media_kit_libs_audio + sha256: "81bf506c234e81e3ec536ba72f8f700a928543c14c345220210cae0411636316" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.7" + media_kit_libs_ios_audio: + dependency: transitive + description: + name: media_kit_libs_ios_audio + sha256: "78ccf04e27d6b4ba00a355578ccb39b772f00d48269a6ac3db076edf2d51934f" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.4" + media_kit_libs_linux: + dependency: transitive + description: + name: media_kit_libs_linux + sha256: "2b473399a49ec94452c4d4ae51cfc0f6585074398d74216092bf3d54aac37ecf" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.2.1" + media_kit_libs_macos_audio: + dependency: transitive + description: + name: media_kit_libs_macos_audio + sha256: "3be21844df98f286de32808592835073cdef2c1a10078bac135da790badca950" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.4" + media_kit_libs_windows_audio: + dependency: transitive + description: + name: media_kit_libs_windows_audio + sha256: c2fd558cc87b9d89a801141fcdffe02e338a3b21a41a18fbd63d5b221a1b8e53 + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.9" meta: dependency: transitive description: name: meta - sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" + sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9" url: "https://pub.flutter-io.cn" source: hosted - version: "1.18.0" + version: "1.19.0" mime: dependency: transitive description: @@ -729,10 +769,10 @@ packages: dependency: transitive description: name: test_api - sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" + sha256: "2a122cbe059f8b610d3a5415f42e255b6c17b1f21eee1d960f31080237fb4f11" url: "https://pub.flutter-io.cn" source: hosted - version: "0.7.11" + version: "0.7.12" typed_data: dependency: transitive description: @@ -769,10 +809,10 @@ packages: dependency: transitive description: name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + sha256: f36f9f3be64c6198714492bb455c11056e33e2f85d9a0b676a48301e44fdcf47 url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.0" + version: "2.4.2" vm_service: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ef74daa..763f814 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,7 +31,8 @@ dependencies: flutter: sdk: flutter media_kit: 1.2.6 - media_kit_libs_android_audio: 1.3.8 + media_kit_libs_audio: ^1.0.7 + #media_kit_libs_android_audio: 1.3.8 shared_preferences: 2.2.2 provider: ^6.1.2 dio: ^5.4.0 # HTTP 客户端