Android EDLA 打开5G热点失败分析解决2
Android EDLA 打开5G热点失败分析解决2
文章目录
- Android EDLA 打开5G热点失败分析解决2
- 一、前言
- 二、分析解决
- 1、日志分析
- 2、源码分析
- 3、修改解决
- (1)源码搜索修改
- (2)创建res overlay应用
- ①Android.bp
- ②AndroidManifest.xml
- ③config.xml
- ④编译添加的模块名称
- 4、查看当前运行环境中是否存在添加的overlay应用
- 三、其他
- 1、小结
- 2、确认Wifi应用是不是mainline包里面的
- 3、自定义或者普通应用的res属性可以被overlay覆盖吗?
一、前言
在Android13 EDLA已经遇到过Android EDLA 打开5G热点失败问题;
解决方法是res的两个5G属性:config_wifiSoftap5ghzSupported、config_wifi5ghzSupport需要设置为true。
之前已经有分析解决:
https://blog.csdn.net/wenzhi20102321/article/details/140531433
之前的源码是mtk方案的,现在开发Android16 AML方案的,也有一样问题。
如果想看源代码分析可以看之前的链接;
本文主要分析不同方案上,实际运行环境和代码中如何解决这个EDLA项目 打开5G热点失败问题。
之前主要的博客主要是进行分析过程,本文内容主要是介绍解决内容和验证过程。
开发Android EDLA的都是有这个问题的,有需要的可以收藏。
二、分析解决
1、日志分析
logcat | grep ApConfigUtil
可以看到:
ApConfigUtil : Can not start softAp with band 5G not supported.
logcat还有打印不支持6G,那个是无所谓的,因为目前Android设备都不支持6G,这个估计是为了后面兼容。
2、源码分析
packages\modules\Wifi\service\java\com\android\server\wifi\util\ApConfigUtil.java
public static boolean isBandSupported(@BandType int apBand, Context context) {if (!isBandValid(apBand)) {Log.e(TAG, "Invalid SoftAp band " + apBand);return false;}//报错是下面的打印。for (int b : SoftApConfiguration.BAND_TYPES) { //BAND_TYPES: 6G,5G,2.4Gif (containsBand(apBand, b) && !isSoftApBandSupported(context, b)) {Log.e(TAG, "Can not start softAp with band " + bandToString(b)+ " not supported.");return false;}}return true;}//containsBand 方法,band = 2,是true 的,public static boolean containsBand(@BandType int band, @BandType int testBand) {return ((band & testBand) != 0);}//所以关键是 isSoftApBandSupported,如果为false 就是有问题public static boolean isSoftApBandSupported(@NonNull Context context, @BandType int band) {switch (band) {case SoftApConfiguration.BAND_2GHZ:return context.getResources().getBoolean(R.bool.config_wifi24ghzSupport)&& context.getResources().getBoolean(R.bool.config_wifiSoftap24ghzSupported);case SoftApConfiguration.BAND_5GHZ://5G热点的判断,这里有判断两个属性return context.getResources().getBoolean(R.bool.config_wifi5ghzSupport)&& context.getResources().getBoolean(R.bool.config_wifiSoftap5ghzSupported);case SoftApConfiguration.BAND_6GHZ:return context.getResources().getBoolean(R.bool.config_wifi6ghzSupport)&& context.getResources().getBoolean(R.bool.config_wifiSoftap6ghzSupported);default:return false;}}
其中一个为false都会导致无法打开5G热点。
如果没有overlay的情况,这个res 属性的位置在:
package\modules\Wifi\service\ServiceWifiResources\res\values\config.xml
<bool translatable="false" name ="config_wifi24ghzSupport">true</bool>//5G wifi,源码这里默认false
<bool translatable="false" name ="config_wifi5ghzSupport">false</bool><!-- Wifi driver supports 5GHz band for softap when chip support 5GHz -->
//5G 热点
<bool translatable="false" name="config_wifiSoftap5ghzSupported">true</bool>
EDLA项目是有mainline包配套的应用会覆盖Wifi应用;
所以会出现修改package\modules\Wifi 的源码是没有作用的,所以修改上面res的属性是没有用的。
3、修改解决
覆盖 Wifi应用的谷歌应用是 com.google.android.wifi.apks
所以需要修改谷歌应用的res,源码是无法修改的,进行res 的overlay覆盖就可以。
Google的mainline包是在vendor目录下的,查看当前的源码方案是否存在overlay wifi.apks 的
(1)源码搜索修改
vendor源码下搜索:
find . -name "AndroidManifest.xml" |xargs grep "com.google.android.wifi.resources"
如果能搜索到应该是下面这样的。
源码下查看:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="XXX.overlay" //这个包名的名称可以随便写android:versionCode="1"android:versionName="1.0"><application android:hasCode="false" /><overlayandroid:targetPackage="com.google.android.wifi.resources"android:targetName="WifiCustomization"android:priority="0"android:isStatic="true" />
</manifest>
上面就是overlay覆盖 com.google.android.wifi.apks 的res属性的应用;
找到这个应用定义的res/values/config.xml文件,写入或者修改这两个属性就行:
<bool translatable="false" name ="config_wifi5ghzSupport">true</bool><bool translatable="false" name ="config_wifiSoftap5ghzSupported">true</bool>
如果查找不到就需要自己添加一个res overlay的应用。
(2)创建res overlay应用
其实就添加三个文件,一个编译apk的bp文件,一个定义包名的xml文件,一个定义属性的xml文件:
①Android.bp
runtime_resource_overlay {name: "EdlaWifiConfigOverlay", //编译模块名称product_specific: true,
}
为啥这样写?我也不清楚,参考的其他overlay文件夹的。
②AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.google.wifi.resources.config.overlay" //这个命名是随意的android:versionCode="1"android:versionName="1.0"><application android:hasCode="false" /><overlayandroid:targetPackage="com.google.android.wifi.resources" //这个覆盖的必须正确android:targetName="WifiCustomization"android:priority="0"android:isStatic="true" />
</manifest>
③config.xml
<bool translatable="false" name ="config_wifi5ghzSupport">true</bool><bool translatable="false" name ="config_wifiSoftap5ghzSupported">true</bool> //下面的是5G热点信道值范围,一般是下面的范围。也可以根据实际定制<!-- List of allowed channels in 5GHz band for softap. --><string translatable="false" name="config_wifiSoftap5gChannelList">36-48,149-161,165</string>
上面的目录结构需要符合普通的源码app目录结构:
EdlaWifiConfigOverlay-Android.bp-AndroidMainfest.xml-/res/values/config.xml
如果不符合上面的目录结构需要在bp里面特殊声明,声明目录结构算是最简单的,系统可识别的。
相当于一个普通apk应该,只是没有src代码而已,专门用来覆盖res属性的。
刚开始我是加了上面三个文件,但是编译大包好像没用,发现应用没有编译进去。
我是在 release\vendor\partner_gms\overlay 目录下添加的,这个目录下还有很多其他的overlay。
搜索发现模块名称未进行 PRODUCT_PACKAGES 声明。
④编译添加的模块名称
解决方法是在某个mk里面编译
# GMS RRO packages
PRODUCT_PACKAGES += \GmsConfigOverlayCommon \
+ EdlaWifiConfigOverlay //添加编译模块名称
编大包就可以了。
4、查看当前运行环境中是否存在添加的overlay应用
系统编译、烧录、运行后运行后查看运行环境是否包含overlay的应用:
通过包名确认:
dumpsys package | grep XXX.overlaydumpsys package XXX.overlay
正常是有如下信息的:
1|console:/ # dumpsys package com.rockchip.wifi.resources.config.overlay
Domain verification status:Key Set Manager:[com.rockchip.wifi.resources.config.overlay]Signing KeySets: 1Packages:Package [com.rockchip.wifi.resources.config.overlay] (5d7821a):appId=10007pkg=Package{82814b com.rockchip.wifi.resources.config.overlay}codePath=/product/overlay/EdlaWifiConfigOverlay.apkresourcePath=/product/overlay/EdlaWifiConfigOverlay.apklegacyNativeLibraryDir=/product/lib64/EdlaWifiConfigOverlayextractNativeLibs=trueprimaryCpuAbi=nullsecondaryCpuAbi=nullcpuAbiOverride=nullversionCode=1 minSdk=36 targetSdk=36...dataDir=/data/user/0/com.rockchip.wifi.resources.config.overlayfirstInstallTime=2025-10-28 21:24:07uninstallReason=0runtime permissions:Dexopt state:[com.rockchip.wifi.resources.config.overlay]Compiler stats:[com.rockchip.wifi.resources.config.overlay]
如果没有这个包名的应用就是:
W82B_A:/ # dumpsys package com.rockchip.wifi.resources.config.overlay
Unable to find package: com.rockchip.wifi.resources.config.overlay
W82B_A:/ #
三、其他
1、小结
(1)wifi打不开5G可以查看日志,是否是 ApConfigUtil 打印的不支持5G
(2)如果确定是ApConfigUtil的打印,可以尝试添加支持5G 的wifi和热点的属性
(3)一个res overlay应用只能覆盖一个应用的res属性,主要覆盖说明在AndroidManifest.xml
(4)编译后查看运行环境中是否编译了res overlay的应用
(5)系统底层驱动异常也会导致无法打开5G热点,分析具体报错,这个可以找底层帮忙分析
2、确认Wifi应用是不是mainline包里面的
其实比较简单,通过包名可以判断:
Android 源码wifi模块的包名是:com.android.wifi.resources
mainline包中Google wifi模块的包名是:com.google.android.wifi.resources
AOSP项目也会有客户要求导入GMS和mainline包的,EDLA项目是Google强制需求导入GMS和mainline包;
导入mainline包的应用后,源码的wifi模块是没有作用的。
所以可以判断当前系统重有没有运行 com.google.android.wifi.resources 应用就知道源码的wifi有没有用。
dumpsys package com.google.android.wifi.resources
Packages:Package [com.google.android.wifi.resources] (d3cc940):appId=10138pkg=Package{fb36079 com.google.android.wifi.resources}codePath=/apex/com.android.wifi/priv-app/ServiceWifiResourcesGoogle@360840080
...dataDir=/data/user_de/0/com.google.android.wifi.resourcesfirstInstallTime=1969-12-31 19:00:35uninstallReason=0overlay paths:/data/resource-cache/com.android.systemui-neutral-naMy.frro/data/resource-cache/com.android.systemui-accent-ZAWx.frro/data/resource-cache/com.android.systemui-dynamic-vtoK.frro/product/overlay/EdlaWifiConfigOverlay.apk //这里居然有Overlay属性的应用说明legacy overlay paths:/product/overlay/EdlaWifiConfigOverlay.apk runtime permissions:
...Dexopt state:[com.google.android.wifi.resources]
如果导入了google 的wifi应用,那么 dumpsys package com.android.wifi.resources 肯定是返回找不到应用的;
如果当前运行环境使用了 google 的wifi应用, packages\modules\Wifi 里面的逻辑就无法适配修改了,
只能overlay修改一些Google wifi应用的config属性,另外Java代码好像没法overlay的。
3、自定义或者普通应用的res属性可以被overlay覆盖吗?
我试了一下是可以的;
测试的是Studio编译的普通app应用,定义res属性,系统源码添加res overlay应用,可以进行res overlay。
无论是string.xml或者config.xml的属性,都是可以进行overlay覆盖的。
重点就是修改一下AndroidManifest.xml的覆盖声明。
我这里的overlay应用是通过源码编译的是生成在product目录下面的;
overlay应用估计是需要系统权限的,如果 普通权限的overlay应用都可以覆盖res属性那不就会乱套了吗!
有兴趣的可以自己测试一下,哈哈。
万一普通应用的overlay应用可以覆盖系统应用的res属性就是google源码的漏洞了。
