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源码的漏洞了。

相关推荐
阿巴斯甜9 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker9 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952710 小时前
Andorid Google 登录接入文档
android
黄林晴12 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android