首页 > IT职业 > IT职场 > (五十) Android O WiFi的扫描流程梳理
前言:在之前的WiFi博客中主要梳理了WiFi的启动流程,WiFi启动后给人最直观的感觉就是开始扫描出周围的AP了,那扫描流程是怎么样的呢?
aosp : android O
这边代码意思是如果正在搜索那么就不重新开始新的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/ ,如需转载,请注明出处,否则将追究法律责任。