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