我应该如何在Android模拟器上连接到我的本地Web服务器页面,网址为http://localhost
或http://127.0.0.1
?
我已经尝试过,但模拟器仍然像对待Google搜索"localhost"一样对待我的请求,甚至更糟,它说找不到页面,尽管我的Web服务器正常运行。
我应该如何在Android模拟器上连接到我的本地Web服务器页面,网址为http://localhost
或http://127.0.0.1
?
我已经尝试过,但模拟器仍然像对待Google搜索"localhost"一样对待我的请求,甚至更糟,它说找不到页面,尽管我的Web服务器正常运行。
使用10.0.2.2
作为默认 AVD 地址,而在Genymotion中则使用10.0.3.2
。
10.0.3.2
吗? - ayjay我在家里的电脑上使用10.0.2.2非常成功,但是在工作中却无法使用。经过数小时的尝试后,我使用Android虚拟设备(AVD)管理器创建了一个新的模拟器实例,最终10.0.2.2得以正常工作。
我不知道另一个模拟器实例出了什么问题(平台相同),但如果你发现10.0.2.2无法正常工作,请尝试创建一个新的模拟器实例。
访问 http://10.0.2.2:8080/
,其中8080
是您的端口号。它完美地工作。如果您只尝试10.0.2.2
,它将无法正常工作。您需要添加端口号。此外,如果安装了Microsoft IIS,请尝试从控制面板关闭该功能(如果使用任何Windows操作系统),然后按照上述方法尝试。
每次运行模拟器时,您可以使用localhost:8000
来连接到您机器的本地主机,只需运行以下命令即可(仅在Mac上测试通过):
adb reverse tcp:8000 tcp:8000
只需将其放入Android Studio终端中即可。
它基本上设置了一个反向代理,其中在您的手机上运行的http服务器接受端口上的连接并将它们连接到计算机或反之亦然。
adb
的人来说,它确实已经被Android Studio安装了,但是由于某些原因,Android Studio没有自动将其添加到您的PATH中,您需要手动添加。请参阅以下内容以获取Windows、Linux和MacOS上的路径:https://medium.com/androiddevelopers/help-adb-is-not-found-93e9ed8a67ee - gaborous完美运行!
您可以通过以下IP地址连接到计算机的localhost:
10.0.2.2:{您的localhost端口号}
=>如果您在XAMPP中设置了端口号, 您必须使用该端口号。 在我的情况下是 10.0.2.2:2080
此外,您还可以使用网络适配器IP。在CMD中编写ipconfig
并查找您的适配器IP地址:
如果模拟器无法连接到这些IP地址,请关闭模拟器并从AVD管理器中使用冷启动
打开它:
您可以通过以下IP地址连接到计算机的localhost:
10.0.3.2:{端口号}
或按上述所述使用您的适配器IP地址。在我的情况下是:192.168.1.3:2080
尽管我已经阅读了这里和其他地方的所有答案,但我仍然花费了数小时来调试此问题,因为地址10.0.2.2
在Chrome浏览器中甚至无法工作。如果您遇到同样的问题,这里是一份逐步指南,以尝试调试并希望解决您的问题。
在模拟的Android中,转到“设置”>“WiFi”,检查是否连接到AndroidWiFi热点(代表您的主机计算机),然后单击底部的“高级”,然后检查网关地址:它应该指向10.0.2.2。如果不是,则可能有其他问题,也许更改代理设置可以解决您的问题,请参见此处如何使用Android Studio自2022年以来进行操作,因为代理设置现在被隐藏起来了:如何在新版本的Android Studio中配置模拟器代理?
只需打开一个网页浏览器,输入http://localhost:<port>
,以查看您的本地 Web 应用程序是否可访问。如果不能访问,则可能存在本地服务器参数问题。
打开 Chrome 浏览器,并将其指向 http://10.0.2.2:<port>
(对于 Genymotion,请替换为 http://10.0.3.2:<port>
)。如果您的 Web 应用程序显示出来,那么很好,您已经完成了。如果没有,则请测试下面的其他步骤以确定根本原因。
如果您的 Web 应用程序可以从主机计算机访问,但无法在模拟器内部访问,则根本原因可能是您的本地服务器由于某种原因限制了对某些接口的访问,很可能是出于安全原因。
为了检查这一点,请尝试使用另一个服务器,只需使用简单的 HTTP 服务器即可,例如带有 nodejs 的 http-server
,或者使用 Python 3 的 python -m http.server 8000
。
接下来,尝试从您的模拟器的 Chrome 浏览器访问这个简单的服务器,例如:http://10.0.2.2:8000
。如果可以正常工作,则确认您的本地服务器正在限制对某些接口的访问。您需要阅读本地服务器的文档以扩大权限。
例如,在我的情况下,我的服务器是 angular-cli
(AngularJS),默认情况下仅限于本地主机提供服务。为了使其工作,我不得不使用 ng serve --disable-host-check --host 0.0.0.0
而不是只使用 ng serve
,如 this other question 中所建议的那样。--host 0.0.0.0 指示 Web 服务器提供所有接口。类似的参数也可以提供给大多数 Web 服务器。
另一种选择可能是禁用一些未使用的适配器,特别是虚拟适配器,如 VPN。
http://10.0.2.2:<port>
。最后一个问题是,在你的 Android 应用程序中添加权限以访问 10.0.2.2,并且特别是对于没有安装 SSL 证书的本地 web 服务器(本地开发 web 服务器最可能的情况 - 只需检查 https://localhost:<port>
是否可用或者仅从主机计算机上访问http://localhost:<port>
)。这将使你的 Android 应用程序能够像 Chrome 一样访问你的本地 web 服务器。http://
),向你的 Android 应用程序添加特定权限是必要的。有几种方法可以配置你的 Android 应用程序以添加此权限,请参见:https://dev59.com/w1cO5IYBdhLWcg3wWgU0#50834600
结论本教程仅涵盖从Android模拟器内部访问/连接主机计算机上的本地Web服务器的问题,但一旦解决了这个问题,即使可达,Web应用程序可能仍然无法正常工作。一个例子是经历无限加载循环。要在解决可达性后进一步调试问题,您可以在Chrome浏览器中使用chrome://inspect
附加到Android模拟器内部的Android WebView,并像在计算机上呈现一样进行实时调试。
最后一个选择,可能更快的方法是订阅付费服务,例如ngrok,但免费版本是无用的,因为它们必须在Android应用程序的Webview之外的Web浏览器中打开Web应用程序。
我需要找到模拟器"Nox App Player"的系统主机IP地址。以下是我如何找出它的方法:172.17.100.2
.
ip link show
命令以显示所有网络接口。特别感兴趣的是eth1接口。ifconfig eth1
命令,显示网络为172.17.100.15/255.255.255.0
172.17.100.1
开始的地址,在"172.17.100.2"上找到了一个匹配项。不确定防火墙是否会干扰,但在我的情况下没有。也许这可以帮助其他人为其他模拟器解决问题。