运行 在 Windows 中直接使用模拟器 运行 在 WSL 中 React Native
Running React Native in WSL with the emulator running directly in Windows
我有一段时间没有进行 Android 开发,所以我对现代 Android 开发的了解参差不齐。
我正在尝试学习 React Native。我使用 WSL 作为我的主要开发环境。由于在 Linux/WSL 中设置 Android 模拟器可能会很痛苦,我想直接在 Windows 上 运行 模拟器。但是,我希望能够在 WSL 中 运行 react-native run-android
。
我如何设置 React Native 才能在 WSL 中 运行 react-native run-android
和 Windows 上的 Android 模拟器中的 运行 应用程序?
我的 ANDROID_HOME
变量应该设置正确,但我对 Android 的了解不够,无法知道这是否在做任何事情:
export ANDROID_HOME=/mnt/c/Users/Leo/AppData/Local/Android/sdk
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/platform-tools
据我所知,由于一些问题,无法在 WSL 中使用 react-native。
例如https://github.com/Microsoft/BashOnWindows/issues/1523
但是,我找到了一种解决方法,它将本机 windows android 构建与 WSL 中的 npm 堆栈相结合。实际上,无论如何,您都需要安装本机 Windows Android Studio/SDK 才能使用 Intellij IDE 和模拟器。诀窍是分离出基于 Gradle 的 Android compile.
工作流程
使用 npm/yarn 在 WSL 中执行的所有项目设置和包管理。在 WSL 中全局安装 react-native-cli。不需要重复的 windows 二进制 node/npm 堆栈。
不要使用 react-native run-android
,而是从 cmd 编译和部署。从项目中的 /android
目录,执行 gradle 包装器 gradlew.bat installDebug
,或者使用创作者更新,您可以从 WSL bash shell 中执行此操作/mnt/c/Windows/System32/cmd.exe /C gradlew.bat installDebug
。不要使用 unix gradlew 脚本。
组装 APK 并将其上传到您的设备或模拟器后,运行 使用命令 react-native start
.
从 WSL 中调试服务器
我已经使用多个本机 Android 组件在一些相当复杂的项目中对此进行了测试。希望这有帮助。
- 注意:为此,您的项目需要位于本机 Windows 文件系统中,即 /mnt/c.
可以设置它,以便模拟器 运行s 在 Windows 中,而 运行ning react-native run-android
在 WSL 中。与@pscl 的方式相比,这样做的好处是这种方式支持自动链接。以下是您需要做的才能使其正常工作。
Windows
Windows 端唯一需要的是安装 Android Studio 并设置模拟器/虚拟设备。这非常简单,所以我不会引导您完成。
Windows Linux
的子系统
设置这方面的事情还有很多,请耐心等待。 (我的 WSL 是 Ubuntu 18.04,这在其他口味上未经测试。)
- 下载并解压缩 Android 命令行工具。 (目前在 Android Studio 下载页面上找到,向下滚动到 "Command line tools only" 和 select Linux 下载选项。)
- 查看解压后的文件夹,将名为
tools
的目录移动到 ~/Android/Sdk/tools
。 (如果 ~/Android/Sdk
目录不存在,请创建它们。)
- 下载并解压JDK 8。(我推荐从AdoptOpenJDK下载。另外,一定要安装OpenJDK 8,否则
sdkmanager
将无法运行,我们稍后会用到。)
- 将解压后的文件夹移动到
/opt/jdk8u222-b10
。 (实际上你可以把它放在任何你想要的地方,只要确保 JAVA_HOME
环境变量指向这个解压缩的文件夹。)
- 在
~/.bashrc
文件中设置以下环境变量。 (路径可能因您而异!)
export ANDROID_HOME=/home/your-name/Android/Sdk
export JAVA_HOME=/opt/jdk8u222-b10
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
- 重新启动您的 bash 终端并执行命令
sdkmanager "platform-tools"
下载最新的平台工具。 (adb
工具来自这里。)
React Native
一切就绪,是时候开始玩了!
- 在Windows中启动模拟器。
- 在 WSL 和 运行
react-native start
中打开您的项目目录。 (保持此终端打开)。
- 在另一个 WSL 终端中打开您的项目目录,然后 运行
react-native run-android
。 (你第一次 运行 这个,React Native 会根据你的虚拟设备下载一些其他的 SDK。你可以通过 运行ning sdkmanager --list
查看所有已安装的 SDK。见 docs for sdkmanager了解更多信息。)
运行在设备上
这是关于如何将应用程序安装到物理设备的快速说明。这里的技巧是确保您的两个 adb
可执行文件都在同一版本上。 (他们应该是因为我们通过 sdkmanager
安装了它。)
C:\Users\your-name\AppData\Local\Android\Sdk\platform-tools\adb.exe version
/home/your-name/Android/Sdk/platform-tools/adb version
一旦您确认它们是同一版本,请确保您从 windows 可执行文件 (运行 adb.exe kill-server && adb.exe start-server
) 启动 adb 服务器。然后您可以通过 运行ning adb devices
在 WSL 中测试它是否有效,您应该会看到您的设备已插入。
对于那些努力制作 Windows 10 Android Studio work with WSL2 located react-native project.
初始设置
您需要在 Windows 10 Android Studio 上安装。
设置用户变量:
ANDROID_HOME=C:\Users\<YOUR_USER>\AppData\Local\Android\Sdk
加入系统变量PATH:
%ANDROID_HOME%\emulator
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools
%ANDROID_HOME%\cmdline-tools\latest (I'm not sure if this one is necessary)
然后转到您的 WSL2 并安装:
sudo apt-get install unzip
- 获取 android studio Command Line Tools Only 并将其解压到 /home//Android
- 安装 jdk 8 和
sudo apt-get install openjdk-8-jdk
- 将此添加到您的 .bashrc:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
export PATH=$PATH:$JAVA_HOME/bin
export ADB_SERVER_SOCKET=tcp:<YOUR_WSL_IP_ADDRESS_FROM_POWERSHELL>:5037 (check your WSL adapter IP by running `ipconfig` in powershell.)
export ANDROID_HOME=$HOME/Android
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
- 重新启动 bash 和 运行
sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools"
- 运行
adb version && adb.exe version
检查版本是否匹配
运行 在模拟器上
- 运行
adb kill-server
(ps) / adb.exe kill-server
(wsl2 bash)
- 运行
adb -a -P 5037 nodaemon server
(ps) / adb.exe -a -P 5037 nodeamon server
(wsl2 bash) - 不要关闭终端window!
- 运行
emulator -avd <YOUR_AVD_NAME>
(ps) / emulator.exe -avd <YOUR_AVD_NAME>
- 不要关闭终端 window!
- 运行
adb kill-server
(WSL2 bash)
- 运行
adb devices
(WSL2 bash) - 你现在应该看到你的模拟设备获取它的 id
- 转到 WSL2 中的 react-native 项目目录,然后 运行
react-native run-android --deviceId=<YOUR_DEVICE_ID>
- 你现在应该都准备好了。
USB 连接设备的流程相同。唯一改变的是,你将启用开发人员 phone 连接到 PC 而不是第 4 步,你应该进入终端 window 并使用 运行ning adb 服务器记录新设备已连接。
注意:
只有在 windows 10 和扩展 PATH 系统变量上定义了环境变量,您才能 运行 PowerShell 中的所有命令都使用不带 .exe
的别名和路径。如果你想使用
来自 WSL2 bash 的所有命令,当您想在 windows 端执行某些操作时,您始终需要添加 .exe
,以便 WSL2 知道它需要
达到 windows 个可执行文件。
steelbrain
来自 here 的回答对我有用:
将以下内容添加到您的 WSL bashrc 或 zshrc:
export WSL_HOST_IP="$(tail -1 /etc/resolv.conf | cut -d' ' -f2)"
export ADB_SERVER_SOCKET=tcp:$WSL_HOST_IP:5037
然后创建一个防火墙条目,创建一个新的“入站”规则。 Select“端口”然后特定 TCP 端口“5037”然后“允许连接”然后检查所有域、私有和 Public 并添加一个名称。添加防火墙条目后,打开其属性,转到范围 -> 远程 IP 地址 -> 添加“172.16.0.0/12”。
现在我们已经了解了 WSL2 VM 并通过防火墙,您必须使用特定参数启动 adb 服务器以使其侦听所有地址(别担心我们只将 WSL2 VM 列入白名单IP 范围,因此没有安全问题)。
创建一个 vbs 脚本,随意命名并将其放入其中
CreateObject("WScript.Shell").Run "%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe kill-server", 0, True
CreateObject("WScript.Shell").Run "%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe -a -P 5037 nodaemon server", 0, True
现在您所要做的就是在每次重新启动时调用一次 vbs 脚本,您的 WSL VM 将连接到您的主机 ADB 实例
(我只是在常规 CMD.exe shell:
中调用了这两个命令
%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe kill-server
%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe -a -P 5037 nodaemon server
我猜他提议 vbs
所以它仍然是 运行,因为如果我把它放在 .bat
文件中,服务器可能会随着 bat 文件一起死掉,haven'我试过)
我有一段时间没有进行 Android 开发,所以我对现代 Android 开发的了解参差不齐。
我正在尝试学习 React Native。我使用 WSL 作为我的主要开发环境。由于在 Linux/WSL 中设置 Android 模拟器可能会很痛苦,我想直接在 Windows 上 运行 模拟器。但是,我希望能够在 WSL 中 运行 react-native run-android
。
我如何设置 React Native 才能在 WSL 中 运行 react-native run-android
和 Windows 上的 Android 模拟器中的 运行 应用程序?
我的 ANDROID_HOME
变量应该设置正确,但我对 Android 的了解不够,无法知道这是否在做任何事情:
export ANDROID_HOME=/mnt/c/Users/Leo/AppData/Local/Android/sdk
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/platform-tools
据我所知,由于一些问题,无法在 WSL 中使用 react-native。
例如https://github.com/Microsoft/BashOnWindows/issues/1523
但是,我找到了一种解决方法,它将本机 windows android 构建与 WSL 中的 npm 堆栈相结合。实际上,无论如何,您都需要安装本机 Windows Android Studio/SDK 才能使用 Intellij IDE 和模拟器。诀窍是分离出基于 Gradle 的 Android compile.
工作流程
使用 npm/yarn 在 WSL 中执行的所有项目设置和包管理。在 WSL 中全局安装 react-native-cli。不需要重复的 windows 二进制 node/npm 堆栈。
不要使用 react-native run-android
,而是从 cmd 编译和部署。从项目中的 /android
目录,执行 gradle 包装器 gradlew.bat installDebug
,或者使用创作者更新,您可以从 WSL bash shell 中执行此操作/mnt/c/Windows/System32/cmd.exe /C gradlew.bat installDebug
。不要使用 unix gradlew 脚本。
组装 APK 并将其上传到您的设备或模拟器后,运行 使用命令 react-native start
.
我已经使用多个本机 Android 组件在一些相当复杂的项目中对此进行了测试。希望这有帮助。
- 注意:为此,您的项目需要位于本机 Windows 文件系统中,即 /mnt/c.
可以设置它,以便模拟器 运行s 在 Windows 中,而 运行ning react-native run-android
在 WSL 中。与@pscl 的方式相比,这样做的好处是这种方式支持自动链接。以下是您需要做的才能使其正常工作。
Windows
Windows 端唯一需要的是安装 Android Studio 并设置模拟器/虚拟设备。这非常简单,所以我不会引导您完成。
Windows Linux
的子系统设置这方面的事情还有很多,请耐心等待。 (我的 WSL 是 Ubuntu 18.04,这在其他口味上未经测试。)
- 下载并解压缩 Android 命令行工具。 (目前在 Android Studio 下载页面上找到,向下滚动到 "Command line tools only" 和 select Linux 下载选项。)
- 查看解压后的文件夹,将名为
tools
的目录移动到~/Android/Sdk/tools
。 (如果~/Android/Sdk
目录不存在,请创建它们。) - 下载并解压JDK 8。(我推荐从AdoptOpenJDK下载。另外,一定要安装OpenJDK 8,否则
sdkmanager
将无法运行,我们稍后会用到。) - 将解压后的文件夹移动到
/opt/jdk8u222-b10
。 (实际上你可以把它放在任何你想要的地方,只要确保JAVA_HOME
环境变量指向这个解压缩的文件夹。) - 在
~/.bashrc
文件中设置以下环境变量。 (路径可能因您而异!)
export ANDROID_HOME=/home/your-name/Android/Sdk
export JAVA_HOME=/opt/jdk8u222-b10
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
- 重新启动您的 bash 终端并执行命令
sdkmanager "platform-tools"
下载最新的平台工具。 (adb
工具来自这里。)
React Native
一切就绪,是时候开始玩了!
- 在Windows中启动模拟器。
- 在 WSL 和 运行
react-native start
中打开您的项目目录。 (保持此终端打开)。 - 在另一个 WSL 终端中打开您的项目目录,然后 运行
react-native run-android
。 (你第一次 运行 这个,React Native 会根据你的虚拟设备下载一些其他的 SDK。你可以通过 运行ningsdkmanager --list
查看所有已安装的 SDK。见 docs for sdkmanager了解更多信息。)
运行在设备上
这是关于如何将应用程序安装到物理设备的快速说明。这里的技巧是确保您的两个 adb
可执行文件都在同一版本上。 (他们应该是因为我们通过 sdkmanager
安装了它。)
C:\Users\your-name\AppData\Local\Android\Sdk\platform-tools\adb.exe version
/home/your-name/Android/Sdk/platform-tools/adb version
一旦您确认它们是同一版本,请确保您从 windows 可执行文件 (运行 adb.exe kill-server && adb.exe start-server
) 启动 adb 服务器。然后您可以通过 运行ning adb devices
在 WSL 中测试它是否有效,您应该会看到您的设备已插入。
对于那些努力制作 Windows 10 Android Studio work with WSL2 located react-native project.
初始设置
您需要在 Windows 10 Android Studio 上安装。
设置用户变量:
ANDROID_HOME=C:\Users\<YOUR_USER>\AppData\Local\Android\Sdk
加入系统变量PATH:
%ANDROID_HOME%\emulator
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools
%ANDROID_HOME%\cmdline-tools\latest (I'm not sure if this one is necessary)
然后转到您的 WSL2 并安装:
sudo apt-get install unzip
- 获取 android studio Command Line Tools Only 并将其解压到 /home//Android
- 安装 jdk 8 和
sudo apt-get install openjdk-8-jdk
- 将此添加到您的 .bashrc:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
export PATH=$PATH:$JAVA_HOME/bin
export ADB_SERVER_SOCKET=tcp:<YOUR_WSL_IP_ADDRESS_FROM_POWERSHELL>:5037 (check your WSL adapter IP by running `ipconfig` in powershell.)
export ANDROID_HOME=$HOME/Android
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
- 重新启动 bash 和 运行
sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools"
- 运行
adb version && adb.exe version
检查版本是否匹配
运行 在模拟器上
- 运行
adb kill-server
(ps) /adb.exe kill-server
(wsl2 bash) - 运行
adb -a -P 5037 nodaemon server
(ps) /adb.exe -a -P 5037 nodeamon server
(wsl2 bash) - 不要关闭终端window! - 运行
emulator -avd <YOUR_AVD_NAME>
(ps) /emulator.exe -avd <YOUR_AVD_NAME>
- 不要关闭终端 window! - 运行
adb kill-server
(WSL2 bash) - 运行
adb devices
(WSL2 bash) - 你现在应该看到你的模拟设备获取它的 id - 转到 WSL2 中的 react-native 项目目录,然后 运行
react-native run-android --deviceId=<YOUR_DEVICE_ID>
- 你现在应该都准备好了。
USB 连接设备的流程相同。唯一改变的是,你将启用开发人员 phone 连接到 PC 而不是第 4 步,你应该进入终端 window 并使用 运行ning adb 服务器记录新设备已连接。
注意:
只有在 windows 10 和扩展 PATH 系统变量上定义了环境变量,您才能 运行 PowerShell 中的所有命令都使用不带 .exe
的别名和路径。如果你想使用
来自 WSL2 bash 的所有命令,当您想在 windows 端执行某些操作时,您始终需要添加 .exe
,以便 WSL2 知道它需要
达到 windows 个可执行文件。
steelbrain
来自 here 的回答对我有用:
将以下内容添加到您的 WSL bashrc 或 zshrc:
export WSL_HOST_IP="$(tail -1 /etc/resolv.conf | cut -d' ' -f2)"
export ADB_SERVER_SOCKET=tcp:$WSL_HOST_IP:5037
然后创建一个防火墙条目,创建一个新的“入站”规则。 Select“端口”然后特定 TCP 端口“5037”然后“允许连接”然后检查所有域、私有和 Public 并添加一个名称。添加防火墙条目后,打开其属性,转到范围 -> 远程 IP 地址 -> 添加“172.16.0.0/12”。
现在我们已经了解了 WSL2 VM 并通过防火墙,您必须使用特定参数启动 adb 服务器以使其侦听所有地址(别担心我们只将 WSL2 VM 列入白名单IP 范围,因此没有安全问题)。
创建一个 vbs 脚本,随意命名并将其放入其中
CreateObject("WScript.Shell").Run "%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe kill-server", 0, True
CreateObject("WScript.Shell").Run "%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe -a -P 5037 nodaemon server", 0, True
现在您所要做的就是在每次重新启动时调用一次 vbs 脚本,您的 WSL VM 将连接到您的主机 ADB 实例
(我只是在常规 CMD.exe shell:
中调用了这两个命令%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe kill-server
%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe -a -P 5037 nodaemon server
我猜他提议 vbs
所以它仍然是 运行,因为如果我把它放在 .bat
文件中,服务器可能会随着 bat 文件一起死掉,haven'我试过)