同样的APP为何在Android 8以后网络感觉变卡?
前言
在无线网络技术不断发展的今天,Wi-Fi已经成为了我们日常生活中不可或缺的一部分。无论是家庭娱乐、办公还是在线游戏,Wi-Fi都在提供着便捷的互联网接入服务。然而,在安卓8.1后,为了进一步延长安卓设备的待机时间。原生安卓(AOSP等)默认开启了全局省电(低功耗模式),该模式下WIFI芯片通过牺牲网络系统来省电,同时降限制CPU的工作频率。
但是在某些特定的应用场景中,如在线游戏、实时视频会议等,低延迟比高带宽更为重要。为此,Android系统提供了一种名为WIFI_MODE_FULL_LOW_LATENCY的Wi-Fi模式,以及强制激活高性能模式WIFI_MODE_FULL_HIGH_PERF。
一、什么是WIFI_MODE_FULL_HIGH_PERF/WIFI_MODE_FULL_LOW_LATENCY?
WIFI_MODE_FULL_HIGH_PERF/WIFI_MODE_FULL_LOW_LATENCY是Android系统中Wi-Fi的一种模式,它允许设备在连接Wi-Fi网络时获得更高的性能。在这种模式下,设备会尝试使用更高的无线频率和更多的无线通道,从而提高数据传输速率和降低延迟。
二、为什么要开启WIFI_MODE_FULL_HIGH_PERF/WIFI_MODE_FULL_LOW_LATENCY?
在WIFI_MODE_FULL_HIGH_PERF/WIFI_MODE_FULL_LOW_LATENCY模式下,设备可以使用更高功耗来处理无线数据,从而提高数据传输速率。这对于需要高速无线网络的场景,如高清视频流媒体、大型文件传输等,具有很大的优势。
2.降低延迟
在网络游戏,VOIP中,延迟对于用户的使用体验至关重要。WIFI_MODE_FULL_HIGH_PERF/WIFI_MODE_FULL_LOW_LATENCY模式可以降低无线网络的延迟,使玩家在游戏中获得更流畅的操作体验。此外,对于实时音视频通话等场景,降低延迟也能提高通信质量。
3.提高网络稳定性
WIFI_MODE_FULL_HIGH_PERF/WIFI_MODE_FULL_LOW_LATENCY模式可以提高无线网络的稳定性,减少因信号干扰等原因导致的网络中断。这对于需要长时间稳定连接的场景,如远程办公、在线教育等,具有很大的帮助。
4.充分发挥设备性能
许多高端智能设备都支持高速无线网络,但默认的Wi-Fi模式可能无法充分发挥其性能。开启WIFI_MODE_FULL_HIGH_PERF/WIFI_MODE_FULL_LOW_LATENCY模式后,设备可以充分利用其硬件资源,提高无线网络性能。
三、使用WIFI_MODE_FULL_HIGH_PERF 还是 WIFI_MODE_FULL_LOW_LATENCY?
虽然WIFI_MODE_FULL_HIGH_PERF 和 WIFI_MODE_FULL_LOW_LATENCY 使用效果基本一致,但是有几个小的不同点需要注意。
1.WIFI_MODE_FULL_HIGH_PERF 在 API level 12中被引入, 但在API level 34中被标记为废弃,在以后得API版本中可能被移除。面对以后构件的代码中可能失效。
WIFI_MODE_FULL_LOW_LATENCY 在API level 29中引入,目前官方建议使用WIFI_MODE_FULL_LOW_LATENCY 替代WIFI_MODE_FULL_HIGH_PERF
2.WIFI_MODE_FULL_LOW_LATENCY 仅当获取应用程序在前台运行时,锁定才处于活动状态。但是WIFI_MODE_FULL_HIGH_PERF 启用后应用在后台状态依然可以保持无线高性能模式运行。
四、代码测试
1.在AndroidManifest.xml 文件中添加所需权限
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
2.在任意一个可以获取context的class内激活高性能模式
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
private final String TAG = "LockManager@" + hashCode();
public void onStart() {
Context appContext = getApplicationContext();
WifiManager wifiManager = (WifiManager) appContext.getSystemService(Context.WIFI_SERVICE); //激活WIFI性能锁定
wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
// wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, TAG);
wifiLock.acquire();
PowerManager powerManager = (PowerManager) appContext.getSystemService(Context.POWER_SERVICE); //激活CPU性能锁定
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
wakeLock.acquire();
super.onStart();
}
//释放性能锁定
public void onStop() {
super.onStop();
if (wakeLock != null) {
wakeLock.release();
wakeLock = null;
}
if (wifiLock != null) {
wifiLock.release();
wifiLock = null;
}
}
五、测试结果
在为打开测试app时ping目标机器 20个包平均延迟为185ms,最大值为555ms。 在长期测试中无线漫游丢包率为3%
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-05-06-14-14qQRgRT4rZ140AWLj.png)
在通过测试app激活高性能模式后 同样的20个包平均延迟为6.7ms,最大值为23ms. 在长期测试中无线漫游丢包率为0%
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-05-06-14-15rWjdSWQVyLpjV15L.png)
六、总结
目前市面上的安卓版本分裂较为严重,无法做到ios一样强统一。针对无线性能问题,国内的几大主流厂家均在自己的UI界面中有优化。但是原生安卓,AOSP等等小厂家,物联网设备,物流设备以及系统优化功底不到位的设备生产商均未针对性优化该问题。
目前市面上Bilibili,各类游戏APP,语音会议等等对用户体验,无线要求较高的软件均启用了该API,来提高网络响应速度。
如果用户对无线网络要求延迟在30ms内 丢包率小于1%的使用场景 ,建议APP手动激活高性能模式。保证用户体验的一致性