当前位置: 首页 > news >正文

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

相关文章:

  • locust压力测试
  • LeetCode热题100--560.和为K的子数组(前缀和)--中等
  • ubuntu安装docker,conda,tmux,btop,nvitop
  • ai环境cuda cudnn conda torch整体迁移 wsl docker
  • vue的生命周期 以及钩子
  • 第二章:Agent System
  • 【亚马逊云】AWS Wavelength 从理论讲解到实验演练
  • AWS PrivateLink vs Lattice:深度解析两大网络服务的异同
  • python_股票月数据趋势判断
  • [leetcode]2302.统计得分小于k的子数组
  • java 使用 POI 为 word 文档自动生成书签
  • 学生管理系统审计
  • 【Java ee初阶】多线程(4)
  • 第十一节:性能优化高频题-响应式数据深度监听问题
  • 大模型(LLMs)强化学习—— PPO
  • Android wifi开发调试总结
  • NIPS2021 | 视觉 Transformer 的有趣特性
  • 华纳云:centos如何实现JSP页面的动态加载
  • Oracle的PLSQL中动态执行函数
  • Ubuntu中C++项目安装二次规划库——qpOASES 库
  • 解放日报头版:人民城市共建共享展新卷
  • 日韩 “打头阵”与美国贸易谈判,汽车、半导体产业忧虑重重
  • 庆祝中华全国总工会成立100周年暨全国劳动模范和先进工作者表彰大会隆重举行,习近平发表重要讲话
  • 外交部回应涉长江和记出售巴拿马运河港口交易:望有关各方审慎行事,充分沟通
  • 修订占比近30%收录25万条目,第三版《英汉大词典》来了
  • 稳就业稳经济五方面若干举措将成熟一项出台一项