通过设置的的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