Android 热点开发调试总结
Android 热点开发调试总结
文章目录
- Android 热点开发调试总结
- 一、前言
- 二、热点开发
- 1、开关和默认配置
- wifi和热点配置信息保存的位置:
- 2、主要流程
- 3、相关日志
- 4、相关广播
- 5、demo示例
- 三、其他
- 1、Android 热点开发调试小结
- 2、其他热点相关知识小结
- (1)Android11 热点开启流程
- (2)Android11 热点配置信息保存分析
- (3)Android 实现热点开机后自动开启
- (4)Android 热点二维码简单示例
- (5)Android11 热点Band值为3
一、前言
如果开发热点相关功能,必须先掌握基本api知识和相关广播的监听;
热点用的功能基本都是系统签名权限的系统应用,比如Settings;
有些方案中需要设置热点不同的信道值,这个是Settings没有的功能;
本简单介绍热点开发基本知识,有兴趣的可以看看。
二、热点开发
1、开关和默认配置
//开启和关闭
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//开启
connectivityManager.startTethering(TetheringManager.TETHERING_WIFI, true, mCallback, new Handler(Looper.getMainLooper()));
//关闭
connectivityManager.stopTethering(TetheringManager.TETHERING_WIFI);配置信息:
SoftApConfiguration config = buildNewConfig();
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setSoftApConfiguration(config);//SoftApConfiguration 对象信息封装方法private SoftApConfiguration buildNewConfig() {SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();int securityType = XXX; //热点0:无密码;1:WPAconfigBuilder.setSsid("" + XXX); //热点名称if (securityType != 0) { configBuilder.setPassphrase(passwordXXX, securityType);}//设置信道和频段,信道值必须和频段匹配否则会异常报错//频段:bandXXX:1表示2.4G(范围1-14);2表示5G (范围36-165)configBuilder.setChannel(currentChannelXXX,bandXXX);return configBuilder.build();}
热点配置要关开一次才能生效。
上面的接口方法是适用于Android13 或者更新版本的代码,Android11 设置热点信息接口是不一样的。
wifi和热点配置信息保存的位置:
上层信息:
console: /data/misc/apexdata/com.android.wifi # ls
WifiConfigStore.xml (wifi信息) WifiConfigStoreSoftAp.xml (热点信息)底层信息:
console:/data/vendor/wifi/hostapd # ls
ctrl hostapd_wlan1.conf(热点信息,wlan1/ap0)
底层保存的文件不一定所有方案都有,上层文件只要打开过wifi、热点就会生成。
2、主要流程
热点开启接口调用的主要流程如下:
(1)ConnectivityManager.startTethering
(2)TetheringManager.startTethering(request, executor, tetheringCallback)
(3)TetheringService.TetheringConnector.startTethering
(4)Tethering.startTethering(request, listener);
//方法名变化,使用null 对象开启热点
(5)WifiManager.startTetheredHotspot(null /* use existing softap config */)
(6)WifiServiceImpl.startTetheredHotspot(@Nullable SoftApConfiguration softApConfig)
//方法名再变化
(7)ActiveModeWarden.startSoftAp(apModeConfig);
(8)ActiveModeManager.start();ActiveModeManager manager = mWifiInjector.makeSoftApManager(listener, callback, softApConfig);listener.setActiveModeManager(manager);manager.start();
ActiveModeManager是接口类,会调用到SoftApManager.start()
(9)SoftApManager.startSoftAp()
(10)WifiNative.startSoftAp(mApInterfaceName, localConfigBuilder.build(), mSoftApListener)
(11)HostapdHal.addAccessPoint(ifaceName, config, listener::onFailure)
(12)根据硬件版本调用不同的接口实现:addAccessPoint_X_X
其实从这里可以看到,WifiManager.startTetheredHotspot 也是可以打开热点,只是没有监听回调。
3、相关日志
日志关键字和示例:
热点部分关键字都是:wifi
主要关键字:SoftApManager
底层相关日志:wpa_supplicant、wifi-service、hostapd
其他相关:WifiNative、WifiHAL
节点相关:wlan、ap0日志过滤示例:
logcat | grep -i wifi
logcat | grep -iE "WifiService|SoftApManager"
logcat | grep -iE "WifiService|SoftApManager|wpa_supplicant|hostapd|WifiNative|WifiHAL|wlan|ap0"
热点正常启动的日志示例:
logcat | grep -iE "WifiService|SoftApManager"
04-25 14:46:39.834 915 3164 I WifiService: setSoftApConfiguration uid=1000 //调用开启热点时间
04-25 14:46:39.946 915 3164 I WifiService: startTetheredHotspot uid=1073
04-25 14:46:40.035 915 1179 D SoftApManager[wlan1]: 11BE is not allowed, removing from configuration //节点日志wlan1
04-25 14:46:40.036 915 1179 D SoftApManager[wlan1]: startSoftAp: channels {1=0} iface wlan1 country CN //频段、信道{1=0}
04-25 14:46:40.087 915 2050 I WifiService: updateInterfaceIpState uid=1073
04-25 14:46:40.215 915 1179 D SoftApManager[wlan1]: Soft AP is started SoftApInfo{bandwidth= 2, frequency= 2447,bssid=56:78:c9:14:65:a2, wifiStandard= 4, mApInstanceIdentifier= wlan1, mIdleShutdownTimeoutMillis= 600000, mVendorData= []}, isRemoved: false
04-25 14:46:40.224 915 1179 D SoftApManager[wlan1]: Timeout message scheduled, on wlan1, delay = 600000 //自动关闭的时间600秒
04-25 14:46:40.266 915 3164 I WifiService: updateInterfaceIpState uid=1073 //更新热点ip
04-25 14:46:40.266 915 1179 D WifiService: updateInterfaceIpState: ifaceName=wlan1 mode=1 previous LOHS mode= -1
从上面日志大致可以看到:
调用开启热点时间,节点日志wlan1,频段、信道{1=0}(framework会随机生成信道值),
自动关闭的时间600秒(10分钟),开启完成更新热点ip,开启完成大概400毫秒 等信息。
如果打开异常,就看哪个过程缺少,查看过程中的异常日志进行分析。
4、相关广播
热点相关广播比较少,主要就是开关变化的广播。
WifiManager.WIFI_AP_STATE_CHANGED_ACTION:热点开关广播广播返回的热点状态。@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(action)) {int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);switch (state) {case WifiManager.WIFI_AP_STATE_DISABLED:Log.d(TAG, "热点已关闭");break;case WifiManager.WIFI_AP_STATE_DISABLING:Log.d(TAG, "热点正在关闭");break;case WifiManager.WIFI_AP_STATE_ENABLED:Log.d(TAG, "热点已开启");break;case WifiManager.WIFI_AP_STATE_ENABLING:Log.d(TAG, "热点正在开启");break;case WifiManager.WIFI_AP_STATE_FAILED:Log.d(TAG, "热点开启失败");break;}}}
正常情况监听开启和关闭+开启失败广播即可。
5、demo示例
demo效果图片如下:
主要功能:热点开关控制,简单参数设置,自定义参数设置,自定义热点配置;
监听热点开关变化后,更新热点ip,国家码等信息。
后续提供了apk的源码和 3588 AN15 、311D2 AN13 签名的Demo apk;
如果不想重新编译apk,可以放到源码中,替换之前某个apk,重新编译也会生成对应系统签名的apk。
源码和apk下载地址:
https://download.csdn.net/download/wenzhi20102321/90714296
新开的方案有可能遇到只能打开2.4G热点或者只能打开未设置信道的5G热点;
其他情况打开热点会失败,这种情况需要驱动底层先分析解决。
三、其他
1、Android 热点开发调试小结
(1)热点开关可以通过ConnectivityManager或者WifiManager对象的接口控制
(2)修改热点配置的接口是:WifiManager.setSoftApConfiguration
(2)热点相关接口的调用一般要系统签名权限,所以开发热点基本都是系统应用;
2、其他热点相关知识小结
(1)Android11 热点开启流程
Android11 热点framework 中上层的代码逻辑进行梳理 :
https://blog.csdn.net/wenzhi20102321/article/details/128473734
(2)Android11 热点配置信息保存分析
分析热点保存/获取热点信息过程,热点配置文件生成的具体文件位置:
https://blog.csdn.net/wenzhi20102321/article/details/128593458
(3)Android 实现热点开机后自动开启
Android 热点是有api设置永久开启,热点名称,热点密码等接口,但是“永久开启”实际上是不自动关闭,重启设备后热点并不会自动开启。
Android Wifi实现开关状态记忆是基于Settings.GLOBAL.WIFI_ON属性,
所以热点如果要实现状态记忆那么也是要设置一个Settings属性或者prop属性,
系统启动后判断属性决定是否启动热点就可以实现热点状态记忆了。
https://blog.csdn.net/wenzhi20102321/article/details/135139745
(4)Android 热点二维码简单示例
Android 原生设置有热点二维码分享功能,有些系统应用也会有这个需求。
简单demo如下:
https://blog.csdn.net/wenzhi20102321/article/details/147354852
(5)Android11 热点Band值为3
1、band=3,是在Band=2并且channel=0的情况出出现
2、band=3 会在 ApConfigUtil.updateApChannelConfig 方法中重新设置band和channel值
3、band=3 的情况,会先判断是否支持5G频段热点,如果支持会返回5G 对应的channel和band,否则判断2.4G热点
详细分析如下:
https://blog.csdn.net/wenzhi20102321/article/details/128507254