Android EDLA 打开5G热点失败分析解决2

Android EDLA 打开5G热点失败分析解决2

文章目录

一、前言

在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.4G
            if (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" />
    <overlay
        android: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" />
    <overlay
        android: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.overlay
 dumpsys 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: 1

Packages:
  Package [com.rockchip.wifi.resources.config.overlay] (5d7821a):
    appId=10007
    pkg=Package{82814b com.rockchip.wifi.resources.config.overlay}
    codePath=/product/overlay/EdlaWifiConfigOverlay.apk
    resourcePath=/product/overlay/EdlaWifiConfigOverlay.apk
    legacyNativeLibraryDir=/product/lib64/EdlaWifiConfigOverlay
    extractNativeLibs=true
    primaryCpuAbi=null
    secondaryCpuAbi=null
    cpuAbiOverride=null
    versionCode=1 minSdk=36 targetSdk=36
	...
      dataDir=/data/user/0/com.rockchip.wifi.resources.config.overlay
      firstInstallTime=2025-10-28 21:24:07
      uninstallReason=0
      runtime 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=10138
    pkg=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.resources
      firstInstallTime=1969-12-31 19:00:35
      uninstallReason=0
      overlay 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源码的漏洞了。

相关推荐
消失的旧时光-19438 小时前
webkitx(Android WebView 最佳实践库)--> 上
android·webview
安卓兼职framework应用工程师9 小时前
android 15.0 app应用安装黑名单
android·pms·install·rom·安装黑名单
泷羽Sec-静安9 小时前
Less-7 GET-Dump into outfile-String
android·前端·网络·sql·安全·web安全
花花鱼10 小时前
html5与android之间相互调用
android
aqi0011 小时前
FFmpeg开发笔记(八十八)基于Compose的国产电视直播开源框架MyTV
android·ffmpeg·音视频·直播·流媒体
●VON12 小时前
双非大学生自学鸿蒙5.0零基础入门到项目实战 -《基础篇》
android·华为·harmonyos·鸿蒙
urkay-12 小时前
Android Cursor AI代码编辑器
android·人工智能·编辑器·iphone·androidx
pedestrian_h20 小时前
操作系统-线程
android·java·开发语言