Android16 Wifi打开到自动连接的主要日志过程分析介绍
Android16 Wifi打开到自动连接的主要日志过程分析介绍
文章目录
- Android16 Wifi打开到自动连接的主要日志过程分析介绍
- 一、前言
- 二、主要过程的日志分析
- 1、Wifi打开日志
- 2、WiFi扫描
- 3、WiFi选择+连接
- 4、ip分配
- 5、连接完成
- 6、完整的主要信息
- 三、其他
- 1、小结
- 2、wifi详细日志查看
- 3、Android wifi开发调试总结
- 4、 [Android 使用adb操作*WiFi*连接扫描等相关指令](https://blog.csdn.net/wenzhi20102321/article/details/140043930?ops_request_misc=%7B%22request%5Fid%22%3A%22b9bcdcd12b0e28b94f8dbb6db341b9c8%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fblog.%22%7D&request_id=b9bcdcd12b0e28b94f8dbb6db341b9c8&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-140043930-null-null.nonecase&utm_term=wifi)
一、前言
本文简单介绍一下Android16 Wifi打开到自动连接Wifi的过程。
有啥用?
可以看看哪个过程出现问题吧,比如是否调用了Wifi开启;
查看哪个过程不完整,方便进一步定义问题原因。
主要过程有:WiFi打开,WiFi扫描,WiFi选择,WiFi连接,ip分配,连接完成。
有兴趣的可以收藏看看。
本文主要是基于Android16的日志进行查看。
二、主要过程的日志分析
1、Wifi打开日志
Wifi打开日志的关键字是:WifiService
主要标志是WifiService 的 setWifiEnabled ,里面包含哪个应用进行的操作。
下面数主要日志:
//Wifi打开的关键日志:
10-11 09:45:19.834 972 1588 I WifiService: setWifiEnabled package=com.skg.settings uid=1000 enable=true isPrivileged=true//Wifi打开完成的关键日志: //2表示正常打开,3表示打开完成
10-11 09:45:19.976 972 1588 I WifiService: getWifiEnabledState uid=1000 state=2
10-11 09:45:20.210 972 1587 I WifiService: getWifiEnabledState uid=10084 state=3//Wifi扫描日志:
10-11 09:45:20.213 972 1587 I WifiService: startScan uid=1000
10-11 09:45:20.252 972 1300 I WifiService: Receive onDriverCountryCodeChanged to US, update available channel list//Wifi获取到扫描列表日志:
10-11 09:45:24.460 972 1585 I WifiService: getScanResults uid=1000
10-11 09:45:24.461 972 1587 I WifiService: getScanResults uid=10084//获取到保存和连接的Wifi日志:
10-11 09:45:24.507 972 1588 I WifiService: getConfiguredNetworks uid=1000
10-11 09:45:24.521 972 1587 I WifiService: getConnectionInfo uid=10084
即使打开WiFi,未连接过WiFi的情况下,系统后台也是会不定时进行扫描WiFi,可以看到日志:getScanResults
2、WiFi扫描
主要搜索关键字是:WifiScan
主要标志是WifiScanningService的 开始监听Registering和结束监听Unregistering,里面包含哪个应用进行的监听。
//系统监听扫描回调
10-11 09:45:20.238 972 1310 I WifiScanningService: Registering listener= com.android.server.wifi.scanner.WifiScannerInternal$ScanListener@e00758 uid=1000 packageName=null workSource=WorkSource{1000}//开始扫描(系统调用)
10-11 09:45:20.238 972 1310 I WifiScanningService: start scan: ClientInfo[uid=1000, package=null, attributionTag=null, com.android.server.wifi.scanner.WifiScannerInternal$ScanListener@e00758] package null AttributionTag null//开始扫描(系统调用添加监听列表)
10-11 09:45:20.239 972 1310 I WifiScanningService: addSingleScanRequest: ClientInfo[uid=1000, package=null,...//开始扫描(com.skg.settings调用)
10-11 09:45:20.371 972 1310 I WifiScanningService: start scan: ClientInfo[uid=1000, package=com.skg.settings, attributionTag=null, com.android.server.wifi.scanner.WifiScannerInternal$ScanListener@c5f917] package com.skg.settings AttributionTag null
10-11 09:45:20.371 972 1310 I WifiScanningService: addSingleScanRequest: ClientInfo[uid=1000, package=com.skg.settings, ... //结束一次扫描(系统,已获取列表)
10-11 09:45:24.451 972 1310 I WifiScanningService: Unregistering listener= com.android.server.wifi.scanner.WifiScannerInternal$ScanListener@e00758 uid=1000 packageName=null workSource=WorkSource{1000}//结束一次扫描(com.skg.settings已获取列表)
10-11 09:45:24.451 972 1310 I WifiScanningService: Unregistering listener= com.android.server.wifi.scanner.WifiScannerInternal$ScanListener@c5f917 uid=1000 packageName=com.skg.settings workSource=WorkSource{1000}
packageName为null/android的情况,一般是系统framework的扫描监听。
WiFi列表如果要获取到,必须自己的进程监听才能获取;
所以应用扫描并获取WiFi列表的时候,系统framework也会先执行这个操作。
3、WiFi选择+连接
主要搜索关键字是:WifiNetworkSelector、WifiScoreCard、WifiConnectivityManager
可以同时监听上面三个关键字的日志:logcat | grep -E “WifiNetworkSelector|WifiScoreCard|WifiConnectivityManager”
不会很多,但是也不少,从打开到自动连接的过程,大概有上百行日志吧。
下面展示部分关键日志:
//筛选
10-11 09:45:24.479 972 1300 V WifiConnectivityManager: AllSingleScanListener onResults: start network selection
10-11 09:45:24.486 972 1300 D WifiNetworkSelector: "xm5G":4 reason=NETWORK_SELECTION_DISABLED_NO_INTERNET_PERMANENT, count=3; //Wifi评分日志
10-11 09:45:24.498 972 1300 D ThroughputScorer: Score for candidate: SSID: "VPN" BSSID: f8:6f:b0:71:28:5f rssiScore: 48 throughputScore: 108 currentNetworkBoost: 0 securityAward: 40 unmeteredAward: 1000 savedNetworkAward: 500 trustedAward: 1000 notOemPaidAward: 500 notOemPrivateAward: 500 frequencyScore: 0 final score: 3696//正式选择+连接VPN的日志:
10-11 09:45:24.498 972 1300 V WifiConnectivityManager: AllSingleScanListener: WNS candidate-"VPN"
10-11 09:45:24.498 972 1300 V WifiConnectivityManager: connectToNetwork(ConcreteClientModeManager{id=2684546 iface=wlan0 role=ROLE_CLIENT_PRIMARY}): Connect to "VPN" : f8:6f:b0:71:28:5f from Disconnected//wifi在不同状态的更新信息,主要保存上一次连接的wifi,下次打开wifi优先连接。
10-11 09:45:24.499 972 1300 D WifiScoreCard: network update CONNECTION_ATTEMPT "VPN" ID: 340087326 RSSI -43 txSpeed -1
10-11 09:45:24.855 972 1300 D WifiScoreCard: network update SIGNAL_POLL "VPN" ID: 340087326 RSSI -42 txSpeed -1
10-11 09:45:25.110 972 1300 D WifiScoreCard: network update IP_CONFIGURATION_SUCCESS "VPN" ID: 340087326 RSSI -42 txSpeed 270
4、ip分配
主要搜索关键字是:DHCP、DNS
//ip请求开始
10-11 09:45:24.901 1499 3454 D DhcpClient: Broadcasting DHCPREQUEST ciaddr=0.0.0.0 request=192.141.1.43 serverid=null
10-11 09:45:25.070 1499 3454 D DhcpClient: Received packet: d4:9c:dd:f4:f4:b0 ACK: your new IP /192.141.1.43, netmask /255.255.252.0, gateways [/192.141.1.1] DNS servers: /192.141.1.1 , lease time 7200, domain null10-11 09:45:25.075 972 1300 D WifiClientModeImpl[2684882:wlan0]: handleIPv4Success <DhcpResultsParcelable{baseConfiguration: IP address 192.141.1.43/22 Gateway 192.141.1.1 DNS servers: [ 192.141.1.1 ] Domains , leaseDuration: 7200, mtu: 0, serverAddress: 192.141.1.1, vendorInfo: null, serverHostName: , captivePortalApiUrl: null}>//获取到ip
10-11 09:45:25.075 972 1300 D WifiClientModeImpl[2684882:wlan0]: link address 192.141.1.43/22//分配系统网络id
10-11 09:45:25.101 972 1313 D DnsManager: sendDnsConfigurationForNetwork(ResolverParamsParcel{netId: 105,//wifi是否静态ip:DHCP 是普通ip
10-11 09:45:25.102 972 1300 V WifiNetworkSuggestionsManager: mIsSendDhcpHostnameEnabled: true
10-11 09:45:25.102 972 1300 V WifiNetworkSuggestionsManager: IP assignment: DHCP
5、连接完成
主要搜索关键字是:WifiConnectivityManager、ConnectivityService
10-11 09:45:25.103 972 1300 V WifiConnectivityManager: handleConnectionStateChanged: state=connected10-11 09:45:25.112 972 1313 D ConnectivityService: [105 WIFI] EVENT_NETWORK_INFO_CHANGED, going from CONNECTING to CONNECTED
10-11 09:45:25.113 972 1313 W DnsManager: updatePrivateDns(105, PrivateDnsConfig{opportunistic:/[], dohName=, dohIps=[], dohPath=, dohPort=-1})
10-11 09:45:25.113 972 1313 D ConnectivityService: Setting DNS servers for network 105 to [/192.141.1.1]
6、完整的主要信息
//打开wifi
10-11 09:45:19.834 972 1588 I WifiService: setWifiEnabled package=com.skg.settings uid=1000 enable=true isPrivileged=true//Wifi打开完成:
10-11 09:45:20.210 972 1587 I WifiService: getWifiEnabledState uid=10084 state=3//扫描wifi
10-11 09:45:20.371 972 1310 I WifiScanningService: start scan: ClientInfo[uid=1000, package=com.skg.settings, ...//选择+连接wifi
10-11 09:45:24.498 972 1300 D ThroughputScorer: Score for candidate: SSID: "VPN" BSSID: f8:6f:b0:71:28:5f rssiScore: 48 throughputScore: 108 currentNetworkBoost: 0
10-11 09:45:24.498 972 1300 V WifiConnectivityManager: connectToNetwork(ConcreteClientModeManager{id=2684546 iface=wlan0 role=ROLE_CLIENT_PRIMARY}): Connect to "VPN" : f8:6f:b0:71:28:5f from Disconnected//wifi的ip获取分配
10-11 09:45:24.901 1499 3454 D DhcpClient: Broadcasting DHCPREQUEST ciaddr=0.0.0.0 request=192.141.1.43 serverid=null
10-11 09:45:25.070 1499 3454 D DhcpClient: Received packet: d4:9c:dd:f4:f4:b0 ACK: your new IP /192.141.1.43, netmask /255.255.252.0, gateways [/192.141.1.1] DNS servers: /192.141.1.1 , lease time 7200, domain null//获取到ip
10-11 09:45:25.075 972 1300 D WifiClientModeImpl[2684882:wlan0]: link address 192.141.1.43/22//连接完成
10-11 09:45:25.103 972 1300 V WifiConnectivityManager: handleConnectionStateChanged: state=connected
10-11 09:45:25.112 972 1313 D ConnectivityService: [105 WIFI] EVENT_NETWORK_INFO_CHANGED, going from CONNECTING to CONNECTED
可以看到上面的关键字主要包括:wifi、DHCP、DNS、wifi名称、wlan0
整个过程设置到的主要相关类:
//wifi开启
// 1. 用户触发开启 WiFi(如点击开关)
WifiService、WifiController//wifi扫描
WifiService、WifiScanRequestProxy、WifiHAL
// 2. 扫描完成,获取结果
WifiScanner、WifiScanResults//wifi选择+准备连接
ThroughputScorer、WifiConnectivityManager、WifiConfigManager// 2. 准备连接(加载配置,如密码)
WifiConnectivityManager、WifiConfigManager:、WifiStateMachine// 1. 开始连接,状态从 Disconnected 切换到 Connecting
WifiStateMachine、WifiNative// 2. 认证阶段(验证密码)、4次握手
SupplicantStateTracker、wpa_supplicant、SupplicantStateTracker、WifiStateMachine// 启动 DHCP 客户端、分配ip
DhcpClient//网络状态变为可用
WifiStateMachine、ConnectivityService// 通知连接成功
WifiService、ConnectivityManager
上面只是部分相关的,肯定还有很多其他的,具体的可以从日志中查看。
三、其他
1、小结
wifi日志主要的关键字主要包括:wifi、DHCP、DNS、wifi名称、wlan0
WifiService:包含wifi开关日志;
WifiScanningService:包含wifi扫描日志;
WifiConnectivityManager:包含wifi连接日志;
DhcpClient:包含ip分配日志。
上面只是包含主要上层日志,如果需要更加详细的过程日志可以打开“启动WLAN详细日志记录功能“;
2、wifi详细日志查看
Android 如果遇到wifi问题,比如无法联网,连接wifi失败,热点异常等问题;
如果查看wifi相关日志未发现具体异常,可以通过更加详细的wifi日志,
查看wifi具体过程,可以使用“启动WLAN详细日志记录功能:
https://blog.csdn.net/wenzhi20102321/article/details/151860143
3、Android wifi开发调试总结
如果开发wifi相关功能,必须先掌握基本api知识和相关广播的监听;
wifi调用的功能基本都是系统签名权限的系统应用,比如Settings;
本简单介绍wifi开发基本知识,有兴趣的可以看看:
https://blog.csdn.net/wenzhi20102321/article/details/147595608
4、 Android 使用adb操作WiFi连接扫描等相关指令
这里记录下平时使用的cmd wifi 相关指令。
系统初期开发或者定位一下wifi、热点问题会比较有用。
本文不仅详细介绍cmd wifi相关用法,并且后续有介绍系统Java代码中具体控制位置,
如果有特殊需求可以对命令进行扩展定制。
https://blog.csdn.net/wenzhi20102321/article/details/140043930
