Android13 热点默认5G频道配置修改

Android13 热点默认5G频道配置修改

文章目录

  • Android13 热点默认5G频道配置修改
    • 一、前言
    • 二、修改默认配置
      • 1、代码中修改默认配置
      • 2、保存默认配置文件设置默认5G频段配置
        • 热点配置文件完整信息示例:
      • 3、代码中强制设置配置信息
        • (1)在关键流程设置
          • 热点开启和关闭代码:
          • 热点启动流程
          • 热点启动关键流程:
      • (2)在获取配置信息方法强制设置并返回,是否ok?
    • 三、其他
      • 1、Android13 热点默认5G频道配置修改总结
      • 2、之前写的热点相关知识汇总
      • 3、Android 设置默认热点名称和热点密码、密码长度
      • 4、Android11 热点开启流程
      • 5、Android11 热点配置信息保存分析
      • 6、Android 实现热点开机后自动开启

一、前言

Android开发中经常要设置默认热点,名称,热点密码,是否是5G频段。

之前也有对默认名称和密码进行分析的文章,但是热点频道没怎么看,热点频段对传输性能还是比较重要的,有的平台默认就要5G,查看代码发现默认是2.4G热点。

本文对 Android 默认热点5G频段配置 进行分析。

配置热点信息后,会生成热点配置文件:

wifi信息保存位置:
/data/misc/apexdata/com.android.wifi/WifiConfigStore.xml热点信息保存位置:
/data/misc/apexdata/com.android.wifi/WifiConfigStoreSoftAp.xml

热点的信息文件包含了:热点名称,热点密码,热点频段和信道值等基本信息;

wifi 的信息文件包含了:连接过的wifi名称,密码,MAC地址等信息。

二、修改默认配置

1、代码中修改默认配置

系统中热点默认配置信息对象 WifiApConfigStore.java

实现思路:

在默认配置方法getDefaultApConfiguration() 中设置默认信息即可。

packages\modules\Wifi\service\java\com\android\server\wifi\WifiApConfigStore.java

import android.os.SystemProperties; //添加prop属性public class WifiApConfigStore {private static final String TAG = "WifiApConfigStore";//(1)获取默认配置信息方法,该方法在系统无法检测到默认配置文件时会生成//系统第一次运行时会执行到,还有就是把系统热点配置文件删除后再重启也是会执行到private SoftApConfiguration getDefaultApConfiguration() {SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();//configBuilder.setBand(generateDefaultBand(mContext)); //(2)原来的逻辑。2.4G热点//(3)加个打印,查看默认的频段值Log.d(TAG, "getDefaultApConfiguration generateDefaultBand = " + generateDefaultBand(mContext));//(4)设置默认5G的一段逻辑,添加prop属性进行判断boolean isDefault5G = SystemProperties.getBoolean("persist.sys.mydebug.hotspot_default_5G", true);Log.d(TAG, "getDefaultApConfiguration isDefault5G = " + isDefault5G);if (isDefault5G) {// (5)判断是否支持5G,设置5G band 和 36 信道值。if (ApConfigUtil.isBandSupported(SoftApConfiguration.BAND_5GHZ, mContext)) {Log.d(TAG, "getDefaultApConfiguration set band = 5G");configBuilder.setChannel(36, SoftApConfiguration.BAND_5GHZ);} else {Log.d(TAG, "getDefaultApConfiguration set band = 2G");configBuilder.setChannel(3, SoftApConfiguration.BAND_2GHZ);}} else { // (6)如果设置prop属性为 false,还是原来的逻辑configBuilder.setBand(generateDefaultBand(mContext));}//(7)默认名称,AndroidAP_四位随机数configBuilder.setSsid(mContext.getResources().getString(R.string.wifi_tether_configure_ssid_default) + "_" + getRandomIntForDefaultSsid());//(8)热点加密形式,默认不支持wpa3,加密类型:WPA2_PSKif (ApConfigUtil.isWpa3SaeSupported(mContext)) {configBuilder.setPassphrase(generatePassword(),SECURITY_TYPE_WPA3_SAE_TRANSITION);} else {configBuilder.setPassphrase(generatePassword(),SECURITY_TYPE_WPA2_PSK);}//(9)桥接模式,默认不支持if (ApConfigUtil.isBridgedModeSupported(mContext)) {if (SdkLevel.isAtLeastS()) {int[] dual_bands = new int[] {SoftApConfiguration.BAND_2GHZ,SoftApConfiguration.BAND_2GHZ | SoftApConfiguration.BAND_5GHZ};configBuilder.setBands(dual_bands);}}// Update default MAC randomization setting to NONE when feature doesn't support it.	//(10)MAC地址随机,默认为true,但这里方法没进if (!ApConfigUtil.isApMacRandomizationSupported(mContext)) {if (SdkLevel.isAtLeastS()) {configBuilder.setMacRandomizationSetting(SoftApConfiguration.RANDOMIZATION_NONE);}}configBuilder.setUserConfiguration(false);//(11)根据信息构建 WifiApConfigStore 对象return configBuilder.build();}//(12)获取默认频段,BAND_TYPES:2G,5G,6Gpublic static @BandType int generateDefaultBand(Context context) {for (int band : SoftApConfiguration.BAND_TYPES) {//(13)这里判断首先是否支持2.4G,支持直接返回了,并未进行后续判断。所以默认是2.4G热点!if (ApConfigUtil.isBandSupported(band, context)) {return band;}}Log.e(TAG, "Invalid overlay configuration! No any band supported on SoftAp");return SoftApConfiguration.BAND_2GHZ;}}

上面的 getDefaultApConfiguration() 方法只是系统第一次运行会执行到,并且把获取的默认信息保存到本地配置文件,后续打开过后已经存在信息配置文件就不会再调用获取默认配置的方法了,而是从本地保存的配置文件信息里面获取数据,每次手动保存的数据也是会保存到本地配置文件中的。

更多热点信息可以查看 WifiApConfigStore.java具体代码 。

2、保存默认配置文件设置默认5G频段配置

在系统源码某个mk文件添加文件复制代码:

#set default ap config
PRODUCT_COPY_FILES += \
xxx/WifiConfigStoreSoftAp.xml:data/misc/apexdata/com.android.wifi/WifiConfigStoreSoftAp.xml

在源码xxx路径文件 WifiConfigStoreSoftAp.xml,编译到运行系统的对应目录。

热点配置文件完整信息示例:
console:/ # cat data/misc/apexdata/com.android.wifi/WifiConfigStoreSoftAp.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<WifiConfigStoreData>
<int name="Version" value="3" />
<SoftAp>
<string name="WifiSsid">&quot;AndroidAP_5409&quot;</string>
<boolean name="HiddenSSID" value="false" />
<int name="SecurityType" value="1" />
<string name="Passphrase">844qwtdw</string>
<int name="MaxNumberOfClients" value="0" />
<boolean name="ClientControlByUser" value="false" />
<boolean name="AutoShutdownEnabled" value="true" />
<long name="ShutdownTimeoutMillis" value="-1" />
<BlockedClientList />
<AllowedClientList />
<boolean name="BridgedModeOpportunisticShutdownEnabled" value="true" />
<int name="MacRandomizationSetting" value="2" />
<BandChannelMap>
<BandChannel>
<int name="Band" value="2" />
<int name="Channel" value="36" />
</BandChannel>
</BandChannelMap>
<boolean name="80211axEnabled" value="true" />
<boolean name="UserConfiguration" value="true" />
<long name="BridgedModeOpportunisticShutdownTimeoutMillis" value="-1" />
<VendorElements />
<boolean name="80211beEnabled" value="true" />
<string name="PersistentRandomizedMacAddress">82:d0:fe:82:e1:d0</string>
</SoftAp>
</WifiConfigStoreData>
console:/ # 

可以根据自己需求对部分信息进行修改。

编译系统后,直接打开热点就是按照上面的配置信息传给底层的;

应用调用了设置热点配置方法,配置信息也是会保存到 WifiConfigStoreSoftAp.xml 文件的,

后续热点打开都是 WifiConfigStoreSoftAp.xml 的配置信息。

下面的是特殊场景,设置特定热点配置信息,

不管本地配置文件和应用怎么设置,最终热点都是以特定的配置打开。

3、代码中强制设置配置信息

不管应用怎么设置,系统实际生效都是特定的配置,

虽然现实中可能这样的场景比较少,但是万一有呢?

所以还是给大家介绍一下。

(1)在关键流程设置
热点开启和关闭代码:
ConnectivityManager mConnectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);//开启
mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI, true,
mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));//关闭
mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);

如果需要实现这个就要对Android 热点设置的流程 比较熟悉了,具体在哪个类进行适配可以呢?

热点启动流程
(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

从上面流程看热点开启是不需要参数的,后续SoftApManager里面会获取默认参数,综合观察发现WifiNative 前面强制处理最好。

packages\modules\Wifi\service\java\com\android\server\wifi\SoftApManager.java

热点启动关键流程:
    //(1)开启wifi的重要过程//mCurrentSoftApConfiguration 的信息是构造方法从配置文件中获取的private int startSoftAp() {Log.d(getTag(), "startSoftAp: band " + mCurrentSoftApConfiguration.getBand()+ " iface " + mApInterfaceName + " country " + mCountryCode);//(2)这里强制设置 mCurrentSoftApConfiguration 的配置参数//强制设置5G,48信道boolean isDefault5G_48 = SystemProperties.getBoolean("persist.sys.mydebug.hotspot_default_5G_48", true);Log.d(TAG, "getApConfiguration isDefault5G_48 = " + isDefault5G_48);if (isDefault5G_48) {mCurrentSoftApConfiguration =  new SoftApConfiguration.Builder(mCurrentSoftApConfiguration).setChannel(48, SoftApConfiguration.BAND_5GHZ).build();}int result = setMacAddress();if (result != SUCCESS) {return result;}
。。。mWifiDiagnostics.startLogging(mApInterfaceName);mStartTimestamp = FORMATTER.format(new Date(System.currentTimeMillis()));//(3)热点开启成功的标志Log.d(getTag(), "Soft AP is started ");return SUCCESS;}

验证ok,打开热点默认是是5G 频段,48信道。

而且不管默认配置方法怎么设置,配置文件参数写什么,最终都都是以上面的信息开启的热点。

(2)在获取配置信息方法强制设置并返回,是否ok?

packages\modules\Wifi\service\java\com\android\server\wifi\WifiApConfigStore.java

    public synchronized SoftApConfiguration getApConfiguration() {if (mPersistentWifiApConfig == null) {/* Use default configuration. */Log.d(TAG, "Fallback to use default AP configuration");persistConfigAndTriggerBackupManagerProxy(updatePersistentRandomizedMacAddress(getDefaultApConfiguration()));}SoftApConfiguration sanitizedPersistentconfig =sanitizePersistentApConfig(mPersistentWifiApConfig);...//强制设置5G,44信道boolean isDefault5G_44 = SystemProperties.getBoolean("persist.sys.mydebug.hotspot_default_5G_44", true);Log.d(TAG, "getApConfiguration isDefault5G_44 = " + isDefault5G_44);if (isDefault5G_44) {return new SoftApConfiguration.Builder(mPersistentWifiApConfig).setChannel(44, SoftApConfiguration.BAND_5GHZ).build();}return mPersistentWifiApConfig;}

其实这里修改看起来不保险?

因为设置一次参数后,系统保存的 mSoftApConfiguration 已经被修改了数据,

重新get是否可以获取到这里的固定的配置信息?

但是想想又可以哦。不管新的对象还是旧的对象都是调用这个方法。set啥都没用?

实际测试是ok 的,打开热点默认是是5G 频段,44信道。

而且不管默认配置方法怎么设置,配置文件参数写什么,最终都都是以上面的信息开启的热点。

如果上面第一种和第二种方式都修改呢?

这不是脱裤子放屁,搞事情吗?

其实是以第一种方式为准,因为 SoftApManager 的构造方法调用了getApConfiguration方法,

后续才调用 startSoftAp,最终数据以后面设置的算数。

最后来对比一下第一种和第二种强制设置配置信息的区别:

1、第一种是关键流程设置固定信息,比较靠谱
2、第二种是获取参数配置返回固定信息,但是系统可能多个地方都会调用到,会增加不确定性,需要一定的压测
3、第一种方式的修改后用户获取到的热点配置信息是不对的,用户还是获取配置文件的或者getApConfiguration方法的信息
4、第二种方式的修改后用户获取到的热点配置信息是正确的,是和实际配置的信息是一致的,虽然和保存在本地文件的信息不一定一致

所以要增加可靠性,第一种和第二种方式都修改也是没有问题的,

记得固定信息要一直,上面代码只是示范效果。

三、其他

1、Android13 热点默认5G频道配置修改总结

方式1:系统中热点默认配置信息对象 WifiApConfigStore.java,默认配置方法getDefaultApConfiguration() 中设置默认信息即可。

实现思路:

在默认配置方法getDefaultApConfiguration() 中设置默认信息即可。

方式二:把 WifiConfigStoreSoftAp.xml编写默认配置后,编译到运行系统的对应目录。

热点其他默认配置信息也可以参考修改。

2、之前写的热点相关知识汇总

https://so.csdn.net/so/search?q=%E7%83%AD%E7%82%B9&t=blog&u=wenzhi20102321

3、Android 设置默认热点名称和热点密码、密码长度

https://blog.csdn.net/wenzhi20102321/article/details/127737534

4、Android11 热点开启流程

https://blog.csdn.net/wenzhi20102321/article/details/128473734

5、Android11 热点配置信息保存分析

https://blog.csdn.net/wenzhi20102321/article/details/128593458

6、Android 实现热点开机后自动开启

https://blog.csdn.net/wenzhi20102321/article/details/135139745

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/600525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Graceful Response 构建 Spring Boot 下优雅的响应处理

一、Graceful Response Graceful Response 是一个 Spring Boot 技术栈下的优雅响应处理器&#xff0c;提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能&#xff0c;使用Graceful Response进行web接口开发不仅可以节省大量的时间&#xff0c;还可以提高代码质…

小白综述:深度学习 OCR 图片文字识别

文章目录 1. OCR 算法流程1.1 传统 OCR 方法1.2 深度学习 OCR 方法1.2.1 two-stage方法&#xff1a;文字检测识别1.2.2 端到端方法 2. 文本检测算法3. 文本识别算法3.1 基于分割的单字符识别方法3.2 基于序列标注的文本行识别方法 1. OCR 算法流程 OCR (Optical Character Rec…

揭开 JavaScript 作用域的神秘面纱(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

简单vlan划分和dhcp中继(Cisco Packet Tracer模拟)

文章目录 1. 前言2. 功能实现2.1. dhcp服务器接入2.2. 学校web服务器2.3. 设置学校dns服务器2.4. 设置线路冗余2.5. 配置ac。 1. 前言 在这里我们的计网作业是使用思科的Cisco Packet Tracer进行对校园网的简单规划&#xff0c;这里我对校园网进行了简单的规划&#xff0c;功能…

前端页面的生命周期

性能问题呈现给用户的感受往往就是简单而直接的&#xff1a;加载资源缓慢、运行过程卡顿或响应交互延迟等。而在前端工程师的眼中&#xff0c;从域名解析、TCP建立连接到HTTP的请求与响应&#xff0c;以及从资源请求、文件解析到关键渲染路径等&#xff0c;每一个环节都有可能因…

django websocket实现聊天室功能

注意事项channel版本 django2.x 需要匹配安装 channels 2 django3.x 需要匹配安装 channels 3 Django3.2.4 channels3.0.3 Django3.2.* channels3.0.2 Django4.2 channles3.0.5 是因为最新版channels默认不带daphne服务器 直接用命令 python manage.py runsever 默认运行的是w…

K8S中的hostPort、NodePort 、targetPort、port、containerPort 的区别

Dockerfile的EXPOSE Dockerfile中端口的声明: EXPOSE <端口1> [<端口2>...] 所以:EXPOSE的 第一个作用:只是说明docker容器开放了哪些端口,并没有将这些端口实际开放了出来!更多的作用是告诉运维人员或容器操作人员我开放了容器的哪些端口,只是一种说明。 …

WEB前端知识点整理(JQUERY+Bootstrap+ECharts)

1.JQUERY的概述&#xff1a; jQuery 是一个 JavaScript 库。jQuery 极大地简化了JavaScript 编程&#xff0c;它很容易学习。 jQuery库包含以下功能&#xff1a;HTML 元素选取&#xff1b;HTML 元素操作&#xff1b;CSS 操作&#xff1b;HTML 事件函数&#xff1b;JavaScript …

技术学习|CDA level I 业务分析方法

业务分析方法有三个主要构成部分&#xff1a;业务指标分析、业务模型分析及业务分析方法。 业务指标分析是发现业务问题的核心方法&#xff1a;用于通用指标和场景指标的计算及分析方法&#xff0c;以及指标体系的设计与应用方法。业务模型是从一系列业务行为中抽象出来的信息…

250:vue+openlayers 加载geotiff文件,并在地图上显示

第250个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载geotiff文件,并在地图上显示。这里使用到了WebGLTile图层和GeoTIFF脚本模块。这里一定要注意GeoTIFF的数据加载方式,要数组的模式。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现…

机器视觉系统选型-环境配置:报错序列不包含任何元素 的解决方法

描述 环境&#xff1a;VM4.0.0VS2015 及以上 现象&#xff1a;配置环境后&#xff0c;获取线线测量模块结果&#xff0c;报错“序列不包含任何元素”。如下图所示&#xff1a; 解答 将“\VisionMaster4.0.0\Development\V4.0.0 \ComControls\bin\x64”下整体重新拷贝。

初识大数据,一文掌握大数据必备知识文集(12)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

大模型加速库flash-attention的安装教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

CSS基础笔记-02动画

CSS基础笔记系列 《CSS基础笔记-01CSS概述》 什么是动画 动画是一种综合艺术&#xff0c;它集合了绘画、电影、数字媒体、摄影、音乐、文学等多种艺术门类于一身。具体来说&#xff0c;动画是通过在连续多格的胶片上拍摄一系列单个画面&#xff0c;然后连续播放&#xff0c;…

七牛云cdn图片加载错误:net::ERR_HTTP2_PROTOCOL_ERROR与HTTP2 检测工具

一、问题描述 今天运营的小伙伴提了个问题&#xff0c;她在后台上传图片的时候有时会遇到上传成功了&#xff0c;但实际回显图片却是一张“破图”&#xff1a; 二、原因调查 先了解一下ERR_HTTP2_PROTOCOL_ERROR是什么意思&#xff1a; ERR_HTTP2_PROTOCOL_ERROR是由HTTP/2协…

【AI视野·今日NLP 自然语言处理论文速览 第六十八期】Tue, 2 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 2 Jan 2024 Totally 48 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers A Computational Framework for Behavioral Assessment of LLM Therapists Authors Yu Ying Chiu, Ashish Shar…

HDU - 2063 过山车(Java JS Python C)

题目来源 Problem - 2063 (hdu.edu.cn) 题目描述 RPG girls今天和大家一起去游乐场玩&#xff0c;终于可以坐上梦寐以求的过山车了。 可是&#xff0c;过山车的每一排只有两个座位&#xff0c;而且还有条不成文的规矩&#xff0c;就是每个女生必须找个男生做partner和她同坐…

GPT3.5 改用 GPT4 价格翻了30倍 如何破局? GPT 对话成本推演

场景介绍 假设你搭建了一个平台&#xff0c;提供 ChatGPT 3.5 的聊天服务。目前已经有一批用户的使用数据&#xff0c;想要测算一下如果更换 GPT 4.0 服务需要多少成本&#xff1f; 方案阐述 如果是全切&#xff0c;最简单粗暴的方案就是根据提供 ChatGPT 3.5 消费的金额乘…

数据结构:STL:queue stack

目录 1.queue的头文件 2.queue的定义 3.queue的常用函数 3.1 push() 3.2 pop() 3.3 size() 3.4 empty() 3.5 front() 3.6 back() 4.stack的头文件 5.stack的定义 6.stack的常用函数 6.1 push() 6.2 top() 6.3 pop() 6.4 size() 6.6 empty() STLf封装的queue也是…

集合基础知识点

集合基础 1. 集合的由来 当 Java 程序中需要存放数据的时候&#xff0c;通常会定义变量来实现数据的存储&#xff0c;但是&#xff0c;当需要存储大量数据的时候该怎么办呢&#xff1f;这时首先想到的是数组&#xff0c;但是&#xff01;数组只能存放同一类型的数据&#xff…