基于t972 Android9 AP6256,如何在设置中添加5G热点选项,并使其正常打开

通过设置的的WiFi热点选项可以知道关键词"2.4GHz",因此可以其全局搜索,在packages\apps\Settings\res\values\strings.xml文件下找到如下图所示,

从上面注释可以知道,选项按键选择2.4GHz触发的按键关键词是"wifi_ap_choose_2G",因此继续搜索,在packages\apps\Settings\res\values\arrays.xml文件下找到如下下图所示,

那么可以知道,关键词就是"wifi_ap_band_config_full",应用就是应该根据这个关键词获取数组内的选项标签,然而在packages目录下没有搜索到有用的调用,那么换个方向,继续搜索"wifi_ap_choose_2G",搜索到在

packages\apps\Settings\src\com\android\settings\wifi\tether\WifiTetherApBandPreferenceController.java

文件下找到,如下图所示,

根据上图分析,可以知道,只需要调用is5GhzBandSupported方法返回true即可让设置WiFi热点选项增加上5GHz选项,那么分析一下is5GhzBandSupported方法,此方法如下图所示,

从上面方法可以看出,需要mWifiManager.isDualBandSupported()返回true和countryCode不为空才可以,先分析isDualBandSupported方法,其方法如下图所示,

从上图可以知道实质调用的是IWifiManager mService; => mService.isDualBandSupported();

在frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiServiceImpl.java文件搜索到isDualBandSupported方法,如下图所示,

从上图可以知道最终返回的是"config_wifi_dual_band_support"这个关键词的值,搜索改关键词,在frameworks\base\core\res\res\values\config.xml文件中可以配置该关键词的值,如下图所示,

这里我们设置为true,那么is5GhzBandSupported方法的第一个条件已经满足了,而第二个条件是countryCode国家代号不为空,这个网上随便找即可,我这里强制给它写为"CN"中国代号,如下图所示,

那么重新编译烧录后,在设置热点选项可以看到5GHz选项了,如下图所示,

这里又出现一个问题了,使用2.4GHz频段打开热点是没问题的,但是使用5.0GHz频段打开热点一会就自动关闭了,报错日志关键部分如下图所示,

通过日志可以看出,它是国家代号不允许5GHz频段,也就是说系统是通过国家代号来决定是否可以打开5GHz频段的WiFi热点的。通过"5GHz band is not allowed without country code"这个日志搜索到在

rameworks\opt\net\wifi\service\java\com\android\server\wifi\util\ApConfigUtil.java文件中出现,如下图所示,

看到以上程序之后,我们是否想到和之前判断是否支持5G的那段程序很像,那么最暴力的解决方法就是将红色框框那段程序给屏蔽掉。

在重新编译烧录固件后,可以发现5G频段WiFi热点可以正常打开了。

这里想一想,通过这两个地方改动,它都与"countryCode"这个国家代号有关,如果暴力改动,那么有很多变量等都没有动态改动的,那么看看"countryCode"这个是在哪来一开始给它初始化设置的,我们可以让它默认为"CN"就好了,搜索"updateApChannelConfig"方法,找到它在

frameworks\opt\net\wifi\service\java\com\android\server\wifi\SoftApManager.java文件下调用,如下图所示,

那么它里面传的"mCountryCode"参数又在哪里呢?通过搜索找到在本路径下,如下图所示,

从上图源码可知道,"mCountryCode"参数又是通过SoftApManager方法中的"countryCode"形参赋予的,那么搜索SoftApManager方法,找到在

frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiInjector.java文件中调用,如下图所示,

通过上图源码可知道,SoftApManager方法中的"countryCode"形参是通过mCountryCode.getCountryCode()这个方法调用获取的,而"mCountryCode"这个实例的类是在本文件,如下图所示,

那么"WifiCountryCode"这个类通过搜索,在

frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiCountryCode.java文件中,该类的"getCountryCode"方法如下图所示,

通过上图源码对该方法注释可知,从SIM卡或手机默认设置返回当前报告的国家/地区代码,因此可知道,为什么5GHz频段WiFi热点打不开了,因为没有插SIM卡,所以获取不到国家代号,使用的是默认设置的代号,那么查找"pickCountryCode"方法,在本文件可找到,如下图所示,

通过上图源码可知,红色框框的就是当上面搜索手机SIM卡没有获取到国家代号,那么就会设置默认的代号"mDefaultCountryCode"了,所以在本文件中,将"mDefaultCountryCode"变量强制修改成"CN"即可,如下图所示,

此时也就修改完成了,通过编译烧录,也是完美可以打开5GHzWiFi热点了。

第一种暴力修改方法的日志片段如下:
04-25 15:15:13.816 3778 4344 E ApConfigUtil: 5GHz band is not allowed without country code, config.apBand(1), WifiConfiguration.AP_BAND_5GHZ(1), countryCode(null), config.apChannel(0)

而第二种修改的日志显示的"config.apChannel"配置热点通道从第一种"0"变成系统分配的了,如下:
04-25 15:56:34.849 3759 3940 E ApConfigUtil: config.apChannel is 165

相关推荐
jmlinux7 分钟前
STM32 HAL库USART串口DMA IDLE中断编程:避坑指南
stm32·单片机·嵌入式硬件
熬夜苦读学习24 分钟前
Linux文件系统
linux·运维·服务器·开发语言·后端
沐千熏42 分钟前
Liunx(CentOS-6-x86_64)系统安装MySql(5.6.50)
linux·mysql·centos
黑牛先生2 小时前
【Linux】匿名管道
linux·运维·服务器
流星白龙2 小时前
【Linux】35.封装 UdpSocket(2)
linux·运维·windows
沐欣工作室_lvyiyi2 小时前
基于单片机的智能电表设计(论文+源码)
单片机·嵌入式硬件·电能表·数字电能表
是码农没错了2 小时前
银河麒麟系统安装mysql5.7【亲测可行】
linux·运维·kylin
半导体老登2 小时前
新能源汽车核心元件揭秘:二极管、三极管结构与工作原理解析(2/2)
人工智能·单片机·嵌入式硬件·汽车
wzhao1012 小时前
WSL进阶使用指南
linux
风静如云3 小时前
OpenBMC:BmcWeb app.run
linux