Android13 wifi状态问题分析

文章目录

  • Android13 wifi状态问题分析
    • 一、wifi开关设置默认状态无效
      • 场景;
      • 原因:
      • 解决方法:
    • 二、wifi 开关状态不记忆
      • 场景:
      • 可能原因:
      • 解决方法:
    • 三、wifi未自动重连问题
      • 场景:
      • 问题原因:
        • 解决方法:
      • 解决方法1:
      • 解决方法2:
        • 解决方法2:
    • 4、其他

一、wifi开关设置默认状态无效

场景;

设置wif 默认开关属性:


framework\base\packages\SettingsProvider\res\values\defaults.xml
//设置默认开关状态
<bool name="def_wifi_on">false</bool>

系统升级后,wifi 默认设置属性无效。

原因:

多个地方存在定义默认wifi开关状态的定义。

解决方法:

可能是配置文件,有overlay,一般是在 vendor 下面有 WifiOverlay的情况,或者全局查找,使用命令查找:

find . -name "*.xml" | xargs grep "def_wifi_on"

看看系统源码哪里还会设置默认状态的文件

比如 amlogic 方案下面会存在overlay属性:

vendor/amlogic/common/apps/VendorOverlay/WifiOverlay/res/values/defaults.xml

二、wifi 开关状态不记忆

这个比较少见,感觉是系统缓存策略问题。偶现的。在手机上基本不可能出现,板子上调试可能会出现。

场景:

wifi 开关状态从开启到关闭后,再断电关机然后上电开机后,wifi 的开关状态会变成打开。

通过几次测试发现,只有关闭状态会不记忆,开启状态是记忆的。
目前只在Android13 amlogic 方案上见过。

//wifi 开关后使用名称查看,状态是正常的
settings get global wifi_on //0关闭,1开启

明明关闭后,并且查询到 wifi_on 属性值为 0 ,硬重启后,查询 wifi_on 属性值为 1,wifi 处于开启状态。

你可能怀疑数据没写入到系统文件,但是查看系统文件是写入成功的

可以命令查看:


cat /data/system/users/0/settings_global.xml  | grep wifi_on

上面需要root 权限才能看system目录

可能原因:

硬重启的情况,内存数据未成功保存到flash中导致。网上搜的!

解决方法:

adb shell 多次输入命令 :sync,目的就是强制把内存中待写入的数据强制刷入flash中。

实际代码中,执行开关状态后 sync命令即可。

但是测试几次发现,执行关闭wifi后,马上执行sync 不一定有用,需要一段时间后(比如5秒)再执行可以生效。


//同步sync ,需要系统签名权限
private void fileSync() {Runtime runtime = Runtime.getRuntime();try {runtime.exec("sync");} catch (IOException e) {e.printStackTrace();}
}

这个问题比较特殊,这样看其他属性设置也会有概率有这个问题,
所以要小心,最好是看看系统内存策略哪里能进行优化处理。

三、wifi未自动重连问题

场景:

1、连接某个wifi,开关wifi 后,未自动连接之前连接的wifi
2、连接某个wifi,再连接一个wifi,断开当前连接的WiFi,未自动连接之前连接的wifi

问题原因:

Android 默认的校验机制,无法访问google的情况或者连接连接网络比较慢的情况,会设置该wifi 默认不进行自动连接状态。

我这里开发的是Android13 才发现的。其他版本也可能出现,估计要看供应商是否适配过吧。

对比一下日志:

logcat | grep NetworkMonitor//isSuccessful()=false  不会自动重连的wifi 的日志
04-27 15:03:59.347  1198  4081 D NetworkMonitor/110: checkAndRenewResourceConfig: update captive portal https urls to [https://www.google.com/generate_204]
04-27 15:03:59.348  1198  4081 D NetworkMonitor/110: checkAndRenewResourceConfig: update captive portal http urls to [http://connectivitycheck.gstatic.com/generate_204]
04-27 15:03:59.350  1198  4081 D NetworkMonitor/110: checkAndRenewResourceConfig: update captive portal fallback urls to[http://www.google.com/gen_204, http://play.googleapis.com/generate_204]
04-27 15:03:59.350  1198  4081 D NetworkMonitor: Starting on network 110 with capport HTTPS URL [https://www.google.com/generate_204] and HTTP URL [http://connectivitycheck.gstatic.com/generate_204]
04-27 15:03:59.681  1198  1381 D UpstreamNetworkMonitor: New default Internet network: 110
04-27 15:03:59.723  1198  4094 D NetworkMonitor/110: PROBE_DNS connectivitycheck.gstatic.com 61ms OK 14.215.177.38
04-27 15:03:59.847  1198  4093 D NetworkMonitor/110: PROBE_DNS www.google.com 194ms OK 157.240.10.32
04-27 15:04:09.846  1198  4094 D NetworkMonitor/110: PROBE_HTTP http://connectivitycheck.gstatic.com/generate_204 Probe failed with exception java.net.SocketTimeoutException: timeout
04-27 15:04:09.961  1198  4093 D NetworkMonitor/110: PROBE_HTTPS https://www.google.com/generate_204 Probe failed with exception java.net.SocketTimeoutException: Read timed out
04-27 15:04:12.733  1198  4092 D NetworkMonitor/110: PROBE_FALLBACK http://www.google.com/gen_204 Probe failed with exception java.net.SocketTimeoutException: timeout
04-27 15:04:12.741  1198  4092 D NetworkMonitor/110: isCaptivePortal: isSuccessful()=false isPortal()=false RedirectUrl=null isPartialConnectivity()=false Time=13089ms//isSuccessful()=true 会自动重连的wifi 的日志
04-27 15:05:33.154  1198  4882 D NetworkMonitor/111: checkAndRenewResourceConfig: update captive portal https urls to [https://www.google.com/generate_204]
04-27 15:05:33.155  1198  4882 D NetworkMonitor/111: checkAndRenewResourceConfig: update captive portal http urls to [http://connectivitycheck.gstatic.com/generate_204]
04-27 15:05:33.155  1198  4882 D NetworkMonitor/111: checkAndRenewResourceConfig: update captive portal fallback urls to[http://www.google.com/gen_204, http://play.googleapis.com/generate_204]
04-27 15:05:33.155  1198  4882 D NetworkMonitor: Starting on network 111 with capport HTTPS URL [https://www.google.com/generate_204] and HTTP URL [http://connectivitycheck.gstatic.com/generate_204]
04-27 15:05:33.787  1198  1381 D UpstreamNetworkMonitor: New default Internet network: 111
04-27 15:05:34.095  1198  4900 D NetworkMonitor/111: PROBE_DNS www.google.com 335ms OK 142.250.207.100
04-27 15:05:34.128  1198  4901 D NetworkMonitor/111: PROBE_DNS connectivitycheck.gstatic.com 370ms OK 142.250.206.19504-27 15:05:36.355  1198  4900 D NetworkMonitor/111: PROBE_HTTPS https://www.google.com/generate_204 time=2257ms 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], Alt-Svc=[h3=":443"; ma=2592000,h3-29=":443"; ma=2592000], Connection=[close], Content-Length=[0], Cross-Origin-Resource-Policy=[cross-origin], Date=[Thu, 27 Apr 2023 07:05:36 GMT], X-Android-Received-Millis=[1682579136352], X-Android-Response-Source=[NETWORK 204], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1682579135355]}
04-27 15:05:36.358  1198  4899 D NetworkMonitor/111: isCaptivePortal: isSuccessful()=true isPortal()=false RedirectUrl=null isPartialConnectivity()=false Time=2602ms

从日志可以看到网络种默认访问的网址,
并且第一个wifi,是出现有timeout 的情况,需要时间十几秒,第二个是正常的情况,一般两三秒就可以。

解决方法:

参考:
https://blog.csdn.net/weixin_44008788/article/details/115798135
https://blog.csdn.net/woaiminghui/article/details/128412017
https://wuyaogexing.com/70/178360.html

上面几个其实没写明白,只是简单说了一下!

解决方法1:

修改 网络默认访问的网址。


packages/modules/NetworkStack/res/values/config.xml//默认访问超时时间,12.5秒<integer name="default_captive_portal_dns_probe_timeout">12500</integer><!-- HTTP URL for network validation, to use for detecting captive portals. -->
-    <string name="default_captive_portal_http_url" translatable="false">http://connectivitycheck.gstatic.com/generate_204</string>
+    <string name="default_captive_portal_http_url" translatable="false">http://xxxxx/generate_204</string> //修改为可以访问的网址

没试过,估计是可行的

解决方法2:

分析修改 Android 网络连接评测机制:

//Android 13 中的 NetworkMonitor 位置:
packages\modules\NetworkStack\src\com\android\server\connectivity\NetworkMonitor.java//网上有说这里直接返回 success的情况即可。
private CaptivePortalProbeResult isCaptivePortal(ValidationProperties properties, URL[] httpsUrls, URL[] httpUrls, URL fallbackUrl) {//return XXX;
}

估计是和网上的系统版本代码不一样了,不能一样的修改,怕改得不对!
但是,花点时间理清楚逻辑肯定是能修改的。
在 NetworkMonitor 这个类也能看到网络请求的逻辑,并且网络请求返回的情况,并做对应判断。

从上面日志和属性保存情况,我猜测修改某个属性就可以了,所以我使用的是自创的一种写法;

解决方法2:

修改 isSuccessCode 方法返回 true 即可。

//Android 13 中的 CaptivePortalProbeResult 位置:
packages\modules\NetworkStack\common\captiveportal\src\android\net\captiveportal\CaptivePortalProbeResult.javaimport android.os.SystemProperties;
import android.util.Log;private static boolean isSuccessCode(int responseCode) {boolean isNotCheckNetWork = SystemProperties.getBoolean("persist.sys.not_monitor", true); //默认为 trueLog.i("CaptivePortalProbeResult", "isSuccessCode responseCode = " + responseCode);if (isNotCheckNetWork) {return true;} else {return responseCode == SUCCESS_CODE; //之前的逻辑}}

上面我是添加了 prop 属性判断,默认设置跳过网络验证,后期可以关闭。

第二种方法,亲测是真实有效的。

4、其他

Android wifi 启动流程

https://blog.csdn.net/TSK_Amine/article/details/126057653

//Android 13  WifiServiceImpl 是放到package 下面了!
packages\modules\Wifi\service\java\com\android\server\wifi\WifiServiceImpl.javapublic void checkAndStartWifi() {mWifiThreadRunner.post(() -> {if (!mWifiConfigManager.loadFromStore()) {Log.e(TAG, "Failed to load from config store");}。。。// Check if wi-fi needs to be enabledboolean wifiEnabled = mSettingsStore.isWifiToggleEnabled();//这里默认会打印wifi 开关状态,其实就是setting.global_wifi_on 的属性值!Log.i(TAG, "WifiService starting up with Wi-Fi " + (wifiEnabled ? "enabled" : "disabled")); 。。。}}

Android13 wifi状态问题分析相关推荐

  1. 【Android 12.0】Android S WiFi启动业务流程分析(UML图)

    以下两张为Android S的WiFi启动(start)业务流程UML图,业务流程的过程详情因公司规定不可复制源码出来,所以想看业务流程详情的同学可以参考其他博主所发的博客.业务流程参考内容链接我会放 ...

  2. 基于Android13的系统启动流程分析(三)之FirstStageMain阶段

    Android13系统启动阶段大致分为FirstStageMain阶段和SecondStageMain,此章主要讲FirstStageMain阶段 (若分析有误敬请指教) 本章讲解的方向和你将收获的知 ...

  3. 基于Android13的系统启动流程分析(六)之SystemServer内部逻辑分析

    主要分析一下SystemServer启动过后的内部逻辑,特别说明一下AMS,WMS都属于SystemServer进程,属于同一个进程 一. SystemServer进程启动流程 基于Android13 ...

  4. Android -- Wifi启动流程分析

    Android -- Wifi启动流程分析 Android网络各个模式中,Wifi应该是目前最常用的一种网络方式了:下面就简单介绍下Android中Wifi的启动流程. 当我在Setting菜单里点击 ...

  5. Android WIFI log基本分析流程

    同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦. 1.W ...

  6. Android WiFi —softAP流程分析

    Android WiFi - Ap功能实现与源码分析 0. 前言 wifiAp的ip WifiAp的config分析 2.1 默认的config 2.2 修改wifiAp的config配置流程 开启/ ...

  7. android控制wifi状态

    wifi的五种状态 常量名 常量值 网卡状态 WIFI_STATE_DISABLED         1            WIFI网卡不可用 WIFI_STATE_DISABLING       ...

  8. 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI 状态 | 被动获取 WIFI 状态 )

    文章目录 一.获取 WIFI 状态 二.主动获取 WIFI 状态 三.被动获取 WIFI 状态 参考 Google 官方文档 : 优化电池续航时间 一.获取 WIFI 状态 在应用中执行某些操作 , ...

  9. android编程获取网络和wifi状态及调用网络设置界面,Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面 - Android平台开发技术 - 博客园...

    获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...

最新文章

  1. Nature综述:菌根共生的独特性和共性
  2. 三十四、段页式管理方式
  3. SCRUM的三个工件
  4. WSAStartup函数
  5. SpringCloud(第 016 篇)电影微服务,定制Feign,一个Feign功能禁用Hystrix,另一个Feign功能启用Hystrix...
  6. CCNP-EIGRP不等价负载均衡
  7. js 通过jquery插件获取url参数 其中的一个小问题,或许不算Bug。
  8. 飞畅科技-图解交换机接口及连接方式
  9. Oracle 数据库、Microsoft SQL Server、MySQL 数据库三种常见数据库的区别深度剖析
  10. Android开发笔记(八十八)同步与加锁
  11. 配置hadoop 使用fair scheduler调度器
  12. java 中使用_java中运算符的使用方法
  13. 要尊重员工的正当权益
  14. Metro程序部署到Surface调试
  15. Java实现将阿拉伯数字转换为中文数字123=》一二三
  16. 高考满分作文《细雨湿衣看不见,闲花落地听无声》 之 金庸新版
  17. 蓝桥杯12题c语言,2012.C语言‘蓝桥杯“预赛.真题.高职
  18. 在Magento产品分类页面创建推荐产品(Featured Products)
  19. 宸展光电拟与宸鸿科技集团合资;Tableau承诺未来五年培养1000万名数据学员 | 全球TMT...
  20. 安装程序无法创建新的系统分区或者无法识别

热门文章

  1. 数组嵌套数组 我在发卡器CPU逻辑里面写过了
  2. 机器人开发--扫地机器人系统的解决方案
  3. Fluent教程—流动进口、出口边界条件
  4. Java 利用EasyPoi做Excel模板的导入导出操作
  5. c语言获取天气信息示例(通过心知天气api获取)
  6. vue: vue2.0 + ts + vuex 项目
  7. kangle二次开发专用API操作接口
  8. SQLMap超详细的用户手册【收藏】
  9. 计算机常见维护(鼠标键盘、不能开机、自动关机、无故重启、运行变慢、蓝屏等问题)
  10. 如何设置计算机断电自启动,如何设置电脑断电后来电自动开机?