Android13 wifi设置关闭后断电重启会自动打开
一、主题
wifi设置关闭后断电重启会自动打开
二、问题背景
硬件:全志平台
软件:android 13
三、问题描述
1、复现步骤
(1)当前wifi关闭状态时:
打开wifi,并连接ap
等待一段时间
设备断电关机并重启
wifi状态仍为关闭
(2)当前wifi打开状态时:
关闭wifi
等一段时间
设备断电关机并重启
wifi状态仍为打开
2、具体表现
(1)系统断电后,系统级别的配置非断电前修改的状态
(2)如wifi设置关闭后断电重启,wifi还是处于打开状态
四、问题分析
有以下两种可能性:
1、WiFi状态保留在内存状态,未保存持久化
2、WiFi状态保存磁盘后,未刷IO CACHE,导致文件系统数据未实际写入磁盘,导致掉电后数据丢失
排查代码,发现WiFi开关后,会更新Settings属性,对应属性如下:
Settings.GLOBAL.WIFI_ON
检查Settings代码,对应设置通过SettingsProvider.java,写入/data/system/user/0/settings_global.xml文件。
进行验证,开/关WiFi,检查xml文件,发现文件实时更新。此时通过命令行对文件进行sync操作,然后掉电状态能够保存成功。
五、根本原因
根据问题分析,原因为:WiFi状态保存磁盘后,未刷IO CACHE,导致文件系统数据未实际写入磁盘,导致掉电后数据丢失data分区是f2fs的文件系统格式,sync时掉电有概率导致settings_global.xml文件大小为0
六、解决办法
1、通过在Settings设置属性后,在代码中对/data/system/user/0/settings_global.xml文件进行sync操作,能正常保存WiFi状态。
路径:frameworks/base/core/java/android/provider/Settings.java
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 4172a936..586250c0 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -67,6 +67,7 @@ import android.os.Build;import android.os.Build.VERSION_CODES;import android.os.Bundle;import android.os.DropBoxManager;
+import android.os.Environment;import android.os.IBinder;import android.os.LocaleList;import android.os.PowerManager;
@@ -97,6 +98,9 @@ import com.android.internal.annotations.GuardedBy;import com.android.internal.util.Preconditions;import com.android.internal.widget.ILockSettings;+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileOutputStream;import java.io.IOException;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;
@@ -16355,8 +16359,19 @@ public final class Settings {return System.putStringForUser(resolver, name, value, tag,makeDefault, userHandle, overrideableByRestore);}
- return sNameValueCache.putStringForUser(resolver, name, value, tag,
+ //return sNameValueCache.putStringForUser(resolver, name, value, tag,
+ boolean result = sNameValueCache.putStringForUser(resolver, name, value, tag,makeDefault, userHandle, overrideableByRestore);
+ try {
+ FileOutputStream fos = new FileOutputStream(new File(Environment.getUserSystemDirectory(userHandle), "settings_global.xml"));
+ FileDescriptor fd = fos.getFD();
+ fd.sync();
+ fos.close();
+ Log.i(TAG, "sync file settings_global.xml done");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return result;}/**
2、板级配置中注释F2FS文件系统
路径;device/softwinner/saturn/t527-sany_v7/BoardConfig.mk
@@ -196,7 +196,7 @@ BOARD_SYSTEM_DLKM_SRC := vendor/gki/system_dlkm-5.15# Following line is copied from Google suggest system_dlkm config, haven't found android build system take advantage of it.BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm-TARGET_USERIMAGES_USE_F2FS ?= true
+#TARGET_USERIMAGES_USE_F2FS ?= true
3、需将data分区改为ext4文件系统
路径;device/softwinner/saturn/common/storage/fstab.template
diff --git a/BoardConfig.mk b/BoardConfig.mk
index 571f73b..8b34c14 100644
--- a/BoardConfig.mk
+++ b/BoardConfig.mk
@@ -196,7 +196,7 @@ BOARD_SYSTEM_DLKM_SRC := vendor/gki/system_dlkm-5.15# Following line is copied from Google suggest system_dlkm config, haven't found android build system take advantage of it.BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm-TARGET_USERIMAGES_USE_F2FS ?= true
+#TARGET_USERIMAGES_USE_F2FS ?= trueBOARD_VNDK_VERSION := currentdiff --git a/common/storage/fstab.template b/common/storage/fstab.template
index 88cd3d0..4f59fa2 100644
--- a/common/storage/fstab.template
+++ b/common/storage/fstab.template
@@ -8,7 +8,7 @@ system_dlkm /system_dlkm ext4 rovendor /vendor erofs ro wait,first_stage_mount,logical,slotselectvendor_dlkm /vendor_dlkm erofs ro wait,first_stage_mount,logical,slotselectproduct /product erofs ro wait,first_stage_mount,logical,slotselect
-/dev/block/by-name/userdata /data f2fs noatime,nosuid,inlinecrypt,nodev,discard,reserve_root=128000,resuid=0,resgid=1065 wait,check,formattable,quota,reservedsize=128M,latemount,checkpoint=fs,fileencryption=aes-256-xts:aes-256-cts,keydirectory=/metadata/vold/metadata_encryption
+/dev/block/by-name/userdata /data ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard,errors=panic,reserve_root=128000,resuid=0,resgid=1065 wait,check,formattable,quota,reservedsize=128M,latemount,checkpoint=fs,fileencryption=aes-256-xts:aes-256-cts,keydirectory=/metadata/vold/metadata_encryption/dev/block/by-name/metadata /metadata ext4 nodev,noatime,nosuid,errors=panic wait,first_stage_mount,formattable,check/dev/block/by-name/treadahead /treadahead ext4 nodev,noatime,nosuid,errors=panic wait,first_stage_mount,formattable,check/dev/block/by-name/media_data /oem vfat ro,nodev,noatime,nosuid,context=u:object_r:oemfs:s0 wait,first_stage_mount,formattable,check
再次测试时,正常!!!
七、连接问题
1、现象:
(1)重复开关WiFi,发现WiFi无法回连。
(2)长时间连接热点,wifi经常出现掉线。显示WiFi信号比较弱。
(3)设置连接路由器,密码是正确的,但是最终显示密码错误。
2、解决办法
(1)首先检查天线是否插好。
(2)跟天线厂家确定天线是否跟整体匹配。
(3)通过频谱仪测试WiFi蓝牙射频。
(4)可以通过iperf测试网络吞吐量,如果不达标大概率硬件有问题。
(5)检查软件天线配置。(注意单双天线配置问题,部分模块存在该问题)。
注:
单天线模式
如果板子上设计了一根天线接口,那么则需要在软件上设置成单天线模式。
路径:device/softwinner/xxx(方案名)/xxx(设备名)/device-common.mk
PRODUCT_VENDOR_PROPERTIES += ro.hardware.bt.ant=5
双天线模式
如果板子上设计了两根天线接口,那么则需要在软件上设置成双天线模式。
路径:device/softwinner/xxx(方案名)/xxx(设备名)/device-common.mk
PRODUCT_VENDOR_PROPERTIES += ro.hardware.bt.ant=2
3、查看模式
cat /sys/devices/platform/aic-bsp/aicbsp_info/btmode
-
如果 cat 出来的结果为 5,则是单天线模式
-
如果 cat 出来的结果为 2,则是双天线模式