Cordova构建Android App通过USB调试时请求localhost:9000报404问题
这种情况我之前帮不少开发者排查过,核心问题基本都出在Cordova WebView的配置差异上——毕竟设备Chrome和Cordova内置的WebView是两个独立的环境,权限和规则都不一样。给你几个针对性的排查和解决方向:
1. 检查Content Security Policy(CSP)配置
Cordova的WebView会严格遵循页面的CSP规则,这是最常见的导致404的原因。打开你的index.html,找到<meta http-equiv="Content-Security-Policy">标签,确保其中包含了对localhost:9000的访问许可:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' localhost:9000 data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *;">
重点确认localhost:9000出现在default-src或者对应的资源类型规则里,不要漏掉端口号。
2. 验证网络权限与导航规则
网络权限:检查项目根目录下
platforms/android/app/src/main/AndroidManifest.xml,确保存在以下权限声明:<uses-permission android:name="android.permission.INTERNET" />虽然Chrome自带网络权限,但Cordova App必须显式声明才能访问网络资源。
导航许可:如果你安装了
cordova-plugin-whitelist插件(Cordova默认会包含),需要在config.xml中添加允许访问localhost的规则:<allow-navigation href="http://localhost:9000/*" />测试阶段也可以临时用
<allow-navigation href="*" />来排除规则限制,但正式发布前一定要收紧权限。
3. 替换localhost为127.0.0.1或主机局域网IP
有时候Cordova WebView对localhost的解析和Chrome不一致,你可以尝试把请求地址换成http://127.0.0.1:9000。如果是真机USB调试,还可以试试用你电脑的局域网IP(比如192.168.x.x:9000),同时确保电脑和设备在同一个WiFi网络下。
4. 确认端口转发规则并清除App缓存
- 执行
adb forward --list命令,检查是否存在tcp:9000 tcp:9000这条转发规则,如果没有,重新执行adb forward tcp:9000 tcp:9000。 - 到设备的「应用管理」找到你的Cordova App,清除缓存和数据,然后重新构建运行——旧缓存可能会导致请求异常。
5. 排查插件冲突
如果你安装了其他网络相关的插件(比如自定义WebView插件、代理插件),暂时禁用这些插件,重新构建App测试,看是否是插件干扰了网络请求。
先从CSP和导航规则这两点入手排查,这两个是最容易踩坑的地方,一般都能解决问题。
内容的提问来源于stack exchange,提问作者2BAD

