运行 在 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,这在其他口味上未经测试。)

  1. 下载并解压缩 Android 命令行工具。 (目前在 Android Studio 下载页面上找到,向下滚动到 "Command line tools only" 和 select Linux 下载选项。)
  2. 查看解压后的文件夹,将名为 tools 的目录移动到 ~/Android/Sdk/tools。 (如果 ~/Android/Sdk 目录不存在,请创建它们。)
  3. 下载并解压JDK 8。(我推荐从AdoptOpenJDK下载。另外,一定要安装OpenJDK 8,否则sdkmanager将无法运行,我们稍后会用到。)
  4. 将解压后的文件夹移动到/opt/jdk8u222-b10。 (实际上你可以把它放在任何你想要的地方,只要确保 JAVA_HOME 环境变量指向这个解压缩的文件夹。)
  5. ~/.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
  1. 重新启动您的 bash 终端并执行命令 sdkmanager "platform-tools" 下载最新的平台工具。 (adb 工具来自这里。)

React Native

一切就绪,是时候开始玩了!

  1. 在Windows中启动模拟器。
  2. 在 WSL 和 运行 react-native start 中打开您的项目目录。 (保持此终端打开)。
  3. 在另一个 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 并安装:

  1. sudo apt-get install unzip
  2. 获取 android studio Command Line Tools Only 并将其解压到 /home//Android
  3. 安装 jdk 8 和 sudo apt-get install openjdk-8-jdk
  4. 将此添加到您的 .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
  1. 重新启动 bash 和 运行 sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools"
  2. 运行 adb version && adb.exe version 检查版本是否匹配

运行 在模拟器上

  1. 运行 adb kill-server (ps) / adb.exe kill-server (wsl2 bash)
  2. 运行 adb -a -P 5037 nodaemon server (ps) / adb.exe -a -P 5037 nodeamon server (wsl2 bash) - 不要关闭终端window!
  3. 运行 emulator -avd <YOUR_AVD_NAME> (ps) / emulator.exe -avd <YOUR_AVD_NAME> - 不要关闭终端 window!
  4. 运行 adb kill-server (WSL2 bash)
  5. 运行 adb devices (WSL2 bash) - 你现在应该看到你的模拟设备获取它的 id
  6. 转到 WSL2 中的 react-native 项目目录,然后 运行 react-native run-android --deviceId=<YOUR_DEVICE_ID>
  7. 你现在应该都准备好了。

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'我试过)