使用直接在Windows中运行的模拟器在WSL中运行React Native

时间:2017-03-05 21:34:42

标签: android android-studio react-native windows-subsystem-for-linux

我有一段时间没有完成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

4 个答案:

答案 0 :(得分:13)

AFAIK由于存在许多问题,因此无法在WSL中使用react-native。

e.g。 https://github.com/Microsoft/BashOnWindows/issues/1523

但是,我发现了一种解决方法,它将原生windows android构建与WSL中的npm堆栈相结合。实际上,您仍然希望安装本机Windows Android Studio / SDK以使用Intellij IDE和模拟器。诀窍是分离出基于Gradle的Android编译。

<强>工作流

所有项目设置和包管理都在WSL中使用npm / yarn执行。 react-native-cli全局安装在WSL中。不需要重复的Windows二进制节点/ npm堆栈。

不要使用react-native run-android,而是从cmd编译和部署。从项目内的/android目录执行gradle包装器gradlew.bat installDebug,或者使用Creator的更新,您可以从WSL bash shell /mnt/c/Windows/System32/cmd.exe /C gradlew.bat installDebug内部执行此操作。不要使用unix gradlew脚本。

将APK组装并上传到您的设备或模拟器后,使用命令react-native start从WSL中运行调试服务器。

我已经使用多个原生Android组件对一些相当复杂的项目进行了测试。希望这会有所帮助。

  • 注意:为此,您的项目需要位于本机Windows文件系统中,即/ mnt / c。

答案 1 :(得分:2)

可以进行设置,以使仿真器在Windows中在WSL中运行react-native run-android时运行。与@pscl相比,这种方式的好处是这种方式支持自动链接。这是您需要执行的操作。

Windows

Windows端唯一需要的是安装Android Studio并设置模拟器/虚拟设备。这非常简单,所以我不会指导您。

Linux的Windows子系统

设置这方面还有很多事情,所以请耐心等待。 (我的WSL是Ubuntu 18.04,未经其他版本的测试。)

  1. 下载并解压缩Android命令行工具。 (当前位于Android Studio下载页面上,向下滚动到“仅命令行工具”。)
  2. 在解压缩的文件夹中查找,然后将名为tools的目录移动到~/Android/Sdk/tools。 (如果~/Android/Sdk目录不存在,请创建。)
  3. 下载并解压缩JDK8。(我建议从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工具来自这里。)

反应原生

现在一切都已设置好,该玩了!

  1. 在Windows中启动模拟器。
  2. 在WSL中打开您的项目目录,然后运行react-native start。 (将此终端保持打开状态。)
  3. 在另一个WSL终端中打开项目目录,然后运行react-native run-android。 (第一次运行此命令时,React Native将基于您的虚拟设备下载一些其他SDK。您可以通过运行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服务器。然后,您可以通过在WSL中运行adb devices来测试其是否正常工作,并且应该看到已插入设备。

答案 2 :(得分:2)

对于那些努力使Windows 10 Android Studio与WSL2位于本机反应项目中的人感到困惑。

初始设置

您需要在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命令行工具,并将其解压缩到/ home // Android
  3. sudo apt-get install openjdk-8-jdk安装jdk 8
  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)-不要关闭终端窗口!
  3. 运行emulator -avd <YOUR_AVD_NAME>(ps)/ emulator.exe -avd <YOUR_AVD_NAME>-不要关闭终端窗口!
  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连接的设备保持相同的流程。唯一发生变化的是,将开发人员支持的电话连接到PC而不是第4步,您应该进入运行新数据库已连接的adb服务器日志的终端窗口。

注意: 只有在Windows 10和扩展的PATH系统变量上定义了环境变量的情况下,才能在PowerShell中使用别名而不使用.exe和路径来运行所有命令。如果要使用 WSL2 bash中的所有命令都需要在Windows上执行某些操作时始终添加.exe,因此WSL2知道它需要执行以下操作: 进入Windows可执行文件。

答案 3 :(得分:0)

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

然后创建一个防火墙条目,创建一个新的“入站”规则。选择“端口”,然后选择特定的TCP端口“ 5037”,然后选择“允许连接”,然后检查所有域,专用和公用并添加名称。添加防火墙条目后,打开其属性,然后转到“作用域”->“远程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文件一起死掉,没有尝试过)