一、NetworkFactory注册
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiService.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNetworkFactory.java
frameworks/libs/net/common/src_servicescommon/android/net/NetworkFactory.java
frameworks/base/core/java/android/net/ConnectivityManager.java
frameworks/base/services/core/java/com/android/server/ConnectivityService.java

*[SystemServer.java]
├──startOtherServices(@NonNull TimingsTraceAndSlog t)└──if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI))// Wifi Service must be started first for wifi-related services.t.traceBegin("StartWifi");mSystemServiceManager.startServiceFromJar(WIFI_SERVICE_CLASS, WIFI_APEX_SERVICE_JAR_PATH);//启动WifiServicet.traceEnd();t.traceBegin("StartWifiScanning");mSystemServiceManager.startServiceFromJar(WIFI_SCANNING_SERVICE_CLASS, WIFI_APEX_SERVICE_JAR_PATH);//启动WifiScanningServicet.traceEnd();|*[WifiService.java]├──onBootPhase(int phase)└──if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY)createNotificationChannels(mWifiContext);mImpl.checkAndStartWifi();└──else if (phase == SystemService.PHASE_BOOT_COMPLETED)mImpl.handleBootCompleted();|*[WifiServiceImpl.java]├──handleBootCompleted()└──mWifiThreadRunner.post(() -> {mClientModeImpl.handleBootCompleted();})|*[ClientModeImpl.java]*// Make the network factories.mNetworkFactory = mWifiInjector.makeWifiNetworkFactory(mNetworkCapabilitiesFilter, mWifiConnectivityManager);//创建WifiNetworkFactory对象// CHECKSTYLE:OFF IndentationCheckaddState(mDefaultState);addState(mConnectModeState, mDefaultState);addState(mL2ConnectedState, mConnectModeState);addState(mObtainingIpState, mL2ConnectedState);addState(mConnectedState, mL2ConnectedState);addState(mRoamingState, mL2ConnectedState);addState(mDisconnectingState, mConnectModeState);addState(mDisconnectedState, mConnectModeState);// CHECKSTYLE:ON IndentationChecksetInitialState(mDefaultState);*├──handleBootCompleted()└──sendMessage(CMD_BOOT_COMPLETED);├──DefaultState.processMessage(Message message)└──case CMD_BOOT_COMPLETED:└──registerNetworkFactory()├──registerNetworkFactory()└──mNetworkFactory.register()//注册WifiNetworkFactory*[WifiNetworkFactory.java]-->[NetworkFactory.java]//走父类的register方法├──register()└──mProvider = new NetworkProvider(mContext, NetworkFactoryImpl.this.getLooper(), logTag) {@Overridepublic void onNetworkRequested(@NonNull NetworkRequest request, int score,int servingProviderId) {handleAddRequest(request);}@Overridepublic void onNetworkRequestWithdrawn(@NonNull NetworkRequest request) {handleRemoveRequest(request);}};└──((ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).registerNetworkProvider(mProvider);//向ConnectivityManager注册NetworkProvider|*[ConnectivityManager.java]├──registerNetworkProvider(@NonNull NetworkProvider provider)└──int providerId = mService.registerNetworkProvider(provider.getMessenger(),provider.getName());provider.setProviderId(providerId);|*[ConnectivityService.java]├──registerNetworkProvider(Messenger messenger, String name)└──NetworkProviderInfo npi = new NetworkProviderInfo(name, messenger,null /* asyncChannel */, nextNetworkProviderId(),() -> unregisterNetworkProvider(messenger));└──mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_PROVIDER, npi));//发送EVENT_REGISTER_NETWORK_PROVIDER消息├──InternalHandler.handleMessage(Message msg)└──case EVENT_REGISTER_NETWORK_PROVIDER:└──handleRegisterNetworkProvider((NetworkProviderInfo) msg.obj);├──handleRegisterNetworkProvider(NetworkProviderInfo npi)└──mNetworkProviderInfos.put(npi.messenger, npi);└──npi.connect(mContext, mTrackerHandler);├──NetworkProviderInfo.connect(Context context, Handler handler)└──if (isLegacyNetworkFactory())//条件为falsemAsyncChannel.connect(context, handler, messenger);└──elsemessenger.getBinder().linkToDeath(mDeathRecipient, 0);//注册完成

二、NetworkAgent注册
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java
frameworks/base/core/java/android/net/NetworkAgent.java
frameworks/base/core/java/android/net/ConnectivityManager.java
frameworks/base/services/core/java/com/android/server/ConnectivityService.java

*[ClientModeImpl.java]
├──L2ConnectedState.enter()└──mNetworkAgent = new WifiNetworkAgent(mContext, getHandler().getLooper(),"WifiNetworkAgent", nc, mLinkProperties, 60, naConfig,mNetworkFactory.getProvider());├──ClientModeImpl&WifiNetworkAgent -->NetworkAgent.java|*[NetworkAgent.java]├──register()└──mNetwork = cm.registerNetworkAgent(new Messenger(mHandler),//向ConnectivityManager注册NetworkAgentnew NetworkInfo(mInitialConfiguration.info),mInitialConfiguration.properties, mInitialConfiguration.capabilities,mInitialConfiguration.score, mInitialConfiguration.config, providerId);|*[ConnectivityManager.java]├──registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,NetworkCapabilities nc, int score, NetworkAgentConfig config)└──return registerNetworkAgent(messenger, ni, lp, nc, score, config, NetworkProvider.ID_NONE)├──registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,NetworkCapabilities nc, int score, NetworkAgentConfig config, int providerId)└──return mService.registerNetworkAgent(messenger, ni, lp, nc, score, config, providerId)|*[ConnectivityService.java]├──registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,LinkProperties linkProperties, NetworkCapabilities networkCapabilities,int currentScore, NetworkAgentConfig networkAgentConfig, int providerId)└──mDeps.getNetworkStack().makeNetworkMonitor(nai.network, name, new NetworkMonitorCallbacks(nai))├──ConnectivityService&NetworkMonitorCallbacks└──onNetworkMonitorCreated(INetworkMonitor networkMonitor)└──mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT,new Pair<>(mNai.getAndDestroy(), networkMonitor)))├──ConnectivityService&InternalHandler├──handleMessage(Message msg)└──handleRegisterNetworkAgent(arg.first, arg.second)├──handleRegisterNetworkAgent(NetworkAgentInfo nai, INetworkMonitor networkMonitor)└──nai.onNetworkMonitorCreated(networkMonitor)└──networkMonitor.start()//启动NetworkMonitor└──nai.asyncChannel.connect(mContext, mTrackerHandler, nai.messenger)//通过AsyncChannel跨进程建立连接└──mWifiScoreReport.setNetworkAgent(mNetworkAgent);

三、WiFi网络请求
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java
frameworks/base/core/java/android/net/NetworkAgent.java
frameworks/base/services/core/java/com/android/server/ConnectivityService.java
frameworks/base/core/java/android/net/NetworkProvider.java
frameworks/libs/net/common/src_servicescommon/android/net/NetworkFactory.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNetworkFactory.java

frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java
frameworks/base/core/java/android/net/NetworkAgent.java
frameworks/base/services/core/java/com/android/server/ConnectivityService.java
frameworks/base/core/java/android/net/NetworkProvider.java
frameworks/libs/net/common/src_servicescommon/android/net/NetworkFactory.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNetworkFactory.java*[ClientModeImpl.java]
├──ClientModeImpl&ConnectModeState├──enter()└──setupClientMode()└──updateDataInterface()└──mIpClientCallbacks = new IpClientCallbacksImpl()
├──ClientModeImpl&IpClientCallbacksImpl├──onProvisioningSuccess(LinkProperties newLp)└──sendMessage(CMD_UPDATE_LINKPROPERTIES, newLp);└──sendMessage(CMD_IP_CONFIGURATION_SUCCESSFUL);
├──ClientModeImpl&L2ConnectedState├──processMessage(Message message)└──case CMD_IP_CONFIGURATION_SUCCESSFUL:└──sendConnectedState()
├──sendConnectedState()└──mNetworkAgent.markConnected();|*[NetworkAgent.java]├──markConnected()└──queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo);├──queueOrSendMessage(int what, Object obj)└──queueOrSendMessage(what, 0, 0, obj);├──queueOrSendMessage(int what, int arg1, int arg2)└──queueOrSendMessage(what, arg1, arg2, null);├──queueOrSendMessage(int what, int arg1, int arg2, Object obj)└──queueOrSendMessage(msg);├──queueOrSendMessage(Message msg)└──mAsyncChannel.sendMessage(msg);//通过AsyncChannel跨进程与ConnectivityService通信|*[ConnectivityService.java]├──maybeHandleNetworkAgentMessage(Message msg)└──case NetworkAgent.EVENT_NETWORK_INFO_CHANGED:└──updateNetworkInfo(nai, info);├──updateNetworkInfo(NetworkAgentInfo networkAgent, NetworkInfo info)└──rematchAllNetworksAndRequests();├──rematchAllNetworksAndRequests()└──applyNetworkReassignment(changes, now);├──applyNetworkReassignment(@NonNull final NetworkReassignment changes,final long now)└──sendUpdatedScoreToFactories(event.mRequest.request, event.mNewNetwork);├──sendUpdatedScoreToFactories(@NonNull NetworkRequest networkRequest,@Nullable NetworkAgentInfo nai)└──npi.requestNetwork(networkRequest, score, serial);├──ConnectivityService&NetworkProviderInfo├──requestNetwork(NetworkRequest request, int score, int servingProviderId)└──if (isLegacyNetworkFactory())//条件为truemAsyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score,servingProviderId, request);|*[NetworkProvider.java]├──NetworkProvider(@NonNull Context context, @NonNull Looper looper, @NonNull String name)//构造方法└──handler.handleMessage(Message m)└──case CMD_REQUEST_NETWORK:└──onNetworkRequested((NetworkRequest) m.obj, m.arg1, m.arg2);|*[NetworkFactory.java]├──register()//转到NetworkFactory注册中,创建了NetworkProvider对象└──mProvider = new NetworkProvider(mContext, NetworkFactoryImpl.this.getLooper(), logTag) {@Overridepublic void onNetworkRequested(@NonNull NetworkRequest request, int score,int servingProviderId) {handleAddRequest(request);├──handleAddRequest(@NonNull final NetworkRequest request)└──evalRequest(n);├──evalRequest(NetworkRequestInfo n)└──if (shouldNeedNetworkFor(n))//用于判断保留当前的网络连接log("  needNetworkFor");needNetworkFor(n.request, n.score);|*[WifiNetworkFactory.java]├──needNetworkFor(NetworkRequest networkRequest, int score)└──retrieveWifiScanner();//周期性扫描└──startPeriodicScans()└──startScan();└──else if (shouldReleaseNetworkFor(n))//判断需要断开当前网络连接log("  releaseNetworkFor");releaseNetworkFor(n.request);└──elselog("  done");}@Overridepublic void onNetworkRequestWithdrawn(@NonNull NetworkRequest request) {handleRemoveRequest(request);}};└──elsesendMessageToNetworkProvider(NetworkProvider.CMD_REQUEST_NETWORK, score,servingProviderId, request);└──sendNetworkChangeBroadcast(DetailedState.CONNECTED);//发送已经连接成功的广播

Android 11 Wifi之ConnectivityService流程相关推荐

  1. Android 11 WiFi启动流程

    欢迎大家一起学习探讨通信之WLAN.本节重点基于Android11分析讨论WiFi开启流程.用户点击一下"WiFi"开关,WiFi开启了.看似如此简单操作,但系统流程调用还是相当复 ...

  2. Android 11 WiFi开启流程

    从刚接触WiFi时跟过wifi的开启流程,当时还是android9.到了Android11代码架构有了不小的改动,在这里重新梳理一遍,便于在工作中更快速的跟踪代码. 一.Settings里改动不大,还 ...

  3. Android 11 WiFi扫描流程梳理

    上一篇我们梳理了WiFi的开启流程,Android11 WiFi开启流程,在最后我们说到ActiveModeWarden中注册了ClientListener监听器.我们接着这个逻辑继续梳理一下打开Wi ...

  4. Android P WiFi的 Disconnect 流程 汇总

    文章目录 WiFi 断开Flow框架 1. wifi 断开原因总结 2. wifi 断开处理流程 代码流程 1. wpa_supplicant 部分 2. wpa_supplicant --> ...

  5. (七十一)Android O WiFi热点 开启流程梳理

    前言:之前主要梳理了WiFi开启扫描连接的流程,现在梳理下WiFi 热点 的开启流程. 时序图mdj样式:https://download.csdn.net/download/sinat_200594 ...

  6. (九十七)Android O WiFi热点 开启流程梳理续(二)

    前言:从之前WiFi的连接流程可以知道WiFi最后一步会和服务端进行dhcp以获取ip地址,那么WiFi热点开启的时候应该也要配置相关dhcp属性,以供后续WiFi连接的时候ip分配,根据这块流程继续 ...

  7. 全志平台Android系统WIFI架构工作流程分析

    1. 前言 记录个人最近对Android wifi的了解和使用感受, 并为想入门.学习Android wifi的人员提供一定的参考 2. Android系统中的WIFI架构 wifi在Android中 ...

  8. (一百四十四)Android P WiFi 上网校验流程梳理

    前言:本文采用倒叙梳理,之前梳理流程没记下来忘了,现在再来一遍,所以说梳理什么的还是做个备忘比较好. 1.ConnectivityService 看网络校验相关log经常能看到如下log打印 log( ...

  9. Android WiFi 打开关闭流程

    本文简单介绍下WiFi打开与关闭流程,参考源码Android P. 一.WiFi 开机自动打开流程 系统服务启动的时候会启动WifiService,在SystemService.PHASE_SYSTE ...

最新文章

  1. C#动态加载DLL(转)
  2. 跟阿里云技术专家阙寒一起深度了解视频直播CDN技术
  3. Windows文件被占用解决办法
  4. mysql创建表格1warning_MySQLMySQL创建表及相关约束
  5. 移动端网页特效:左右滑动开关
  6. jquery ajax 滚动加载数据
  7. Kotlin 和Spring WebFlux
  8. i红枣 建议:程序员要多吃点红枣
  9. 玩个锤子,李飞飞夫妇团队的最新研究
  10. ps、ai、cdr2021平面设计三大软件的区别有哪些?
  11. JavaScript函数思维导图
  12. 电脑接收,怎么在电脑上发传真 在电脑上接收传真方法介绍【详细步骤】
  13. matlab导入数据文件,matlab怎么导入mat数据文件
  14. 核桃的营养价值,核桃的功效与作用
  15. 输电线缺陷检测 计算机工程与设计,小波去噪和混沌理论应用于输电线缺陷检测-计算机工程与应用.pdf...
  16. springboot2 druid监控控制台去掉下面的图片广告和powered by
  17. [译]OOSE第7章:Analysis 分析 7.3 The analysis model 分析模型 7.4 Summary
  18. c++17文件系统<filesystem>
  19. 系统可用性分析方法与设计模板
  20. 【项目精选】基于Web的机票预订系统

热门文章

  1. VS2019添加类设计器组件
  2. python测试脚本 进制转换器_进制转换(用Python实现进制转换器)
  3. Django计算机毕业设计Sketch2Mod网站(程序+LW)Python
  4. 新改版代shua网源码 已对接艾K支付 附25套模板
  5. 怎么测ASEMI整流桥KBPC3510W电压,KBPC3510W怎么判别好坏
  6. 内网穿透工具EW的简单使用(附内网环境实现)
  7. [小技巧]chrome 标签切换快捷键
  8. MybatisPlus_${ew.sqlSelect},${ew.sqlSet},${ew.sqlSegment},${ew.customSqlSegment}的使用
  9. qt链接mysql文件失败_【成功经验】QT读取access 2010的.accdb文件总是失败
  10. jdk版本8u201 8u202 区别