1import MusicQueue from '@/core/musicQueue'; 2import MusicSheet from '@/core/musicSheet'; 3import {check, PERMISSIONS, request} from 'react-native-permissions'; 4import TrackPlayer, {Capability} from 'react-native-track-player'; 5import 'react-native-get-random-values'; 6import Config from '@/core/config'; 7import RNBootSplash from 'react-native-bootsplash'; 8import Download from '@/core/download'; 9import pathConst from '@/constants/pathConst'; 10import {checkAndCreateDir} from '@/utils/fileUtils'; 11import {errorLog, trace} from '@/utils/log'; 12import MediaMeta from '@/core/mediaMeta'; 13import Cache from '@/core/cache'; 14import PluginManager from '@/core/pluginManager'; 15import Network from '@/core/network'; 16import {ImgAsset} from '@/constants/assetsConst'; 17 18/** app加载前执行 19 * 1. 检查权限 20 * 2. 数据初始化 21 * 3. 22 */ 23async function _bootstrap() { 24 // 1. 检查权限 25 const [readStoragePermission, writeStoragePermission] = await Promise.all([ 26 check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE), 27 check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE), 28 ]); 29 if ( 30 !( 31 readStoragePermission === 'granted' && 32 writeStoragePermission === 'granted' 33 ) 34 ) { 35 await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE); 36 await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); 37 } 38 39 // 2. 数据初始化 40 /** 初始化路径 */ 41 await setupFolder(); 42 trace('文件夹初始化完成'); 43 // 加载配置 44 await Promise.all([ 45 Config.setup(), 46 MediaMeta.setup(), 47 MusicSheet.setup(), 48 Network.setup(), 49 ]); 50 trace('配置初始化完成'); 51 // 加载插件 52 try { 53 await TrackPlayer.setupPlayer({ 54 maxCacheSize: 55 Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512, 56 }); 57 } catch (e: any) { 58 if ( 59 e?.message !== 60 'The player has already been initialized via setupPlayer.' 61 ) { 62 throw e; 63 } 64 } 65 await TrackPlayer.updateOptions({ 66 icon: ImgAsset.logo, 67 progressUpdateEventInterval: 1, 68 alwaysPauseOnInterruption: true, 69 capabilities: [ 70 Capability.Play, 71 Capability.Pause, 72 Capability.SkipToNext, 73 Capability.SkipToPrevious, 74 ], 75 compactCapabilities: [ 76 Capability.Play, 77 Capability.Pause, 78 Capability.SkipToNext, 79 Capability.SkipToPrevious, 80 ], 81 notificationCapabilities: [ 82 Capability.Play, 83 Capability.Pause, 84 Capability.SkipToNext, 85 Capability.SkipToPrevious, 86 ], 87 }); 88 trace('播放器初始化完成'); 89 await Cache.setup(); 90 trace('缓存初始化完成'); 91 await Download.setup(); 92 trace('下载初始化完成'); 93 await PluginManager.setup(); 94 trace('插件初始化完成'); 95 await MusicQueue.setup(); 96 trace('播放列表初始化完成'); 97 98 ErrorUtils.setGlobalHandler(error => { 99 errorLog('未捕获的错误', error); 100 }); 101} 102 103/** 初始化 */ 104async function setupFolder() { 105 await Promise.all([ 106 checkAndCreateDir(pathConst.dataPath), 107 checkAndCreateDir(pathConst.logPath), 108 checkAndCreateDir(pathConst.cachePath), 109 checkAndCreateDir(pathConst.pluginPath), 110 checkAndCreateDir(pathConst.lrcCachePath), 111 ]); 112} 113 114export default async function () { 115 try { 116 await _bootstrap(); 117 } catch (e) { 118 errorLog('初始化出错', e); 119 console.log(e); 120 } 121 // 隐藏开屏动画 122 console.log('HIDE'); 123 RNBootSplash.hide({fade: true}); 124} 125