ITPub博客

首页 > IT职业 > IT职场 > (五十) Android O WiFi的扫描流程梳理

(五十) Android O WiFi的扫描流程梳理

IT职场 作者:adder 时间:2021-09-09 09:29:04 0 删除 编辑

前言:在之前的WiFi博客中主要梳理了WiFi的启动流程,WiFi启动后给人最直观的感觉就是开始扫描出周围的AP了,那扫描流程是怎么样的呢?


aosp : android O


https://blog.csdn.net/xiaoxiangyuhai/article/details/75159403

这边代码意思是如果正在搜索那么就不重新开始新的scan了,否则tryToStartNewScan()

if (getCurrentState() == mScanningState) {if (activeScanSatisfies(scanSettings)) {mActiveScans.addRequest(ci, handler, workSource, scanSettings);} else {mPendingScans.addRequest(ci, handler, workSource, scanSettings);}} else {mPendingScans.addRequest(ci, handler, workSource, scanSettings);tryToStartNewScan();}

然后看下tryToStartNewScan()

void tryToStartNewScan() {if (mPendingScans.size() == 0) { // no pending requestsreturn;}mChannelHelper.updateChannels();// TODO move merging logic to a schedulerWifiNative.ScanSettings settings = new WifiNative.ScanSettings();settings.num_buckets = 1;WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings();bucketSettings.bucket = 0;bucketSettings.period_ms = 0;bucketSettings.report_events = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;ChannelCollection channels = mChannelHelper.createChannelCollection();List hiddenNetworkList = new ArrayList();for (RequestInfo entry : mPendingScans) {channels.addChannels(entry.settings);if (entry.settings.hiddenNetworks != null) {for (int i = 0; i  0) {settings.hiddenNetworks = new WifiNative.HiddenNetwork[hiddenNetworkList.size()];int numHiddenNetworks = 0;for (WifiNative.HiddenNetwork hiddenNetwork : hiddenNetworkList) {settings.hiddenNetworks[numHiddenNetworks++] = hiddenNetwork;}}channels.fillBucketSettings(bucketSettings, Integer.MAX_VALUE);settings.buckets = new WifiNative.BucketSettings[] {bucketSettings};if (mScannerImpl.startSingleScan(settings, this)) {// store the active scan settingsmActiveScanSettings = settings;// swap pending and active scan requestsRequestList tmp = mActiveScans;mActiveScans = mPendingScans;mPendingScans = tmp;// make sure that the pending list is clearmPendingScans.clear();transitionTo(mScanningState);} else {mWifiMetrics.incrementScanReturnEntry(WifiMetricsProto.WifiLog.SCAN_UNKNOWN, mPendingScans.size());// notify and cancel failed scanssendOpFailedToAllAndClear(mPendingScans, WifiScanner.REASON_UNSPECIFIED,"Failed to start single scan");}}

其中下面这句就是关键了

mScannerImpl.startSingleScan

看下这是个啥:

private WifiScannerImpl mScannerImpl;mScannerImpl = mScannerImplFactory.create(mContext, mLooper, mClock);
public abstract class WifiScannerImpl {/**     * A factory that create a {@link com.android.server.wifi.scanner.WifiScannerImpl}     */public static interface WifiScannerImplFactory {WifiScannerImpl create(Context context, Looper looper, Clock clock);}/**     * Factory that create the implementation that is most appropriate for the system.     * This factory should only ever be used once.     */public static final WifiScannerImplFactory DEFAULT_FACTORY = new WifiScannerImplFactory() {public WifiScannerImpl create(Context context, Looper looper, Clock clock) {WifiNative wifiNative = WifiInjector.getInstance().getWifiNative();WifiMonitor wifiMonitor = WifiInjector.getInstance().getWifiMonitor();if (wifiNative.getBgScanCapabilities(new WifiNative.ScanCapabilities())) {return new HalWifiScannerImpl(context, wifiNative, wifiMonitor, looper, clock);} else {return new WificondScannerImpl(context, wifiNative, wifiMonitor, looper,clock);}}};


接着看下这个factory如何创建的

WifiScanningServiceImpl(Context context, Looper looper,WifiScannerImpl.WifiScannerImplFactory scannerImplFactory, IBatteryStats batteryStats,WifiInjector wifiInjector) {mContext = context;mLooper = looper;mScannerImplFactory = scannerImplFactory;mBatteryStats = batteryStats;mClients = new ArrayMap();mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);mWifiMetrics = wifiInjector.getWifiMetrics();mClock = wifiInjector.getClock();mLog = wifiInjector.makeLog(TAG);mFrameworkFacade = wifiInjector.getFrameworkFacade();mPreviousSchedule = null;}


mImpl = new WifiScanningServiceImpl(getContext(), mHandlerThread.getLooper(),WifiScannerImpl.DEFAULT_FACTORY, BatteryStatsService.getService(),WifiInjector.getInstance());

这里可以看到factory用的是默认实现WifiScannerImpl.DEFAULT_FACTORY

if (wifiNative.getBgScanCapabilities(new WifiNative.ScanCapabilities())) {return new HalWifiScannerImpl(context, wifiNative, wifiMonitor, looper, clock);} else {return new WificondScannerImpl(context, wifiNative, wifiMonitor, looper,clock);}

分别看下这两个实现的startSingleScan方法

1. HalWifiScannerImpl

public boolean startSingleScan(WifiNative.ScanSettings settings,            WifiNative.ScanEventHandler eventHandler) {return mWificondScannerDelegate.startSingleScan(settings, eventHandler);}
mWificondScannerDelegate =new WificondScannerImpl(context, wifiNative, wifiMonitor, mChannelHelper,looper, clock);

2.WificondScannerImpl:这边发现调用到最后两个实现调到一起去了。


原文出处

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1595/viewspace-2803491/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-15

  • 博文量
    110
  • 访问量
    725