Flutter Android App真机无网络访问权限问题排查:模拟器正常但真机无法打开链接、加载网络图片
解决Flutter APK真机无网络访问问题
我来帮你排查下这个困扰你的问题——模拟器正常但真机APK没网络的情况,通常和release打包的配置细节脱不了干系,以下是几个常见原因和对应的解决办法:
1. 确认INTERNET权限的配置位置
你提到已经加了<uses-permission android:name="android.permission.INTERNET"/>,但要仔细检查这个权限是不是加在了正确的文件和位置:
- 正确路径是:
android/app/src/main/AndroidManifest.xml,别误加到debug目录下的配置文件里(那个只在模拟器/debug模式生效)。 - 权限标签必须放在
<manifest>根标签下,不能嵌套在<application>标签内部,示例如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.your.package.name"> <!-- 权限要写在这里 --> <uses-permission android:name="android.permission.INTERNET"/> <application ...> ... </application> </manifest>
2. 处理Release模式的代码混淆
Flutter的release打包默认会开启代码混淆,如果混淆规则没配置好,可能会把url_launcher、网络请求相关的类给“搅乱”,导致功能失效。
打开android/app/proguard-rules.pro,添加以下规则保护相关依赖:
# 保护url_launcher插件的代码不被混淆 -keep class io.flutter.plugins.urllauncher.** { *; } # 保护网络异步任务相关类 -keepclassmembers class * extends android.os.AsyncTask { public <init>(); }
添加后重新打包APK:flutter build apk --release
3. 适配Android 9+的网络安全限制
从Android 9(API 28)开始,系统默认禁止明文HTTP请求(只允许HTTPS)。如果你的社交链接、网络图片用的是HTTP协议,真机就会直接拒绝加载。解决办法有两个:
- 优先把所有链接替换成HTTPS(这是最合规的方案);
- 如果必须用HTTP,就配置网络安全策略:
- 在
android/app/src/main/res/xml目录下新建network_security_config.xml(没有xml目录就手动创建),内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>- 在
AndroidManifest.xml的<application>标签里添加引用:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application> - 在
4. 检查APK的打包方式
如果你用的是flutter build appbundle生成App Bundle再安装,可能会出现split APK的权限异常(这种情况不多见,但可以排查)。先尝试生成完整APK测试:
flutter build apk --release --split-per-abi=false
把这个完整APK安装到真机,看看网络功能是否恢复。
5. 排查真机的网络环境
有时候问题不在应用本身,而是真机的网络限制:
- 先确认真机的WiFi/移动数据能正常访问外部链接(比如用浏览器打开你的社交链接试试);
- 检查有没有开启VPN、代理或者公司内网防火墙,这些可能会阻断应用的网络请求;
- 部分定制ROM(比如小米、华为)有手动控制应用网络权限的开关,虽然INTERNET属于正常权限无需动态申请,但可以去系统设置里确认下你的应用没被禁止联网。
另外,关于url_launcher的跳转问题,你也可以确认下AndroidManifest里是否添加了scheme支持(模拟器正常的话大概率没问题,但可以补充):
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 支持http/https链接跳转 --> <data android:scheme="http" /> <data android:scheme="https" /> </intent-filter> </activity>
试试以上这些方法,应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Vihanga Randunu




