diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 4f9cc66..9bd1a3c 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -20,20 +20,42 @@ android { versionCode = flutter.versionCode versionName = flutter.versionName + // ⭐ 仅打包 arm64-v8a(与你的 jniLibs 目录匹配) ndk { abiFilters.addAll(listOf("arm64-v8a")) } } + // ⭐ 显式指定 jniLibs 源目录(确保 .so 文件被包含) + sourceSets { + getByName("main") { + jniLibs.srcDirs("src/main/jniLibs") + } + } + + // ⭐ 关键:打包配置,确保 .so 不被压缩,且处理重复 + packagingOptions { + jniLibs { + useLegacyPackaging = true // 兼容 Android 7.0+ + } + pickFirsts += "**/*.so" // 如有重复则选第一个 + } + buildTypes { debug { } release { signingConfig = signingConfigs.getByName("debug") + // ⭐ 建议开启混淆时保留某些 native 方法(media_kit 会自动处理) + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) } } } + kotlin { compilerOptions { jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1abda98..6606210 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,8 @@ android:icon="@mipmap/ic_launcher" android:label="清听" android:usesCleartextTraffic="true" - android:foregroundServiceType="mediaPlayback"> + android:foregroundServiceType="mediaPlayback" + android:extractNativeLibs="true"> - + ( create: (_) => lifecycleManager, ), - Provider(create: (_) => _audioHandler!), + Provider( + create: (_) => _audioHandler!, + ), ], child: const QTPlayerApp(), ), ); - debugPrint('⏱️ T0.8 runApp 完成: ${stopwatch.elapsedMilliseconds}ms'); + debugPrint( + '⏱️ T0.8 runApp 完成: ' + '${stopwatch.elapsedMilliseconds}ms', + ); - // ⭐ 首帧后恢复播放状态 WidgetsBinding.instance.addPostFrameCallback((_) { + debugPrint('⏱️ T1 postFrame'); AudioService().restorePlaybackState(); }); } diff --git a/lib/services/player_service.dart b/lib/services/player_service.dart index 5363aa9..b4c77ee 100644 --- a/lib/services/player_service.dart +++ b/lib/services/player_service.dart @@ -2,20 +2,31 @@ import 'package:media_kit/media_kit.dart'; class PlayerService { static final PlayerService _instance = PlayerService._internal(); + factory PlayerService() => _instance; + PlayerService._internal(); - final Player _player = Player(); + Player? _player; - void play(String url) { - _player.open(Media(url)); + Player get player { + return _player ??= Player(); } - void pause() => _player.pause(); - void resume() => _player.play(); - void stop() => _player.stop(); + void play(String url) { + player.open(Media(url)); + } - void dispose() => _player.dispose(); + void pause() => player.pause(); + + void resume() => player.play(); + + void stop() => player.stop(); + + void dispose() { + _player?.dispose(); + _player = null; + } // 状态监听... } diff --git a/pubspec.yaml b/pubspec.yaml index 0b617a0..1686d5b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,7 +30,7 @@ environment: dependencies: flutter: sdk: flutter - media_kit: ^1.1.10 + media_kit: ^1.2.6 #media_kit_libs_audio: ^1.0.7 shared_preferences: 2.2.2 provider: ^6.1.2