Android13 wifi状态问题分析

这篇具有很好参考价值的文章主要介绍了Android13 wifi状态问题分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android13 wifi状态问题分析

一、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.195

04-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.java

import android.os.SystemProperties;
import android.util.Log;

    private static boolean isSuccessCode(int responseCode) {
        boolean isNotCheckNetWork = SystemProperties.getBoolean("persist.sys.not_monitor", true); //默认为 true
        Log.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文章来源地址https://www.toymoban.com/news/detail-427330.html

//Android 13  WifiServiceImpl 是放到package 下面了!
packages\modules\Wifi\service\java\com\android\server\wifi\WifiServiceImpl.java

    public void checkAndStartWifi() {
        mWifiThreadRunner.post(() -> {
            if (!mWifiConfigManager.loadFromStore()) {
                Log.e(TAG, "Failed to load from config store");
            }
            。。。
            // Check if wi-fi needs to be enabled
            boolean wifiEnabled = mSettingsStore.isWifiToggleEnabled();
            
            //这里默认会打印wifi 开关状态,其实就是setting.global_wifi_on 的属性值!
            Log.i(TAG, "WifiService starting up with Wi-Fi " + (wifiEnabled ? "enabled" : "disabled")); 
            。。。
        }
    }

到了这里,关于Android13 wifi状态问题分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android的WIFI和以太网连接状态

    在一些 Android 设备上同时具有以太网和Wifi网络连接 我们可以使用 ConnectivityManager 类来判断设备的网络状态。以下是一个 Kotlin 示例,说明了如何检查网络连接状态以及连接类型(例如 Wi-Fi 或移动数据):

    2024年02月16日
    浏览(56)
  • Rockchip Android13 x3588蓝牙wifi/bt调试心得

    x3588的wifi/bt使用的是外挂双模模块,根据数据通信接口的差异分为PCIE和SDIO两种。 x3588使用的是SDIO接口双模模块:AP6398S。 参考rockchip android13: rk3588-x3588-sdk.dts 蓝牙配置: uart的rts脚:UART_CTS_N 复位脚:BT_REG_ON-BT_REG_ON_S-BT_REG_ON_H CPU唤醒蓝牙GPIO:脚:BT_WAKE 蓝牙唤醒CPU模块的GPI

    2024年02月15日
    浏览(137)
  • 【Android13开发WIFI添加频段设置项(2.4G/5G/automatic)更改笔记】

    提示:这里简述项目相关背景: Android13中客户需求添加WIFI频段选项: 2.4G only,只显示链接2.4G的AP。 5G only,只能显示和链接5G的AP。 Automatic:自动显示,即全部正常显示。 提示:这里描述项目中遇到的问题: 作为初学者的我,刚开始接到这个bug,还是比较懵的,多亏了CSDN的前辈

    2024年02月05日
    浏览(44)
  • Android 13.0 SystemUI下拉状态栏背景增加高斯模糊背景

    在13.0的产品开发中,发现现在很多产品都是高斯模糊背景的,这种高斯模糊背景看起来效果很不错,产品开发需要SystemUI下拉状态栏背景也是高斯模糊背景,所以就要来实现下拉状态栏高斯模糊背景 在系统systemui,其实它的布局结构是比较复杂,里面管理各种服务,导航栏,

    2024年02月05日
    浏览(164)
  • android 13.0 SystemUI状态栏下拉快捷添加截图快捷开关

    在13.0的系统产品rom定制化开发中,对SystemUI的定制需求也是挺多的,在下拉状态栏中 添加截图快捷开关,也是常有的开发功能,下面就以添加 截图功能为例功能的实现 在Systemui的下拉状态栏的相关源码中,在快捷设置区域QSPanel及点击事件流程 分析 SystemUI下拉之后的那些快捷

    2024年02月03日
    浏览(63)
  • Android 11.0 SystemUI 去掉状态栏wifi流量上下行图标功能实现

      在11.0系统定制rom开发中,在关于systemui的定制功能总,在SystemUI 状态栏上显示时钟,电池电量 wifi图标,在显示wifi图标时,网络实时更新时,但是会时不时显示上下行图标 显得很不美观,客户需求要求不显示上下行图标,所以需要去掉上下行图标功能,接下来实现相关功能开

    2024年02月04日
    浏览(60)
  • Android 13 定制化开发--开启相机或麦克风时,去掉状态栏上的绿色图标

     Android 12 或更高版本的设备上,当应用使用麦克风或相机时,图标会出现在状态栏中。如果应用处于沉浸模式,图标会出现在屏幕的右上角。用户可以打开“快捷设置”,并选择图标以查看哪些应用当前正在使用麦克风或摄像头。图 1 显示了包含图标的示例屏幕截图。 需求

    2024年04月24日
    浏览(82)
  • Android 13.0 SystemUI下拉状态栏定制二 锁屏页面横竖屏时钟都居中功能实现一

    在13.0的系统rom定制化开发中,在关于systemui的锁屏页面功能定制中,由于在平板横屏锁屏功能中,时钟显示的很大,并且是在左旁边居中显示的, 由于需要和竖屏显示一样,所以就需要用到小时钟显示,然后同样需要居中,所以就来分析下相关的源码,来实现具体的功能 在

    2024年01月17日
    浏览(60)
  • Android 13 SystemUI 屏蔽导航栏;屏蔽锁屏;隐藏状态栏;禁止状态栏下拉;屏蔽Camera绿色图标;屏蔽原生音量条;屏蔽原生亮度条。

    写在前面:本文给出Android 13 手机/平板原生SystemUI 一些实用的屏蔽补丁。 1、屏蔽导航栏   导航栏屏蔽很简单,直接把创建导航栏的代码屏蔽即可。 2、屏蔽锁屏 3、隐藏状态栏 4、禁止状态栏下拉   解锁之后禁止状态栏下拉显示快捷通知、快捷设置。 5、屏蔽Camera绿色图

    2024年04月17日
    浏览(178)
  • Android 13.0 SystemUI下拉状态栏定制二 锁屏页面横竖屏通知栏都居中功能实现

    在13.0的系统rom定制化开发中,在关于systemui的锁屏页面功能定制中,由于在平板横屏通知栏功能中,通知栏总是显示在右边,并且是在右边居中显示的, 由于需要和竖屏显示一样,所以就需要用到在时钟下面显示通知栏,然后同样需要居中显示通知栏,所以就来分析下相关的

    2024年02月20日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包