やあ!
React Native を使用している場合は、エミュレータの問題に遭遇したことがあるでしょう。 React Native コマンドを実行しても、エミュレーターが検出されません。 .zshrc、.bash_profile、または同様のファイルに必要な環境変数をすべて設定した後でも、まだ機能しません。
一般的な問題と修正は次のとおりです:
エミュレータが見つかりません: これは、Android SDK パスが正しく設定されていない場合に発生する可能性があります。 ANDROID_HOME および PATH 環境変数が正しいディレクトリを指していることを再確認してください。次の行を .zshrc または .bash_profile に追加できます:
export ANDROID_HOME=$HOME/Library/Android/sdk export PATH=$PATH:$ANDROID_HOME/emulator export PATH=$PATH:$ANDROID_HOME/tools export PATH=$PATH:$ANDROID_HOME/tools/bin export PATH=$PATH:$ANDROID_HOME/platform-tools
これらの変更を加えた後、ターミナルを再起動するか、source ~/.zshrc (またはsource ~/.bash_profile) を実行します。
Watchman エラー: Facebook のファイル監視サービスである Watchman は、古いファイル キャッシュに関する問題を引き起こす場合があります。これを修正するには、
を実行します。
watchman watch-del-all
次に、React Native サーバーを再起動します。
adb reverse to Connect to localhost: アプリが Android エミュレータ内からローカルホストに接続できない場合は、次のコマンドを実行する必要がある場合があります:
adb reverse tcp:8081 tcp:8081
このコマンドは、エミュレータからローカル マシンにトラフィックをルーティングします。端末から adb にアクセスできることを確認してください。
キャッシュをクリアして再ビルド: それでも問題が解決しない場合は、キャッシュをクリアしてプロジェクトを再ビルドしてみてください:
npm start -- --reset-cache cd android && ./gradlew clean cd ios && xcodebuild clean
その後、React Native アプリを再度実行します。
react-native run-android または run-ios を直接使用する: エミュレータが IDE またはターミナルから正しく起動しない場合は、次のようにしてアプリを直接実行してみてください:
npx react-native run-android npx react-native run-ios
これらの問題のデバッグはイライラするかもしれませんが、これらの手順は多くの一般的な問題を解決するのに役立ちました。
使いやすいスクリプトも作成しました
const {spawn, exec} = require('child_process'); const path = require('path'); // Define paths const projectPath = path.resolve(); // Define commands const watchDelCommand = `watchman watch-del '${projectPath}'`; const watchProjectCommand = `watchman watch-project '${projectPath}'`; // Function to execute commands const clearWatchman = () => { // Execute watch-del command exec(watchDelCommand, (error, stdout, stderr) => { if (error) { console.error(`Error executing watch-del command: ${error.message}`); return; } if (stderr) { console.error(`stderr: ${stderr}`); return; } console.log(`watch-del command executed successfully: ${stdout}`); // Execute watch-project command exec(watchProjectCommand, (error, stdout, stderr) => { if (error) { console.error( `Error executing watch-project command: ${error.message}`, ); return; } if (stderr) { console.error(`stderr: ${stderr}`); return; } console.log(`watch-project command executed successfully: ${stdout}`); }); }); }; async function reverseAdb() { console.log('Running... adb reverse tcp:8080 tcp:8080'); // After the emulator has started adb reverse tcp:8080 tcp:8080 const adbReverse = spawn('adb', ['reverse', 'tcp:8080', 'tcp:8080']); await new Promise((resolve, reject) => { let output = ''; adbReverse.stdout.on('data', data => { output = data.toString(); }); adbReverse.on('close', () => { resolve(); }); adbReverse.stderr.on('error', reject); }).catch(error => console.error('Error reversing ADB port to 8080:', error)); } async function runEmulator() { try { clearWatchman(); // Check for running emulator const adbDevices = spawn('adb', ['devices']); const devices = await new Promise((resolve, reject) => { let output = ''; adbDevices.stdout.on('data', data => { output = data.toString(); }); adbDevices.on('close', () => { resolve(output.includes('emulator')); }); adbDevices.stderr.on('error', reject); }); if (devices) { console.log('Emulator is already running'); reverseAdb(); return; } // Get list of available emulators const emulatorList = spawn('emulator', ['-list-avds']); const emulatorName = await new Promise((resolve, reject) => { let output = ''; emulatorList.stdout.on('data', data => { output = data.toString(); }); emulatorList.on('close', () => { const lines = output.split('\n').filter(Boolean); // Filter out empty lines if (lines.length === 0) { reject(new Error('No AVDs found')); } else { resolve(lines[lines.length - 1]); // Get the last non-empty line } }); emulatorList.stderr.on('error', reject); }); // Start the emulator in detached mode const emulatorProcess = spawn('emulator', ['-avd', emulatorName], { detached: true, stdio: 'ignore', }); emulatorProcess.unref(); // Allow the parent process to exit independently of the child reverseAdb(); console.log(`Starting emulator: ${emulatorName}`); } catch (error) { console.error('Error running emulator:', error); } } runEmulator(); // package.json "scripts": { ... "dev:android": "yarn android:emulator && npx react-native@latest start", "android:emulator": "node runEmulator.js", ... },
上記のスクリプトを使用すると、エミュレータと React Native を同時に実行できます。
読んでいただきありがとうございます!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3