LGPL库引入后导致app整体处于全面重适配状态,将会处于长期不可用状态
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="清听"
|
||||
android:usesCleartextTraffic="true"
|
||||
android:foregroundServiceType="mediaPlayback">
|
||||
android:foregroundServiceType="mediaPlayback"
|
||||
android:extractNativeLibs="true"> <!-- ⭐ 强制提取 .so,避免压缩后加载失败 -->
|
||||
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
@@ -53,7 +54,7 @@
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<!-- FileProvider for artwork -->
|
||||
<!-- FileProvider for artwork(已配置,保持不变) -->
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.fileprovider"
|
||||
|
||||
Binary file not shown.
+33
-7
@@ -28,6 +28,7 @@ void main() async {
|
||||
debugPrint('⏱️ main 已初始化,跳过重复执行');
|
||||
return;
|
||||
}
|
||||
|
||||
_appInitialized = true;
|
||||
|
||||
stopwatch.start();
|
||||
@@ -36,18 +37,36 @@ void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
debugPrint('⏱️ T0.5 ensureInitialized: ${stopwatch.elapsedMilliseconds}ms');
|
||||
|
||||
debugPrint('⏱️ T0.55 before MediaKit.ensureInitialized');
|
||||
|
||||
try {
|
||||
MediaKit.ensureInitialized();
|
||||
debugPrint('⏱️ T0.6 MediaKit 初始化完成');
|
||||
} catch (e) {
|
||||
debugPrint('❌ MediaKit 初始化失败: $e');
|
||||
debugPrint('⏱️ T0.6 MediaKit.ensureInitialized returned');
|
||||
} catch (e, st) {
|
||||
debugPrint('❌ MediaKit.ensureInitialized failed: $e');
|
||||
debugPrint('$st');
|
||||
rethrow;
|
||||
}
|
||||
|
||||
debugPrint('⏱️ T0.61 before AudioPlayerHandler');
|
||||
|
||||
try {
|
||||
_audioHandler = AudioPlayerHandler();
|
||||
debugPrint('⏱️ T0.62 AudioPlayerHandler created');
|
||||
} catch (e, st) {
|
||||
debugPrint('❌ AudioPlayerHandler failed: $e');
|
||||
debugPrint('$st');
|
||||
rethrow;
|
||||
}
|
||||
|
||||
debugPrint('⏱️ T0.63 before setOnSongChanged');
|
||||
|
||||
AudioService().setOnSongChanged((song) {
|
||||
debugPrint(
|
||||
'📢 [main] song.artwork is ${song.artwork != null ? 'not null' : 'null'}');
|
||||
'📢 [main] song.artwork is '
|
||||
'${song.artwork != null ? 'not null' : 'null'}',
|
||||
);
|
||||
|
||||
_audioHandler!.updateNotification(
|
||||
id: song.id,
|
||||
title: song.title,
|
||||
@@ -56,6 +75,8 @@ void main() async {
|
||||
);
|
||||
});
|
||||
|
||||
debugPrint('⏱️ T0.7 before runApp');
|
||||
|
||||
runApp(
|
||||
MultiProvider(
|
||||
providers: [
|
||||
@@ -64,16 +85,21 @@ void main() async {
|
||||
ChangeNotifierProvider<AppLifecycleManager>(
|
||||
create: (_) => lifecycleManager,
|
||||
),
|
||||
Provider<AudioPlayerHandler>(create: (_) => _audioHandler!),
|
||||
Provider<AudioPlayerHandler>(
|
||||
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();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// 状态监听...
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user