我有一段时间没有完成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
答案 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组件对一些相当复杂的项目进行了测试。希望这会有所帮助。
答案 1 :(得分:2)
可以进行设置,以使仿真器在Windows中在WSL中运行react-native run-android
时运行。与@pscl相比,这种方式的好处是这种方式支持自动链接。这是您需要执行的操作。
Windows端唯一需要的是安装Android Studio并设置模拟器/虚拟设备。这非常简单,所以我不会指导您。
设置这方面还有很多事情,所以请耐心等待。 (我的WSL是Ubuntu 18.04,未经其他版本的测试。)
tools
的目录移动到~/Android/Sdk/tools
。 (如果~/Android/Sdk
目录不存在,请创建。)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
sdkmanager "platform-tools"
以下载最新的平台工具。 (adb
工具来自这里。)现在一切都已设置好,该玩了!
react-native start
。 (将此终端保持打开状态。)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并安装:
sudo apt-get install unzip
sudo apt-get install openjdk-8-jdk
安装jdk 8 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
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)-不要关闭终端窗口! emulator -avd <YOUR_AVD_NAME>
(ps)/ emulator.exe -avd <YOUR_AVD_NAME>
-不要关闭终端窗口! adb kill-server
(WSL2 bash)adb devices
(WSL2 bash)-您现在应该看到模拟的设备提取了它的ID react-native run-android --deviceId=<YOUR_DEVICE_ID>
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文件一起死掉,没有尝试过)