锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Android-WIFI笔记整理(二)

时间:2022-10-30 20:30:00 3917连接器

1、AP上传扫描结果setting流程(此处为自上而下调流程)(可参考2、节中3.节以配合理解分析!
WifiSettings.java->onWifiStateChanged(int state) updateAccessPointPreferences();(Called when the state of Wifi has changed)
WifiSettings.java->updateAccessPointPreferences accessPoints = mWifiTracker.getAccessPoints();>
WifiTracker.java->getAccessPoints (mInternalAccessPoints);>
用到并更新mInternalAccessPoints的地方:
WifiTracker.java->updateAccessPoints
调用到updateAccessPoints的地方:
WifiTracker.java->fetchScansAndConfigsAndUpdateAccessPoints
在执行updateAccessPoints(filteredScanResults, configs);以下操作以前进行过:
WifiTracker.java->fetchScansAndConfigsAndUpdateAccessPoints newScanResults = mWifiManager.getScanResults();>
调用fetchScansAndConfigsAndUpdateAccessPoints的地方:
WifiTracker.java->final BroadcastReceiver mReceiver

WifiTracker.java->newScanResults = mWifiManager.getScanResults()
BaseWifiService.java->getScanResults(...)
WifiServiceImpl.java->getScanResults(...)
ScanRequestProxy.java->getScanResults()
(即最后从ScanRequestProxy.java获取扫描结果,如何获得????)
2、AP扫描流程(android P-亮屏setting下-wifi成功开启后,流程基本适用android Q,每10秒扫描结果上传一次!见本节2.节)
(实抓日志:
12-04 14:48:40.506 862 1409 D WificondControl: get 21 scan results from wificond
12-04 14:48:50.287 862 1409 D WificondControl: get 21 scan results from wificond

补充:android P-亮屏setting连接扫描的热点后,将继续扫描wifi,即
WifiSettings.java->onSubmit(...)->submit(...)->mWifiTracker.resumeScanning();->mScanner.resume();->...(后续参考如下
详细流程)

1.WiFi成功开启后,ClientModeStateMachine由CMD_START转换到StartedState。StartedState 状态机,正在更新wifiState发送广播
WifiManager.WIFI_STATE_CHANGED_ACTION , 通知WifiTracker开始进行Scan,即:

ClientModeManager.java-> private class StartedState extends State->onUpChanged WifiManager.WIFI_STATE_ENABLED);>
->updateWifiState

2.WifiTracker 广播监听到WifiManager.WIFI_STATE_CHANGED_ACTION ,执行updateWifiState

WifiTracker.java->final BroadcastReceiver mReceiver = new BroadcastReceiver() ->
        ->
        handleMessage(...)->mWifiManager.startScan()
        sendEmptyMessageDelayed(MSG_SCAN, WIFI_RESCAN_INTERVAL_MS);(WIFI_RESCAN_INTERVAL_MS=10*1000,即谷歌原生默认在亮屏settings界面下,
        扫描周期为10s,此处相当于延时10s,10s之后再将消息发送出去,而后再触发WifiTracker.java->handleMessage(...),执行
        mWifiManager.startScan(),如此往复循环而已!)
            WifiManager.java startScan(null)
                WifiServiceImpl.java->startScan 
                    ScanRequestProxy.java->startScan(...)
                        WifiScanner.java->startScan(...)
                            WifiScanningServiceImpl.java->class DriverStartedState extends State->processMessage(...)                             ->mScannerImpl.startSingleScan(...)>
                                WifiScannerImpl.java->public abstract boolean startSingleScan(...)  (注意:此类为抽象类)
                                WificondScannerImpl.java(WificondScannerImpl extends WifiScannerImpl)->startSingleScan mWifiNative.scan(...)
                                    WifiNative.java->scan
                                        WificondControl.java->scan
                                                                    
                                            scanner_impl.cpp->ScannerImpl::scan(...) Scan()>
                                                scan_utils.cpp->bool ScanUtils::Scan(...) ->trigger_scan(...,NL80211_CMD_TRIGGER_SCAN,...)
                                                注意:scan_utils (通过netlink,此处不能误解!!!此文件会包含和"
                                                    wificond/net/netlink_manager.h") 将 NL80211_CMD_TRIGGER_SCAN直接传递给内核wlan驱动
                                                    (而不是wpa_supplicant!!!此处实现传递的具体流程还需要验证!!!(已验证!))
                                                    (具体流程:(/system/connectivity/wificond/scanning/scan_utils.cpp)
                                                        NL80211Packet trigger_scan(
                                                            netlink_manager_->GetFamilyId(),
                                                            NL80211_CMD_TRIGGER_SCAN,
                                                            netlink_manager_->GetSequenceNumber(),
                                                            getpid());
                                                            ...
                                                            netlink_manager_->SendMessageAndGetAckOrError(trigger_scan,error_code)
                                                            (注意:此处只返回ERROR/ACK,而不是具体的扫描结果!!!)
                                                    )    
                                                (driver_nl80211_event.c)
                                                (扫描结束后先后上传如下日志:(可参考3.节进行分析!)
                                                    wpa_supplicant: nl80211: Drv Event 34 (NL80211_CMD_NEW_SCAN_RESULTS) received for wlan0
                                                    (此处34并不表示扫描结果数量)
                                                    HAL:event received NL80211_CMD_NEW_SCAN_RESULTS)
                                                
        3.扫描结果回传(PNO扫描结果的回传流程类似)
            wlan driver扫描结束后会发出NL80211_CMD_NEW_SCAN_RESULTS的广播命令(具体广播位置与流程待深究!!!),
            此处前面处理分析过程为wificond部分:(wpas部分有待深究?!!)
            netlink_manager.cpp->NetlinkManager::BroadcastHandler(...)会对其进行处理:
            netlink_manager.cpp->NetlinkManager::OnScanResultsReady(...) 此处具体下操作三步操作:
                <1>向wlan driver发送NL80211_ATTR_SCAN_SSIDS以获取WiFi名称SSID
                
                <2>向wlan driver发送NL80211_ATTR_SCAN_FREQUENCIES以获取该SSID下对应的频率(即对应信道!!!)
                GetAttribute(NL80211_ATTR_SCAN_FREQUENCIES, &freqs_attr);freqs_attr.GetListOfAttributeValues(&freqs)>
                (以上两条命令皆是定义在nl80211.h中)
                <3>最后将扫描结果通知上层至scanner_impl.cpp(具体如何通知到上层???如何到达scanner_impl.cpp中?)
                handler->second(if_index, aborted, ssids, freqs);//Run scan result notification handler.
                
                其后scanner_impl.cpp进行如下操作:std::bind(&ScannerImpl::OnScanResultsReady, this, _1, _2, _3, _4),继而:                
                scanner_impl.cpp->ScannerImpl::OnScanResultsReady(...)
                    scan_event_handler_->OnScanResultReady();(此hander即为WificondControl.java中的private class ScanEventHandler
                    extends IScanEvent.Stub)
                        WificondControl.java->class ScanEventHandler->OnScanResultReady()->mWifiMonitor.broadcastScanResultEvent(iface, SCAN_RESULTS_EVENT);
                    注意:WificondControl.OnScanResultReady 上报 WifiMonitor,然后大致的扫描过程如下:
                        WifiMonitor -> WificondScannerImpl --> WifiScaningServiceImpl->WifiService -->
                        WifiTracker --> WifiSettings 刷新扫描结果
                        此处为过程详解:
                        WifiMonitor.java->broadcastScanResultEvent(String iface)
                            然后:(WificondScannerImpl的handle收到此事件!)
                            WificondScannerImpl.java->handleMessage(Message msg) (取消定时器)
                                                             (通过AIDL从wificond中先获取当前扫描结果,此处获取貌似没有任何意义?!!)
                                ->mNativeScanResults = mWifiNative.getScanResults(mIfaceName);->mWificondControl.getScanResults();->scannerImpl.getScanResults();
                                (此处WificondControl.getScanResults()中会打印类似“get 16 scan results from wificond”的日志!)
                                (若mLastScanSettings.singleScanEventHandler不为空,则发送CMD_SCAN_RESULTS_AVAILABLE,何意???)
                                ->mLastScanSettings.singleScanEventHandler.onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);>
                            (此WIFI_SCAN_RESULTS_AVAILABLE定义于WifiNative.java->public static final int WIFI_SCAN_RESULTS_AVAILABLE = 0;
                            而非nl80211.h中所创建的命令!nl80211.h中的cmd应该是专门发往wlan驱动或驱动发来用的!!!)
                                然后(上面发送WIFI_SCAN_RESULTS_AVAILABLE):
                                WifiScanningServiceImpl.java->class WifiSingleScanStateMachine->onScanStatus(...)
                                ->class WifiSingleScanStateMachine->class ScanningState->processMessage(Message msg) reportScanResults(
                                mScannerImpl.getLatestSingleScanResults());->entry.reportEvent(WifiScanner.CMD_SCAN_RESULT, 0, parcelableAllResults);
                                
                                    WifiScanner.java->class ServiceHandler->handleMessage(Message msg) <((ScanListener) listener).onResults(
                                    ((ParcelableScanData) msg.obj).getResults());>
                                     public interface ScanListener extends ActionListener->onResults(ScanData[] results);(接口定义)
                                    
                                        ScanRequestProxy.java->GlobalScanListener implements WifiScanner.ScanListener->onResults(...)
                                        ->mLastScanResults.addAll(Arrays.asList(scanResults));(保存扫描结果,该结果会被上层调用!!!)
                                        ->sendScanResultBroadcast(true);->                                         sendBroadcastAsUser(intent, UserHandle.ALL);>(发送广播SCAN_RESULTS_AVAILABLE_ACTION,以提醒上层的WifiTracker
                                            wifi扫描已经完毕,可以获取扫描结果了!对应1、节中的WifiTracker.java->final BroadcastReceiver
                                            mReceiver,即广播接收器)
    3、AP扫描流程(android P-非setting界面,亮屏/屏,且有保存网络时-此保存网络是指配置文件是否已有保存的网络)
        (/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java)
        WifiConnectivityManager.java->handleScreenStateChanged(boolean screenOn) startConnectivityScan(SCAN_ON_SCHEDULE);
        若此时屏幕仍处于亮屏状态:(默认扫描最小间隔min=20s, 最大间隔max=160s,3917已经得到验证!)
            ->startPeriodicScan(scanImmediately);->startPeriodicSingleScan();->startSingleScan(isFullBandScan, WIFI_WORK_SOURCE);
        若此时屏幕处于灭屏状态:    (PNO扫描)
            ->startDisconnectedPnoScan(); (有保存网络-此保存网络是指配置文件是否已有保存的网络,但未连接,则开启PNO扫描,且默认最小
            间隔min=20s,最大间隔max=20s*3=60s3917实际验证时并得到效果!!!)
    补充:Android Wi-Fi扫描机制(Android P)
        Android P的扫描场景可以归结为以下四种:
        1.亮屏情况下,在Wifi settings界面,固定扫描,时间间隔为10s
        2.亮屏情况下,非Wifi settings界面,二进制指数退避扫描,退避:interval*(2^n), 最小间隔min=20s, 最大间隔max=160s
        3.灭屏情况下,有保存网络时,若已连接,不扫描,否则,PNO扫描,即只扫描已保存的网络。最小间隔min=20s,最大间隔max=20s*3=60s
        (PNO 即Preferred Network Offload,用于系统在休眠的时候连接WiFi)    
        4.无保存网络情况下,固定扫描,间隔为5分钟,用于通知用户周围存在可用开放网络。(第四种情况属于Android O的逻辑,因为在P的代码里还
            没有找到关于这个扫描的代码,也可能取消了!!!)
    4、wifi开启流程(android 9.0 即P)
        大致的描述过程如下:
            WIfiEnabler->WifiManager->WifiService->WifiServiceImpl->WIfiStateMachinePrime->WIfiStateMachine->WifiNative
        此处为详解:
        1.在wifisettings activity的onStart函数中,创建一个WifiEnabler对象,用于实现wifi开关功能
        WifiSettings.java->onStart()
        2.WifiEnabler实现了SwitchWidgetController.OnSwitchChangeListener接口,所以重写了onSwitchToggled方法。WifiEnabler开关
            onSwitchToggled中会调用WifiManager.setWifiEnabled方法
        WifiEnabler.java->onSwitchToggled(boolean isChecked)
            WifiManager.java->setWifiEnabled(...)
        3.WifiServiceImpl中实现WifiManager的方法,在setWifiEnabled函数中向WifiController发消息:CMD_WIFI_TOGGLED
                WifiServiceImpl.java->setWifiEnabled(...)
                    class StaDisabledState->processMessage(Message msg)
                        class DeviceActiveState->enter()
        3.执行enterClientMode函数,给ModeStateMachine状态机发送CMD_START_CLIENT_MODE消息
        WifiStateMachinePrime.java->enterClientMode() mModeStateMachine.sendMessage(newMode);>
            class ModeStateMachine->checkForAndHandleModeChange(Message message)
                class ClientModeActiveState->enter()
                    ActiveModeManager.java->interface ActiveModeManager (此处仅是一个接口)
        4.ClientModeManager!!!里首先是调用了start函数,发送消息CMD_START给ClientModeStateMachine,消息是IdleState进行处理
        ClientModeManager.java->ClientModeManager implements ActiveModeManager->start() mStateMachine.sendMessage(ClientModeStateMachine.CMD_START);
            class IdleState->processMessage(Message message)
        5.setupInterfaceForClientMode的相应处理
        WifiNative.java->setupInterfaceForClientMode(...)
                                             (启动HAL,加载wlan.ko,即wlan driver!!!)
                mWifiVendorHal.startVendorHal()
                    WifiVendorHal.java->startVendorHal() (该层日志打印标签为WifiVendorHal)
                        HalDeviceManager.java->start() WifiStatus status = mWifi.start();> (注:private IWifi mWifi;)
                        (IWifi即代表IWifi.hal,包含在/hardware/interfaces/wifi目录下,至此通过某种交互方式,如JNI、AIDL或HIDL,进入HAL层。
                            在编译后会自动产生IWifi.java文件(此处使用AIDL机制生成),之前通过mifi调用的接口都是通过它实现的)
                        (该层日志打印标签为isHalDevMgr)
                        (而HAL层的文件,一般放在hardware的wifi_hal目录下,其日志标签为WifiHAL,也算是wifi日志中最底层的信息了!)
                        (在IWifi.java->getService->asInterface中可找到IWifi对应的服务端为:wifi.cpp 如通常保存路径为:
                            /hardware/interfaces/wifi/1.3/default/,1.3可视为版本号)
                                        (通过init的.rc或者WPAS的HIDL启动supplicant,最终都是以service形式起来!)
                (非加载驱动,具体用处待定???)
                (启动WifiMonitor)
        补充:(android Q中5.处处理方法对应:WifiNative.java->setupInterfaceForClientInConnectivityMode(...))
             -> mWifiVendorHal.startVendorHal()  (此处加载驱动的地方,具体流程如下:!!!详情可见:
            https://blog.csdn.net/nilingxi/article/details/103311159)
            (/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java)
                 ->
                (/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiVendorHal.java)
                     -> ->      -> ->
                                                            (注:此处getService就是获取android.hardware.wifi@1.0-service,而
                                                            android.hardware.wifi@1.0-service就是我们编译生成的结果,WiFi Service层会通
                                                            过这个服务来与我们的WiFi Hal层进行通信!!!)
                                                             (下述是紧跟着start走的!)
                    (/frameworks/opt/net/wifi/service/java/com/android/server/wifi/HalDeviceManager.java)
                         -> -> -> initialize()>
                        (/hardware/interfaces/wifi/1.3/default/wifi.cpp)
                             -> LoadDriver()>
                            (/hardware/interfaces/wifi/1.3/default/wifi_mode_controller.cpp)
                                 ->
                                (/frameworks/opt/net/wifi/libwifi_hal/driver_tool.cpp)
                                     ->
                                    (/frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp)
                                                            (启动supplicant)
                    (开启wificond服务,Setup interface for client mode via wificond)
                                (Setup a STA interface for the specified iface name)
            (注:此处interface为何要安装两次???)
                                    (启动WifiMonitor)                
    5、Android P wifi连接流程
        1.WifiSettings.java->onSubmit(WifiDialog dialog) connect(...);->mWifiManager.
        connect(config, mConnectListener);>
            WifiManager.java->connect(...)             putListener(listener), config);>
                WifiServiceImpl.java->class ClientHandler->case WifiManager.CONNECT_NETWORK                 (Message.obtain(msg));>
                    (注意:android Q中此处不再用WifiStateMachine.java,而是用ClientModeImpl.java!!!,此处可具体情况具体分析)
                    WifiStateMachine.java->class ConnectModeState->connectToUserSelectNetwork(...)
                    sendMessage(CMD_START_CONNECT, networkId, uid, bssid);>
        2.从save network 连接热点又一次转化, 转为CMD_START_CONNECT送到内部状态机(ConnectModeState )处理送到WifiNative 进行处理
        Connect
        WifiStateMachine.java->class ConnectModeState->processMessage(Message message)         config)>
        3.WifiNative –> SupplicantStaIfaceHal -> SupplicantStaNetworkHal -> WifMonitor(关联阶段)
            SupplicantStaIfaceHal -> SupplicantStaNetworkHal添加网络,select(实则通过hidl将connect 传给到 wpa_supplicant)
            wpa_supplicant完成一系列与路由器的之间的beacon帧(probe、assoc(之前还要完成必要的authentication)、4way-handshake 、
                group-handshake)后,再能取到路由器的颁发的认可证(既是拿到最后的compelted)
            最后,通过wifiMonitor上报wpa_supplicant 任务已完成,既是完成连接的第一阶段(关联阶段)
            WiFiMonitor上报的事件是,NETWORK_CONNECTION_EVENT (又一次回到WifiStateMachine)
        4.获取IP阶段
            WifMonitor --> WifiStateMachine
            WifiStateMachine.java->class ConnectModeState->processMessage(Message message) case WifiMonitor.NETWORK_CONNECTION_EVENT:
            sendNetworkStateChangeBroadcast(mLastBssid);transitionTo(mObtainingIpState);
            class ObtainingIpState->enter()
                setNetworkDetailedState(DetailedState.OBTAINING_IPADDR);
                clearTargetBssid("ObtainingIpAddress");
                stopIpClient();
                mIpClient.setHttpProxy(currentConfig.getHttpProxy());
                IpClient.buildProvisioningConfiguration();
            注:ObtainingIpState 获取IP 的流程中规中矩,先是update 系统的State
                停掉IpClient (自从Android N 后,获取IP已废弃了dhcpd,扶持了另一位的IpClient 、IpManager来完成自己的事业 !!!)
                清掉bssid以避免其影响到漫游导致断链
                Ipclient 开始接管舞台(启动获取IP) (此处dhcp协议,后续学习并更新)
                
    6、wifi关闭流程(android Q-3917)
        由前面4、节可知framework层提供的wifi开关接口都是setWifiEnabled,只是参数不同而已。true表示开启wifi、false表示关闭wifi。
        WifiEnabler.java->onSwitchToggled(boolean isChecked) ->
            WifiManager.java->setWifiEnabled(...)
                WifiServiceImpl.java->setWifiEnabled(...)     
                    (wifi开启的时候,WifiController中状态为DeviceActiveState(其父状态为StaEnabledState),故
                    以下是StaEnabledState对CMD_WIFI_TOGGLED消息的处理)
                    class StaEnabledState processMessage(...)->CMD_WIFI_TOGGLED:transitionTo(mStaDisabledWithScanState);或transitionTo(mStaDisabledState);
                        (注:isWifiToggleEnabled为false表示要关闭wifi,则将状态切换到StaDisabledWithScanState(如果可以一直扫描)或
                        ApStaDisabledState。下面主要看切换到ApStaDisabledState状态的流程操作)
                    class StaDisabledState enter()->mActiveModeWarden.disableWifi();
                    ActiveModeWarden.java->changeMode(ModeStateMachine.CMD_DISABLE_WIFI);
                        class ModeStateMachine checkForAndHandleModeChange(...)->mModeStateMachine.transitionTo(mWifiDisabledState);
                        class WifiDisabledState enter()->空空如也,有待深究???
    7、热点开启流程(到WifiNative层,android Q验证所得结果!)
        ./packages/apps/Settings/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
            ->onSwitchToggled mWifiManager.isWifiApEnabled()+startTether();
                ->startTether mConnectivityManager.startTethering
        ./frameworks/base/core/java/android/net/ConnectivityManager.java
        ./frameworks/base/services/core/java/com/android/server/ConnectivityService.java
        ./frameworks/base/services/core/java/com/android/server/connectivity/Tethering.java
        ./frameworks/base/wifi/java/android/net/wifi/WifiManager.java
        ./frameworks/base/wifi/java/com/android/server/wifi/BaseWifiService.java
        ./frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
        ./frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java

        ./frameworks/opt/net/wifi/service/java/com/android/server/wifi/ActiveModeWarden.java
        ./frameworks/opt/net/wifi/service/java/com/android/server/wifi/ActiveModeManager.java  (interface)
        ./frameworks/opt/net/wifi/service/java/com/android/server/wifi/SoftApManager.java
        ./frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java
        ./frameworks/opt/net/wifi/service/java/com/android/server/wifi/SoftApManager.java
        ...
        注意:具体可参加见log验证结果截图-tetherOpen
        
        SoftApManager.java的处理:
        SoftApManager!!!里首先是调用了start函数,发送消息CMD_START给SoftApStateMachine,消息是IdleState进行处理
        1、    mApInterfaceName = mWifiNative.setupInterfaceForSoftApMode(...),如下:
        (android Q中WifiNative处理方法对应:WifiNative.java->setupInterfaceForSoftApMode(...))
         -> mWifiVendorHal.startVendorHal() (此处加载驱动的部分基本与本篇.4节中STA模式下开启wifi时所分析的流程一致!)
                                                        (通过hostapd的HIDL启动Hostapd,最终是以service形式起来!)
                (开启wificond服务,Setup interface for softAp mode via wificond)
        以上完成了加载驱动和通过hostapd安装接口的部分,后续开始按所提供的配置开启AP:
        2、result = startSoftAp((WifiConfiguration) message.obj);
            
        
    注意:Android 基本套路大框架还是不变的: apps – services – native – drv(kernel)!!!(此处不包括services通过wificond与drv交互的情况!)
    
    8、HandlerThread("WifiService")线程的创建与使用(有何用???)
        (注:类似这样的线程还有:ClientModeImpl、WifiP2pService,都是在WifiInjector.java中定义!)
        (/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiInjector.java)
        class WifiInjector:
            mWifiServiceHandlerThread = new HandlerThread("WifiService");(注:HandlerThread extends Thread !)
            mWifiServiceHandlerThread.start();    (启动该线程)
            getWifiServiceHandlerThread()->return mWifiServiceHandlerThread;
        (/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java)
        public WifiServiceImpl():
            HandlerThread wifiServiceHandlerThread = mWifiInjector.getWifiServiceHandlerThread(); (线程实例的创建)
            mClientModeImplHandler = new ClientModeImplHandler(TAG, wifiServiceHandlerThread.getLooper(), asyncChannel); (handle实例的创建)
            (注:ClientModeImplHandler extends WifiHandler,而HandlerThread extends Thread!在ClientModeImplHandler中
            handleMessage(Message msg)一般会被重写!)
    9、android wifi信号强度与图标对应关系
        android中wifi分为5个等级,对应的图标是0格,1格,2格,3格,4格.
        根据wifimanager中的算法calculateSignalLevel可以算得对应的信号强度:
        0    rssi<=-100
        1    (-100, -88]
        2    (-88, -77]
        3    (-66, -55]
        4    rssi>=-55
        具体可见:https://blog.csdn.net/h784707460/article/details/94581149
    10、wifi一般开机注册并开启的三大服务(wifip2p、wifiscanner、wifi)
        1.启动流程(以wifi为例,其他两项类似!)
        (/frameworks/base/services/java/com/android/server/SystemServer.java)
        private static final String WIFI_SERVICE_CLASS="com.android.server.wifi.WifiService";
        traceBeginAndSlog("StartWifi");
        mSystemServiceManager.startService(WIFI_SERVICE_CLASS);
            (/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java)
            startService(...)-> mServices.add(service);
                                  service.onStart();(继下)
                (/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiService.java)
                onStart() -> publishBinderService(Context.WIFI_SERVICE, mImpl);
                (注:final WifiServiceImpl mImpl;   WIFI_SERVICE定义于/frameworks/base/core/java/android/content/Context.java的public
                public static final String WIFI_SERVICE = "wifi";类似定义还有WIFI_P2P_SERVICE、WIFI_SCANNING_SERVICE等)

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章