当前位置: 首页 > news >正文

Android 系统连接WIFI显示网络连接受限分析处理

Android 系统连接WIFI显示网络连接受限分析处理

文章目录

  • Android 系统连接WIFI显示网络连接受限分析处理
    • 一、前言
    • 二、分析处理
      • 1、NetworkMonitor 网络监视器
      • 2、源码分析
      • 3、定义默认校验的网址
      • 4、多个校验网址的设置
      • 5、设置网络是否校验的代码
        • (1)Java 代码分析
        • (2)检测相关定义值
        • (3)设置不进行网络校验的方法
          • ①Java应用中设置默认属性
          • ② SettingsProvider 加载默认值
    • 三、其他
      • 1、Android 系统连接WIFI网络显示网络连接受限分析处理小结
      • 2、Android adb查看网络连接情况
      • 3、Android11 使用NTP同步时间

一、前言

Android 系统连接WIFI提示网络受限处理这个是比较常见的问题了,这里简单记录一下。

Android原生系统连接国内wifi网络会提示不可用,
之后显示网络受限,但是实际可以上网;
连接国外VPN网络是没有这个问题的。

这个问题的原因就是系统连接上wifi后校验网络的时候,
使用的是一个国外的url地址,但是国内外访问这个地址是无法返回数据的,
所以系统才会判断该wifi无法连接网络。

要解决这个问题,有两种方法:
一个是替换了校验网络的url地址,另外一个是去除这个校验过程。

这个问题很多文章都有介绍,这里是基于Android14进行了简单分析,又想去的可以看看。

二、分析处理

1、NetworkMonitor 网络监视器

连接国内外wifi打印的日志:

console:/ # logcat | grep NetworkMonitorNetworkMonitor/100: checkAndRenewResourceConfig: update captive portal https urls to [https://www.google.com/generate_204]
NetworkMonitor/100: checkAndRenewResourceConfig: update captive portal http urls to [http://connectivitycheck.gstatic.com/generate_204]
NetworkMonitor/100: checkAndRenewResourceConfig: update captive portal fallback urls to[http://www.google.com/gen_204, http://play.googleapis.com/generate_204]
NetworkMonitor: Starting on network 100 with capport HTTPS URL [https://www.google.com/generate_204] and HTTP URL [http://connectivitycheck.gstatic.com/generate_204]
NetworkMonitor/100: PROBE_DNS www.google.com 43ms OK 31.13.73.169
NetworkMonitor/100: PROBE_DNS connectivitycheck.gstatic.com 61ms OK 203.208.40.34
UpstreamNetworkMonitor: New default Internet network: 100
NetworkMonitor/100: PROBE_HTTP http://connectivitycheck.gstatic.com/generate_204 time=234ms ret=204 request={Connection=[close], User-Agent=[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36]} headers={null=[HTTP/1.1 204 No Content], Connection=[close], Content-Length=[0], Cross-Origin-Resource-Policy=[cross-origin], Date=[Sun, 25 Aug 2024 09:25:50 GMT], X-Android-Received-Millis=[1724577945932], X-Android-Response-Source=[NETWORK 204], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1724577945815]}
NetworkMonitor/100: PROBE_HTTPS https://www.google.com/generate_204 Probe failed with exception java.net.SocketTimeoutException: failed to connect to www.google.com/31.13.73.169 (port 443) from /192.168.31.38 (port 51034) after 10000ms
NetworkMonitor/100: PROBE_FALLBACK http://www.google.com/gen_204 Probe failed with exception java.net.SocketTimeoutException: failed to connect to www.google.com/31.13.73.169 (port 80) from /192.168.31.38 (port 49544) after 10000ms
NetworkMonitor/100: isCaptivePortal: isSuccessful()=false isPortal()=false RedirectUrl=null isPartialConnectivity()=false Time=13014ms

这里可以看到访问的国外网的url并且访问是返回失败的。

2、源码分析

package\modules\NetworkStack\src\com\android\server\connectivity\NetworkMonitor.java

public class NetworkMonitor extends StateMachine {private static final String TAG = NetworkMonitor.class.getSimpleName();private static final boolean DBG  = true;private static final boolean VDBG = false;@NonNullprivate URL[] mCaptivePortalFallbackUrls; //重定向网址@NonNullprivate URL[] mCaptivePortalHttpUrls;//http校验网址@NonNullprivate URL[] mCaptivePortalHttpsUrls; //https校验网址//http 校验的默认网址public String getCaptivePortalServerHttpUrl(@NonNull Context context) {return getSettingFromResource(context,R.string.config_captive_portal_http_url, mCaptivePortalHttpUrlFromSetting,context.getResources().getString(R.string.default_captive_portal_http_url));}//https 校验的默认网址private String getCaptivePortalServerHttpsUrl(@NonNull Context context) {return getSettingFromResource(context,R.string.config_captive_portal_https_url, mCaptivePortalHttpsUrlFromSetting,context.getResources().getString(R.string.default_captive_portal_https_url));}//https 校验网址的数组合成private URL[] makeCaptivePortalHttpsUrls(@NonNull Context context) {final URL testUrl = getTestUrl(TEST_CAPTIVE_PORTAL_HTTPS_URL);if (testUrl != null) return new URL[] { testUrl };final String firstUrl = getCaptivePortalServerHttpsUrl(context); //获取默认的https校验网址try {final URL[] settingProviderUrls =combineCaptivePortalUrls(firstUrl, CAPTIVE_PORTAL_OTHER_HTTPS_URLS);// firstUrl will at least be default configuration, so default value in// getProbeUrlArrayConfig is actually never used.return getProbeUrlArrayConfig(context, settingProviderUrls,R.array.config_captive_portal_https_urls,DEFAULT_CAPTIVE_PORTAL_HTTPS_URLS, this::makeURL);} catch (Exception e) {// Don't let a misconfiguration bootloop the system.Log.e(TAG, "Error parsing configured https URLs", e);// Ensure URL aligned with legacy configuration.return new URL[]{makeURL(firstUrl)};}}}

这里可以看到url网址的校验和获取的是哪个config名称的URL网址。
值得注意的是Android13 之后,url网址可以添加多个了,
Android13 之前的代码都是没有添加多个的,都是当个的http或者https。

其实这个问题我之前也是感觉只校验一个网址的情况确认不保险,
这个应该是Google 也发现了这个问题后进行了优化处理,可以对多个url进行校验后再判断网络是否可用。

NTP网址校验也有这个问题。这个没有进行后续优化,但是这个本身是有多个优先级获取的。

3、定义默认校验的网址

package\modules\NetworkStack\res\values\config.xml

    <string name="default_captive_portal_http_url" translatable="false">http://connectivitycheck.gstatic.com/generate_204</string> //http<string name="default_captive_portal_https_url" translatable="false">https://www.google.com/generate_204</string> //https<string-array name="default_captive_portal_fallback_urls" translatable="false"><item>http://www.google.com/gen_204</item><item>http://play.googleapis.com/generate_204</item></string-array>

修改这个网址成功国内外的就可以成功校验到网络了。
但是万一国外网又不可以校验,那不是有bug?
所有要考虑清楚是否会卖到国外的情况,才做修改;
要么找到兼容的网址,要么直接去除这个校验。

4、多个校验网址的设置

package\modules\NetworkStack\src\com\android\networkstack\util\NetworkStackUtils.java

    public static final String[] DEFAULT_CAPTIVE_PORTAL_HTTP_URLS =new String [] {"http://connectivitycheck.gstatic.com/generate_204"};/*** The default list of HTTPS URLs for network validation, to use for confirming internet* connectivity.*/public static final String[] DEFAULT_CAPTIVE_PORTAL_HTTPS_URLS =new String [] {"https://www.google.com/generate_204"};

上面是http和https校验的数组网址。

这里定义的两个数组在 NetworkMonitor 中确实也有引用到,但是不确定修改了是否有没有效果。
这个是直接写死在Java代码中的。

5、设置网络是否校验的代码

(1)Java 代码分析

package\modules\NetworkStack\src\com\android\server\connectivity\NetworkMonitor.java

private CaptivePortalProbeResult isCaptivePortal(ValidationProperties properties,URL[] httpsUrls, URL[] httpUrls, URL fallbackUrl) {if (!mIsCaptivePortalCheckEnabled) {validationLog("Validation disabled.");return CaptivePortalProbeResult.success(CaptivePortalProbeResult.PROBE_UNKNOWN);}。。。}private static boolean getIsCaptivePortalCheckEnabled(@NonNull Context context,@NonNull Dependencies dependencies) {String symbol = CAPTIVE_PORTAL_MODE; //其实就是这个Settings属性int defaultValue = CAPTIVE_PORTAL_MODE_PROMPT; //默认校验int mode = dependencies.getSetting(context, symbol, defaultValue);return mode != CAPTIVE_PORTAL_MODE_IGNORE;}public int getSetting(Context context, String symbol, int defaultValue) {return Settings.Global.getInt(context.getContentResolver(), symbol, defaultValue);}

具体判断过程可以在源码里面再梳理一下,但是实际起作用的就是一个Settings属性,
如果没有设置Settings属性,就是默认校验的情况。

(2)检测相关定义值

package\modules\NetworkStack\src\com\android\networkstack\util\NetworkStackUtils.java

    public static final String CAPTIVE_PORTAL_MODE = "captive_portal_mode";//0 不检测public static final int CAPTIVE_PORTAL_MODE_IGNORE = 0;//1默认弹框提示,默认public static final int CAPTIVE_PORTAL_MODE_PROMPT = 1;//2检测到需要登录则自动断开此热点并不再自动连接public static final int CAPTIVE_PORTAL_MODE_AVOID = 2;
(3)设置不进行网络校验的方法

有两种方法,
一个是设置一次网络校验的值,
还有就是在Settings属性加载的时候load这个属性值。

①Java应用中设置默认属性
private void setWifiNotCheckNetwork(Context context) {ContentResolver cr = context.getContentResolver();// 0 不检测,1默认弹框提示,2检测到需要登录则自动断开此热点并不再自动连接Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE, Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE);}

在启动比较早的系统服务中设置就行,
设置一次或者每次启动都是都是没啥问题的。

② SettingsProvider 加载默认值

frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java

    loadBooleanSetting(stmt, Settings.Global.WIFI_ON,R.bool.def_wifi_on);//参考wifi开关状态的方法,添加一行就行loadBooleanSetting(stmt, Settings.Global.CAPTIVE_PORTAL_MODE, 0);

其实这个网络校验好像没啥用,直接去掉就OK了;
还改啥默认校验的url多麻烦!

三、其他

1、Android 系统连接WIFI网络显示网络连接受限分析处理小结

处理方式要么修改默认url,要么去除url的校验过程。
去除url校验后,就是直接显示已连接,不行再显示网络受限等信息。
设置多个url校验的情况,不确定是否有用。需要自己尝试验证。

2、Android adb查看网络连接情况

adb shell ifconfig //查看配置信息adb shell dumpsys connectivity  //查看连接情况db shell netstat //查看连接状态和地址adb shell ip ru //查看路由策略

具体情况介绍:
https://blog.csdn.net/wenzhi20102321/article/details/122161589

3、Android11 使用NTP同步时间

https://blog.csdn.net/wenzhi20102321/article/details/127482145

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CI/CD实践(五)Jenkins Docker 自动化构建部署Node服务
  • kafka的12个重要概念
  • Spatial Structure Constraints for Weakly SupervisedSemantic Segmentation
  • Python实现分水岭图像分割算法
  • 数据类型 NVARCHAR2 与 VARCHAR2 的对比
  • 2024年6月 青少年等级考试机器人实操真题二级
  • 20240830 每日AI必读资讯
  • 公网信息泄露监测(网盘、暗网、搜索引擎、文档平台)思路分享
  • 【推推P1】第一期“小说详情模块”:JAVA开发文档官方版;快来在线实习吧
  • 服务器远程管理
  • R 2火灾温度预测
  • 442一场“吃干榨净”的富贵,是怎么拼出来的?
  • 【Java基础面试题】Java的优势
  • C++:共享指针(shared_ptr)详解
  • 【RK3588】yolov5的部署
  • 收藏网友的 源程序下载网
  • #Java异常处理
  • [nginx文档翻译系列] 控制nginx
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Angular 响应式表单 基础例子
  • CSS实用技巧
  • es6
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • LeetCode18.四数之和 JavaScript
  • PV统计优化设计
  • python 装饰器(一)
  • Sublime text 3 3103 注册码
  • web标准化(下)
  • 彻底搞懂浏览器Event-loop
  • 仿天猫超市收藏抛物线动画工具库
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 新版博客前端前瞻
  • 新手搭建网站的主要流程
  • 一个JAVA程序员成长之路分享
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • elasticsearch-head插件安装
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 飞书APP集成平台-数字化落地
  • #APPINVENTOR学习记录
  • (day6) 319. 灯泡开关
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (二)正点原子I.MX6ULL u-boot移植
  • (二十四)Flask之flask-session组件
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (回溯) LeetCode 78. 子集
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (数据结构)顺序表的定义
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库