同样的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?

1.提高数据传输速率

在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%

在通过测试app激活高性能模式后 同样的20个包平均延迟为6.7ms,最大值为23ms. 在长期测试中无线漫游丢包率为0%

六、总结

目前市面上的安卓版本分裂较为严重,无法做到ios一样强统一。针对无线性能问题,国内的几大主流厂家均在自己的UI界面中有优化。但是原生安卓,AOSP等等小厂家,物联网设备,物流设备以及系统优化功底不到位的设备生产商均未针对性优化该问题。

目前市面上Bilibili,各类游戏APP,语音会议等等对用户体验,无线要求较高的软件均启用了该API,来提高网络响应速度。

如果用户对无线网络要求延迟在30ms内 丢包率小于1%的使用场景 ,建议APP手动激活高性能模式。保证用户体验的一致性

作者:京东零售 罗旅帆

来源:京东云开发者社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/767991.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu18.04新安装--无网络连接、重启黑屏解决教程

一、安装Ubuntu Ubuntu安装需要U盘作为启动盘&#xff0c;在目前教新的电脑中选中GPT作为分区&#xff0c;制作启动盘&#xff0c;其中在安装双系统Ubuntu时&#xff0c;以自定义格式作为存储空间。详细安装过程以以及如何分区请参考下列链接&#xff1a;内含详细安装过程&…

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了&#xff0c;续费提醒那是提前一周准时到来&#xff0c;但是看到客户发来的续费价格截图&#xff0c;我是真的没忍住。这不就是在杀熟吗&#xff1f;就这配置续费竟然如此昂贵&#xff1f;说实话这个客户的服务器代维是…

哈哈看到这条消息感觉就像是打开了窗户

在这个信息爆炸的时代&#xff0c;每一条动态可能成为我们情绪的小小触发器。今天&#xff0c;当我无意间滑过那条由杜海涛亲自发布的“自曝式”消息时&#xff0c;不禁心头一颤——如果这是我的另一半&#xff0c;哎呀&#xff0c;那画面&#xff0c;简直比烧烤摊还要“热辣”…

Qt安装配置教程

目录 一、下载Qt二、进行安装1、点击安装包&#xff08;QT6.7版本演示&#xff09;2、注册Qt账号3、选择安装的位置4、选择对应的组件 三、新建项目1、打开Qt Creator2、创建项目3、编辑名称和地址4、选择默认的CMake或切换成qmake构建5、选择自己的编译器&#xff0c;在此选择…

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列 1.打开https://ui.perfetto.dev 导入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.点击Query(SQL),在输入框中输入以下内容,按CtrlEnter,显示查询结果4.点击Show timeline,点击…

告别PS修图,设计师都在用的AI抠图工具

引言 大家好&#xff01;如果你是美工或设计师&#xff0c;肯定深知Photoshop修图的繁琐和耗时。现在有一款超方便的工具&#xff0c;让你摆脱这些问题——千鹿设计助手。它不仅是个抠图工具&#xff0c;还能通过先进的AI技术&#xff0c;让抠图变得简单快速&#xff0c;让你专…

jdk动态代理-基于反射的动态代理

JDK动态代理的示例图&#xff0c;下图的绿色箭头表示实现的关系&#xff0c;白色虚线表示依赖关系&#xff0c;target表示被ProxyFactory的target成员表示代理类对象&#xff0c;由ProxyFactory传入的Object参数初始化&#xff0c;接着调用getProxyInstance函数利用反射来返回代…

npm 淘宝镜像证书过期,错误信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更换 npm 证书 问题描述报错原因更换步骤1 找到 nvm 安装目录2 发现证书过期3 更换新地址4 保存后&#xff0c;重新安装成功 问题描述 在使用 nvm 安装新版本时&#xff0c;未成功&#xff0c;出现报错&#xff1a; Could not retrieve https://npm.taobao.org/mirrors/node/l…

02:项目1 (按键点灯)

按键点灯 1、嘉立创EDA的简要介绍2、硬件的选型与原理图设计3、PCB设计4、下单啦 1、嘉立创EDA的简要介绍 1、EDA的基础设置 2、新建工程 2、硬件的选型与原理图设计 ①在EDA软件按下 shiftf 打开嘉立创商城&#xff0c;然后在里面选型 ②打开数据手册&#xff0c;能看到基本…

【FDTD 仿真案例解析】

平面结热电子光探测器是一种基于热电子效应的光探测器&#xff0c;其工作原理是利用光子的能量激发金属表面的热电子&#xff0c;从而产生电流。 激发光学Tamm态是指在金属-介质结界面上的电磁场分布出现共振现象&#xff0c;形成一种特殊的表面态。这种表面态具有高度局域化的…

JS(JavaScript)数据校验 表单校验-案例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Spark join数据倾斜调优

Spark中常见的两种数据倾斜现象如下 stage部分task执行特别慢 一般情况下是某个task处理的数据量远大于其他task处理的数据量&#xff0c;当然也不排除是程序代码没有冗余&#xff0c;异常数据导致程序运行异常。 作业重试多次某几个task总会失败 常见的退出码143、53、137…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【18】认证服务02—微博社交登录

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【18】认证服务02—微博社交登录 微博社交登录图示原理前置准备实现流程完整代码 参考 微博社交登录 OAuth&#xff1a; OAuth&#xff08;开放授权&#xff09;是一个开放标准&#xff0…

qt6 通过http查询天气的实现

步骤如下&#xff1a; cmakelist 当中&#xff0c;增加如下配置 引入包 访问远端api 解析返回的数据 cmakelist 当中&#xff0c;增加如下配置&#xff0c;作用是引入Network库。 引入包 3、访问远端api void Form1::on_pushButton_clicked() {//根据URL(http://t.weather.…

6.Android逆向协议-配置FD抓包环境

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;5.Android逆向协议-初识HTTP和HTTPS协议 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.…

20.《C语言》——【移位操作符】

&#x1f339;开场语 亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&a…

大数据之Linux部署常用命令脚本封装

文章目录 编写集群命令执行脚本xcall集群命令执行1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xcall脚本3.3 修改脚本执行权限3.4 测试脚本 编写集群分发脚本xsync集群分发脚本1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xsync脚本3.3 …

cad由于找不到mfc140u.dll的解决方法,彻底解决mfc140u.dll丢失问题

在计算机辅助设计&#xff08;CAD&#xff09;的时候&#xff0c;我们可能会遇到各种错误和问题。其中&#xff0c;“CAD由于找不到mfc140u.dll&#xff0c;无法继续执行代码”的错误提示。这个问题可能会导致CAD无法启动运行&#xff0c;因此&#xff0c;我希望通过分享我的经…

外籍学员报到,四川眼科医院开启国际屈光手术专科医生培训

“能够来到中国、来到四川眼科医院学习&#xff0c;我真的很幸运&#xff01;”这个夏天&#xff0c;对于马来西亚眼科医生Ivan Cheng En Yoo来说&#xff0c;充满了期待和挑战。他是首位来到四川眼科医院进修学习的马来西亚籍医生&#xff0c;Ivan Cheng将在周进院长的带领下&…

AzureDataFactory 实体间的关联如何处理(Lookup)

使用ADF从外部数据源(例如Sql Server)往D365推数时&#xff0c;实体间的Lookup一定是要做的&#xff0c;本篇以我项目中的设备为例&#xff0c;设备表中有产品的lookup字段 设备表结构如下 msdyn_customerasset 表名ID 设备表guidSerialNumber设备序列号ProductCode设备对应的…