我已经有一段时间没有完成Android开发了,因此我对现代Android开发的了解很少。
我正在尝试学习反应本地。我将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 run-android
时,模拟器在Windows中运行。通过 @PSCL的方式这样做的好处是,这种方式支持自动链接。这是您需要做的才能使它起作用。
Windows
Windows端唯一需要的是安装Android Studio并设置模拟器/虚拟设备。这很简单,所以我不会让你浏览一下。
Linux的Windows子系统
设置这一方面还有更多,所以请忍受我。(我的WSL是Ubuntu 18.04,在其他口味上未经测试。)
- 下载并解压缩Android命令行工具。(目前在Android Studio下载页面上找到,向下滚动到"仅命令行工具",然后选择Linux下载选项。)
- 在未拉链的文件夹中查看,然后将名为
tools
的目录移至~/Android/Sdk/tools
。(如果不存在,请创建~/Android/Sdk
目录。) - 下载并解开JDK 8.(我建议从AddingOpenjdk下载。此外,请确保安装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
工具来自这里。)
反应本机
现在一切都设置了,是时候玩了!
- 在Windows中启动模拟器。
- 在WSL中打开您的项目目录并运行
react-native start
。(保持此终端打开)。 - 在另一个WSL终端打开您的项目目录并运行
react-native run-android
。(您第一次运行此操作时,React Native将根据您的虚拟设备下载其他一些SDK。您可以通过运行sdkmanager --list
查看所有已安装的SDK。有关更多信息,请参见SDKMANAGER的文档。)
)
在设备上运行
这是关于制作的快速说明,因此您可以将应用程序安装到物理设备上。这里的诀窍是确保您的两个adb
可执行文件都在同一版本上。(它们应该是自从我们通过sdkmanager
安装的。)
C:Usersyour-nameAppDataLocalAndroidSdkplatform-toolsadb.exe version
/home/your-name/Android/Sdk/platform-tools/adb version
确认它们在同一版本上后,请确保您从Windows可执行文件启动ADB服务器(RUN adb.exe kill-server && adb.exe start-server
)。然后,您可以通过在WSL中运行adb devices
来测试它是否有效,并且应该看到插入的设备。
afaik - 由于许多问题,WSL的本地性。
例如。https://github.com/microsoft/bashonwindows/issues/1523
但是,我找到了一个解决方法,将本机Windows Android构建与WSL中的NPM堆栈相结合。实际上,您需要安装本机Windows Android Studio/SDK以使用Intellij IDE和模拟器。诀窍是将基于Gradle的Android编译分开。
工作流
使用NPM/纱线在WSL中执行的所有项目设置和软件包管理。React-native-native-CLI在WSL中全球安装。无需重复的Windows二进制节点/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。
对于那些难以使Windows 10 Android Studio与WSL2一起工作的人。
Inital Setup
您需要在Windows 10 Android Studio上安装。
设置用户变量: ANDROID_HOME=C:Users<YOUR_USER>AppDataLocalAndroidSdk
添加到系统变量路径:
%ANDROID_HOME%emulator
%ANDROID_HOME%platform-tools
%ANDROID_HOME%tools
%ANDROID_HOME%cmdline-toolslatest (I'm not sure if this one is necessary)
然后转到您的WSL2并安装:
-
sudo apt-get install unzip
- 仅获取Android Studio命令行工具,然后将其解压缩到/home//android
- 使用
sudo apt-get install openjdk-8-jdk
安装JDK 8 - 将其添加到您的.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
- 重新启动并运行
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 - 转到WSL2中的React-Native项目目录并运行
react-native run-android --deviceId=<YOUR_DEVICE_ID>
- 您应该现在设置全部。
与USB连接的设备保持相同的流程。唯一更改的是,您将开发人员启用电话连接到PC而不是步骤4,并且您应该在运行ADB服务器日志中获取新设备已连接的终端窗口。
注意:您只有在Windows 10和扩展路径系统变量上定义了环境变量时,才可以通过无.exe
的别名在PowerShell中运行所有命令。如果您想使用 WSL2 BASH的所有命令您在Windows侧执行某些内容时始终需要添加.exe
,因此WSL2知道它需要 访问Windows的可执行文件。
steelbrain
的答案从这里为我工作:
将以下内容添加到您的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"然后"允许连接"然后检查所有域,私人和公共,并添加一个名称。添加防火墙条目后,打开其属性,转到范围 - &gt;远程IP地址 - &GT;添加172.16.0.0/12&。
现在我们被WSL2 VM覆盖,通过防火墙,您必须启动具有特定参数的ADB服务器,以使其在所有地址上聆听(不用担心,我们只将WSL2 VM IP范围列入白色。所以没有安全问题)。
创建一个vbs脚本,将其称为任何东西,然后将其放入它
CreateObject("WScript.Shell").Run "%USERPROFILE%AppDataLocalAndroidSdkplatform-toolsadb.exe kill-server", 0, True
CreateObject("WScript.Shell").Run "%USERPROFILE%AppDataLocalAndroidSdkplatform-toolsadb.exe -a -P 5037 nodaemon server", 0, True
现在您要做的就是每次重新启动一次调用VBS脚本,WSL VM将连接到主机ADB实例
(我只是在常规的cmd.exe shell中调用了这两个命令:
%USERPROFILE%AppDataLocalAndroidSdkplatform-toolsadb.exe kill-server
%USERPROFILE%AppDataLocalAndroidSdkplatform-toolsadb.exe -a -P 5037 nodaemon server
我猜他提出了vbs
,因此它仍然运行,因为如果我将其放入.bat
文件中,服务器可能会用BAT文件死亡,没有尝试过)
ANDROID_HOME=/mnt/c/Users/<YOUR_USER>/AppData/Local/Android/Sdk
alias adb=$ANDROID_HOME"/platform-tools/adb.exe"