Android13 wifi状态问题分析
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状态问题分析相关推荐
- 【Android 12.0】Android S WiFi启动业务流程分析(UML图)
以下两张为Android S的WiFi启动(start)业务流程UML图,业务流程的过程详情因公司规定不可复制源码出来,所以想看业务流程详情的同学可以参考其他博主所发的博客.业务流程参考内容链接我会放 ...
- 基于Android13的系统启动流程分析(三)之FirstStageMain阶段
Android13系统启动阶段大致分为FirstStageMain阶段和SecondStageMain,此章主要讲FirstStageMain阶段 (若分析有误敬请指教) 本章讲解的方向和你将收获的知 ...
- 基于Android13的系统启动流程分析(六)之SystemServer内部逻辑分析
主要分析一下SystemServer启动过后的内部逻辑,特别说明一下AMS,WMS都属于SystemServer进程,属于同一个进程 一. SystemServer进程启动流程 基于Android13 ...
- Android -- Wifi启动流程分析
Android -- Wifi启动流程分析 Android网络各个模式中,Wifi应该是目前最常用的一种网络方式了:下面就简单介绍下Android中Wifi的启动流程. 当我在Setting菜单里点击 ...
- Android WIFI log基本分析流程
同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦. 1.W ...
- Android WiFi —softAP流程分析
Android WiFi - Ap功能实现与源码分析 0. 前言 wifiAp的ip WifiAp的config分析 2.1 默认的config 2.2 修改wifiAp的config配置流程 开启/ ...
- android控制wifi状态
wifi的五种状态 常量名 常量值 网卡状态 WIFI_STATE_DISABLED 1 WIFI网卡不可用 WIFI_STATE_DISABLING ...
- 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI 状态 | 被动获取 WIFI 状态 )
文章目录 一.获取 WIFI 状态 二.主动获取 WIFI 状态 三.被动获取 WIFI 状态 参考 Google 官方文档 : 优化电池续航时间 一.获取 WIFI 状态 在应用中执行某些操作 , ...
- android编程获取网络和wifi状态及调用网络设置界面,Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面 - Android平台开发技术 - 博客园...
获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...
最新文章
- Nature综述:菌根共生的独特性和共性
- 三十四、段页式管理方式
- SCRUM的三个工件
- WSAStartup函数
- SpringCloud(第 016 篇)电影微服务,定制Feign,一个Feign功能禁用Hystrix,另一个Feign功能启用Hystrix...
- CCNP-EIGRP不等价负载均衡
- js 通过jquery插件获取url参数 其中的一个小问题,或许不算Bug。
- 飞畅科技-图解交换机接口及连接方式
- Oracle 数据库、Microsoft SQL Server、MySQL 数据库三种常见数据库的区别深度剖析
- Android开发笔记(八十八)同步与加锁
- 配置hadoop 使用fair scheduler调度器
- java 中使用_java中运算符的使用方法
- 要尊重员工的正当权益
- Metro程序部署到Surface调试
- Java实现将阿拉伯数字转换为中文数字123=》一二三
- 高考满分作文《细雨湿衣看不见,闲花落地听无声》 之 金庸新版
- 蓝桥杯12题c语言,2012.C语言‘蓝桥杯“预赛.真题.高职
- 在Magento产品分类页面创建推荐产品(Featured Products)
- 宸展光电拟与宸鸿科技集团合资;Tableau承诺未来五年培养1000万名数据学员 | 全球TMT...
- 安装程序无法创建新的系统分区或者无法识别