LGPL库引入后导致app整体处于全面重适配状态,将会处于长期不可用状态
This commit is contained in:
@@ -20,20 +20,42 @@ android {
|
|||||||
versionCode = flutter.versionCode
|
versionCode = flutter.versionCode
|
||||||
versionName = flutter.versionName
|
versionName = flutter.versionName
|
||||||
|
|
||||||
|
// ⭐ 仅打包 arm64-v8a(与你的 jniLibs 目录匹配)
|
||||||
ndk {
|
ndk {
|
||||||
abiFilters.addAll(listOf("arm64-v8a"))
|
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 {
|
buildTypes {
|
||||||
debug {
|
debug {
|
||||||
}
|
}
|
||||||
|
|
||||||
release {
|
release {
|
||||||
signingConfig = signingConfigs.getByName("debug")
|
signingConfig = signingConfigs.getByName("debug")
|
||||||
|
// ⭐ 建议开启混淆时保留某些 native 方法(media_kit 会自动处理)
|
||||||
|
proguardFiles(
|
||||||
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
|
"proguard-rules.pro"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
compilerOptions {
|
compilerOptions {
|
||||||
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
|
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
|
||||||
|
|||||||
@@ -13,7 +13,8 @@
|
|||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="清听"
|
android:label="清听"
|
||||||
android:usesCleartextTraffic="true"
|
android:usesCleartextTraffic="true"
|
||||||
android:foregroundServiceType="mediaPlayback">
|
android:foregroundServiceType="mediaPlayback"
|
||||||
|
android:extractNativeLibs="true"> <!-- ⭐ 强制提取 .so,避免压缩后加载失败 -->
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
@@ -53,7 +54,7 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<!-- FileProvider for artwork -->
|
<!-- FileProvider for artwork(已配置,保持不变) -->
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="${applicationId}.fileprovider"
|
android:authorities="${applicationId}.fileprovider"
|
||||||
|
|||||||
Binary file not shown.
+33
-7
@@ -28,6 +28,7 @@ void main() async {
|
|||||||
debugPrint('⏱️ main 已初始化,跳过重复执行');
|
debugPrint('⏱️ main 已初始化,跳过重复执行');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_appInitialized = true;
|
_appInitialized = true;
|
||||||
|
|
||||||
stopwatch.start();
|
stopwatch.start();
|
||||||
@@ -36,18 +37,36 @@ void main() async {
|
|||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
debugPrint('⏱️ T0.5 ensureInitialized: ${stopwatch.elapsedMilliseconds}ms');
|
debugPrint('⏱️ T0.5 ensureInitialized: ${stopwatch.elapsedMilliseconds}ms');
|
||||||
|
|
||||||
|
debugPrint('⏱️ T0.55 before MediaKit.ensureInitialized');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
MediaKit.ensureInitialized();
|
MediaKit.ensureInitialized();
|
||||||
debugPrint('⏱️ T0.6 MediaKit 初始化完成');
|
debugPrint('⏱️ T0.6 MediaKit.ensureInitialized returned');
|
||||||
} catch (e) {
|
} catch (e, st) {
|
||||||
debugPrint('❌ MediaKit 初始化失败: $e');
|
debugPrint('❌ MediaKit.ensureInitialized failed: $e');
|
||||||
|
debugPrint('$st');
|
||||||
|
rethrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debugPrint('⏱️ T0.61 before AudioPlayerHandler');
|
||||||
|
|
||||||
|
try {
|
||||||
_audioHandler = AudioPlayerHandler();
|
_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) {
|
AudioService().setOnSongChanged((song) {
|
||||||
debugPrint(
|
debugPrint(
|
||||||
'📢 [main] song.artwork is ${song.artwork != null ? 'not null' : 'null'}');
|
'📢 [main] song.artwork is '
|
||||||
|
'${song.artwork != null ? 'not null' : 'null'}',
|
||||||
|
);
|
||||||
|
|
||||||
_audioHandler!.updateNotification(
|
_audioHandler!.updateNotification(
|
||||||
id: song.id,
|
id: song.id,
|
||||||
title: song.title,
|
title: song.title,
|
||||||
@@ -56,6 +75,8 @@ void main() async {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
debugPrint('⏱️ T0.7 before runApp');
|
||||||
|
|
||||||
runApp(
|
runApp(
|
||||||
MultiProvider(
|
MultiProvider(
|
||||||
providers: [
|
providers: [
|
||||||
@@ -64,16 +85,21 @@ void main() async {
|
|||||||
ChangeNotifierProvider<AppLifecycleManager>(
|
ChangeNotifierProvider<AppLifecycleManager>(
|
||||||
create: (_) => lifecycleManager,
|
create: (_) => lifecycleManager,
|
||||||
),
|
),
|
||||||
Provider<AudioPlayerHandler>(create: (_) => _audioHandler!),
|
Provider<AudioPlayerHandler>(
|
||||||
|
create: (_) => _audioHandler!,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
child: const QTPlayerApp(),
|
child: const QTPlayerApp(),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
debugPrint('⏱️ T0.8 runApp 完成: ${stopwatch.elapsedMilliseconds}ms');
|
debugPrint(
|
||||||
|
'⏱️ T0.8 runApp 完成: '
|
||||||
|
'${stopwatch.elapsedMilliseconds}ms',
|
||||||
|
);
|
||||||
|
|
||||||
// ⭐ 首帧后恢复播放状态
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
debugPrint('⏱️ T1 postFrame');
|
||||||
AudioService().restorePlaybackState();
|
AudioService().restorePlaybackState();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,20 +2,31 @@ import 'package:media_kit/media_kit.dart';
|
|||||||
|
|
||||||
class PlayerService {
|
class PlayerService {
|
||||||
static final PlayerService _instance = PlayerService._internal();
|
static final PlayerService _instance = PlayerService._internal();
|
||||||
|
|
||||||
factory PlayerService() => _instance;
|
factory PlayerService() => _instance;
|
||||||
|
|
||||||
PlayerService._internal();
|
PlayerService._internal();
|
||||||
|
|
||||||
final Player _player = Player();
|
Player? _player;
|
||||||
|
|
||||||
void play(String url) {
|
Player get player {
|
||||||
_player.open(Media(url));
|
return _player ??= Player();
|
||||||
}
|
}
|
||||||
|
|
||||||
void pause() => _player.pause();
|
void play(String url) {
|
||||||
void resume() => _player.play();
|
player.open(Media(url));
|
||||||
void stop() => _player.stop();
|
}
|
||||||
|
|
||||||
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:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
media_kit: ^1.1.10
|
media_kit: ^1.2.6
|
||||||
#media_kit_libs_audio: ^1.0.7
|
#media_kit_libs_audio: ^1.0.7
|
||||||
shared_preferences: 2.2.2
|
shared_preferences: 2.2.2
|
||||||
provider: ^6.1.2
|
provider: ^6.1.2
|
||||||
|
|||||||
Reference in New Issue
Block a user