翻译此篇文章,总共加起来有6个小时。有些英文长句,里面包含的各种从句,需要借助翻译软件才勉强理解,但是其实文章中还是会有大量不是特别流畅的语言,有两个地方需要提高,一是写作的语言组织表达能力。二是一个英语长句型包含的各种从句(后面的翻译文章会对典型的长句子单独出来做句子成分分析,同时也是进一步提高自己英文读的能力)。

原文链接:https://google-developer-training.github.io/android-developer-advanced-course-concepts/unit-2-make-your-apps-fast-and-small/lesson-4-performance/4-3-c-best-practices-network-battery-compression/4-3-c-best-practices-network-battery-compression.html

内容:

  1. 无线
  2. 网络电池最佳实践
  3. 优化图片
  4. 文本数据压缩
  5. 序列化数据
  6. 相关实践
  7. 学习更多

大多数据用户使用的是有限的带宽且是昂贵的数据流量,和当一款app用尽手机电量,所有的用户是不高兴的。网络是最消耗电池因素的其中一个。减少电池消耗和减少数据传输的大小及频率,并且遵循最佳实践来优化你的网络。

全球超过一半的用户在2G网络上体验你的app。通过优化你的应用以适应低速连接和离线工作来提供他们使用app的体验。为此,需要存储数据,排队请求和处理图像以获得最佳性能。

开发人员的总体目标:

  1. 减少有效无线电时间。你可以通过优化网络请求的频次和批量请求来达到这一点。
  2. 减少每次请求的数据量。

优化网络和电池性能是一个巨大的话题,而且随着设备和Android操作系统的变化,一些建议也会随之改变。Android团队不断改进框架和api,使你更容易编写出性能良好的app。如果你想深入挖掘并获得最新的建议,充分利用本文档所链接的各种资源。

本章介绍了完了过和电池优化的基本介绍,以及推荐的实践。

无线电

在你的移动设备里面是一小块硬件,实际上就是无线电。这中无线电的目的是与当地的蜂窝基站通信并传输数据。然而这种无线电并不总是活跃的和吸收能量。它以低电耗状态开始,当这个设备需要发送数据,无线电开关开启并传输数据。数据包发送后,无线电保持活跃一段时间,以防止服务器发送响应。最后,无线电休眠以节省电量。

重要:状态和电量消耗的确切数量依赖以设备和Android版本号。每个设备上的无线状态机根据使用的移动无线技术(2g,3G,LTE等)而不同。这种变化尤其适用于过渡延迟和启动延迟。这些属性由设备的网络运营商来定义和配置。

一个典型3G网络无线电的状态机由三种能量状态组成:

  1. 全功率:当链接处于活动时使用,允许设备以最高速率来传输数据。
  2. 低功率:一种中间状态,使用全功率的50%。
  3. 待机:最小的能量状态,在期间没有网络链接是活动的或者需要的。

然而低功率和待机状态下消耗的电量比全功率下要小得多,且它们还会给网络延迟带来显著的延迟。从低功率到全功率大约需要1.5秒,从待机到全功率需要2秒以上。

为了最小化延迟,状态机使用延迟来推迟到低功率的转换。下图为一个典型3G无线电使用AT&T的计时。下图显示了它在待机,低功率和全功率下转换花费无线电多长时间。这个箭头显示了状态变化的方向和在状态之间转换的延迟秒数。

为了解更多Android无线电状态,请查阅无线状态机。

从发送请求和接收请求的角度来看:

  1. 当无线电首次唤醒,会消耗比较高的电量,正如下图中黄色标注的(硬件唤醒)。
  2. 当数据包发送和接收时,会有一些额外的峰值,正如图中的蓝色和粉色标注的(数据包发送和数据接收)。
  3. 当无线电处于低功率或者待机下时,会由一个连续的拉图,正如图中红色标注的(保持唤醒)。

当手机无线电开始,无线电硬件开始唤醒,且有个相关的电池消耗。一个数据包发送出去后,无线电保持20到30秒的唤醒状态等待服务器响应。然后无线电进入较低的状态,然后关闭。

你需要最小化无线电通电的次数。每个周期发送尽可能多的数据,并在关闭硬件千获得服务器响应。做到这些需要计时技巧,和有些服务器api包括JobScheduler和Firebase JobDispatcher来帮助你。即使使用这些api,你也应该遵循网络和电池最佳实践。

网络和电池最佳实践

通过网络发送和接收数据是消耗电池最大的用户之一。电池效率的最大提升可能来自于改善网络与硬件的交互方式。

有三种形式的网络请求,它们需要不同的处理:

  1. 现在:这些网络请求基本都是由用户发起的,并且用户希望快速的响应。因此这里并没有多大的优化空间。签到和请求图片是立即网络请求的例子。
  2. 服务器响应:应用程序向服务器发起请求,且服务器发送了响应。为了提高请求的资源利用率和减小请求、响应的大小,只请求你需要的数据和使用压缩。
  3. 数据推送,如上传分析,保存状态或同步。你可以优化推送的时间和接收的数据大小。

减少网络使用和电池消耗的最佳实践:

不要轮训服务器来获取更新。一个每隔20s向服务器发送一次信号的app,仅仅是告知这款app在运行且对用户是可见的,保持无线电无限制开启。因为这个原因保持无线电开启会导致没有任何实际数据传输的巨大电池消耗。相关你可以使用Firebase cloud messaging服务,让服务器在有新数据可用时通知你的app。

不要过渡同步。按你的实际需要来同步数据。理想的是当手机wifi连接的时候。

下图显示了对于捆绑数据传输(左图)和非捆绑数据传输的相关无线电量使用情况。扇形图中的红色部分显示高电量消耗,橘色部分显示低电量使用,蓝色显示待机状态。

  1. 延迟非立即请求直到连接WIFI状态下或者手机插入充电中。WIFI无线电比移动无线电消耗的电量要小的多。详情可查看“基于你连接的网络类型来修改你的下载模式”。
  2. 预拉取数据。尝试预估用户在接下来的几分钟用户可能需要的数据并通过请求数据提前下载。这需要一些猜测,但如果预估正确,你可以保存。例如,如果用户正在听一系列播放列表,很可能用户会听下一首,你可以提前获取它。对于一个新闻类app,预拉取所有的突发新闻是有意义的或者提前拉取用户喜欢的作品。详情请看“预拉取数据”。
  3. 适应用户正在做的事。例如,如果用户的电话没有激活达到8个小时,突然进行激活且它是早上,很可能该用户刚起床。如果该设备在WIFI状态下,同步用户的Email数据,而不是在用户上班或者学校中设备处于WIFI断开时来处理。
  4. 在媒体播放前获取文本。文本请求比媒体请求看起来更小和更容易压缩。这意味着文本请求更快,也意味着你的app可以快速的展示有用的内容。使用“懒惰”加载图像。如果用户滚动超过项目,则取消图片下载。
  5. 压缩你的数据。一般来说,CPU压缩和解压缩数据所消耗的时间要比无线电通过网络传输相同数据所消耗的电量要小的多。有关图像压缩的更多内容,请参考本文档的“优化图像”章节。有关数据压缩的参考资源列表,请参阅本文的“了解更多”一节。

使你的APP在无网络状态下可用:

  1. 当用户脱机时捆绑网络请求。例如,让用户在脱机时编写信息,在联机时发送给信息。
  2. 本地存储和缓存数据。Android应用的缓存默认是关闭的。要启用所有响应的缓存,使用HttpResponseCache类。(详细信息请参考#CACHEMATTERS网络视频)将Firebase cloud message和本地存储结合使用。你可以使用数据库或者类似的结构,使其可以在任何网络条件下都能最佳执行。例如,将SQLite与内容提供者一起使用)
  3. 考虑离线优选的系统架构,它优选从本地存储获取数据,如果失败,再从网络请求数据。网络数据回来之后,数据缓存在本地给将来使用。这有助于确保对同一数据的网络请求只发生一次--后续的请求在本地得到满足。为了达到这,使用本地的数据库来保存长期的数据(通常是SQLite或者SharePreferences)。
  4. 节省网络性能最好的方式是不下载或者上传数据。APP应该缓存从网络获取并有可能再次使用的内容。在进行后续网络请求之前,app应该展示本地缓存的数据。这确保应用程序即使在设备无网络或者在一个缓慢 不可靠的网络上应用程序也能正常工作。关于条件请求,请参见ETag和HTTP 304。

适应到可用的连接和质量

使用以下方法检测网络状态和能力。用来自于这些方法的数据来调整你的app对网络的使用,依次能够及时的响应用户的操作:

  1. ConnectivityManager > isActiveNetworkMetered()
  2. ConnectivityManager > getActiveNetworkInfo()
  3. ConnectivityManager > getNetworkCapabilities(Networknetwork)
  4. ConnectivityManager > getNetworkInfo(Networknetwork)
  5. TelephonyManager > getNetworkType()

遵循以下实践原则:

  1. 在较慢的连接上,考虑只下载低分辨率的媒体或者不下载。
  2. 在请求发送数据之前,通过检查连接和网络能力来适应你的app的行为。
  3. 如果你的应用执行大量的网络操作,提供用户设置允许用户控制应用数据习惯。例如,让用户控制你的应用程序同步数据的频率,是否只在wifi状态下上传和下载数据,是否在漫游下使用数据。
  4. 只有连接到wifi才获取到大数据。
  5. 当设备连接上wifi时,预拉取数据。

下面代码片段测试WIFI和移动网络的连通性。这代码确定WiFi或者移动网络接口是否可用(也就是说,网络连接是否可用)和可连接。也就是说,代码测试是否存在网络连通性,是否有可能创建套接字和发送数据。

你需要网络状态访问权限来读取设备网络连接信息。你需要网络权限来连接网络。

更多信息参见管理网络使用。

优化图片

在一个应用中,大部分下载流量是由图片组成。因此,你能使你下载的图片越小,你的应用程序给用户提供的网络体验越好。本节提供了如何使图像文件更小和更有利于网络的指导。

有几种方式使图片更快的下载。其中包括使用WebP图像、动态调整图像大小和使用图像加载库。

WebP images

WebP是来自于google的一种图像文件格式。WebP提供有损压缩(就像JPG一样)和透明度(就像PNG一样),但是WebP可以提供比JPG或PNG更好的压缩。

通过网络提供WebP文件减少图像加载时间和节省带宽。一个WebP文件通常比它对应的PNG和JPG文件小,但至少有相同的质量。即使使用有损设置,WebP可以产生一个和原始一样的图像。自从Android4.0以来,Android已经包含了有损WebP支持,从Android4.2以来,支持无损、透明的WebP。

PNG images

通过减少唯一的颜色数量来优化PNG图像。这是应用于图像的预处理步骤,有一些工具可以帮助你。请参阅“缩小图像下载大小”。

在下图中,减少像素之前(左图)和之后(右图),你可以看到质量的损失。大部分的渐变颜色已经被替换,给图像带来了带状效果。放大图像可以更清晰的看到数据的丢失。

JPG images

调整图像的质量到最低要求。对于一个普通的JPG来说,从100到75的外观质量有一个非常小的变化,但是每一步都有一个显著的文件大小差异。这意味着以质量75的视觉来看,许多图像看起来很好,但这些图像只有质量95图像的一半大。当减少到质量75以下,会有一个明显的视觉变化。

选择正确的图像格式

不同的图像格式适用于不同类型的图像。JPG和PNG有非常不同的压缩过程,它们产生不同的结果。

PNG和JPG之间的选择通常取决于图像本身的复杂性。下图显示了两幅不同的图像,它们的结果取决于你使用的压缩方案。左边的图有很多细节,因此使用JPG压缩更有效果。右边的图带有许多相同的颜色,使用PNG压缩更有效。

转存失败重新上传取消

WebP作为一种格式可以同时支持有损和无损模式,使其成为PNG和JPG的理想替代品。唯一需要记住的是它只支持运行Android4.2.1或更高的设备。幸运的是,大多数设备都满足了这一要求。

确立最佳质量值

有几种技术可以用来在压缩和图像质量之间达到适当的平衡。以下描述的技术使用标量值,因此只适用于JPG和WebP。另一个技术利用了Butteraugli库,它可以预估两幅图像的视觉差异(也就是说它估计了用户感知两幅图像的不同之处)。Butteraugli库可用于所有图像格式。

利用标量值(只对于JPG和WebP)

JPG和WebP的强大之处在于,您可以使用0到100之间的标量值来平衡质量和文件大小。诀窍时找出你的图像正确质量值是多少。质量水平过低会产生一个小文件,以牺牲图像质量为代价。过高的质量级别会增加文件大小,而不会给用户带来明显的好处。

最简单的方案是选择一个非最大值,然后使用这个值。但是要注意,质量值对每张图片的影响是不一样的。例如,75%的质量值,在大多数图像上看起来都很好,但在某些情况下可能效果不佳。你应该确保将你选择的最大值与具有代表性的图像样本进行测试。另外,请确保在原始图像上执行所有的测试,而不是压缩的图像。

对于每天上传和发送数百万张JPG图像的大型媒体app,手动调优每张图片资源是不切实际的。你可以通过图片分类来指定几个不同的质量级别来解决这个问题。例如,你可以使用35%来作为设置缩略图的质量值,因为较小的图像隐藏更多的压缩工件。

提供不同尺寸

在服务器上只保留一中分辨率图像时很诱人的。当设备访问图像,服务器根据该设备分辨率来提供相应图片,并下方缩放图片给设备。这个方案对你来说很方便,但是它可能会迫使用户下载更多的数据。相反,存储每个尺寸大小的图像并为每个用户提供最合适的尺寸大小图像。例如,对于缩略图,提供实际的缩略图图像而不是在设备缩小的完整版本的图像。

提供合适大小图像有利于提供下载速度,而且对于有限数据计划的用户来说,成本更低。当你提供给合适大小图像时,占用的设备空间内存大小更小。对于大图像,例如4K分辨率图像,这种方法还可以避免设备在加载图像之前调整图像大小。

为了实现这个方法,你需要一个后端图像服务,它可以提供具有适当缓存的各种分辨率的图像。现有的服务可以帮助完成这个任务。例如,google APP Engine已经安装了图像大小自动调整功能。

有关图像格式和如何选择正确的格式的更多信息,请参阅“缩小图像下载大小”。

动态调整大小图像

当你从服务器下载图像,为该设备请求合适大小的图像。根据网络带宽和质量来调整图像大小。通过这种方法动态调整图像的大小,可以减少传输的数据大小,提高下载速度,减少设备上所需的内存数量。

使用图像加载库

你的APP不应该下载任何图像超过一次。加载图像库例如Glide和Picasso只拉取图像一次,缓存它,在实际图像准备好之前,为视图提供钩子来显示占位图像。因为图像时缓存的,所以这些库在下次请求图像时返回图像的副本。

文本数据压缩

除了优化图像,你可能还需要减少文本过多的页面大小。首页测试在移动设备上一个页面加载需要多久,如果有问题,请考虑以下措施:

  1. 使页面更小。使用更少的词汇来编辑页面,移除不想关的内容。把这个页面分成多个小页面。
  2. 使变小。CSS和Javascript迷你器功能强大,易于使用,适合现有的构建管道。
  3. 压缩。确保服务器开启了GZIP压缩。

序列化数据

序列化时把结构数据转换成可以在网络上存储和发送的格式的过程。在目的地,原始数据被重建。JSON和XML是人类可读的示例序列化格式,但体积大且速度慢。

使用FlatBuffers创建描述数据的模式,然后将数据编译为可以序列化和反序列化的源代码。它比使用JSON或XML更小 更快。

相关实践

相关的练习和实践文档在“优化网络 电池和图像使用”。

android最佳实践:网络 电池 压缩相关推荐

  1. android系统功耗优化(2)---Android最佳实践之性能 - 电池续航时间优化

    Android最佳实践之性能 - 电池续航时间优化 Doze和App Standby的优化(API23) 参考地址:http://developer.android.com/training/moni ...

  2. fir.im Weekly - 2016 年 Android 最佳实践列表

    2016 年已经过去一半,你在年初制定的成长计划都实现了吗? 学海无涯,技术成长不是一簇而就的事情.本期 fir.im Weekly 推荐 王下邀月熊_Chevalier的 我的编程之路--知识管理与 ...

  3. Android 最佳实践

    Android 最佳实践 此篇文章主要用来记录一些在日常Android开发中比较好用的一些库或者方法 1:TextView相关 通用TextView的封装:https://github.com/lyg ...

  4. Android最佳实践之性能 - 电池续航时间优化

    Doze和App Standby的优化(API23) 参考地址:http://developer.android.com/training/monitoring-device-state/doze-s ...

  5. 针对《等保2.0》要求的云上最佳实践——网络安全篇

    简介:伴随着国内企业上云步伐的加快,越来越多的企业需要对云上关键业务进行等级保护自查或完成相关认证.本文以<GB/T 22239-2019 信息安全技术 网络安全等级保护基本要求>中所要求 ...

  6. 2016里一些Android最佳实践列表——Opinionated

    本文是一篇属于Opinionated的文章,只是代表了作者的个人观点,笔者看到Medium有两人发了都是关于最佳实践的Checklist,就把二者集成了下,并且加入了一些个人的看法,基本的知识点分布方 ...

  7. [转]Android最佳实践之:StrictMode介绍

    [IT168技术]最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写 ...

  8. Android最佳实践之UI

    为多屏设计(一) - 支持多个屏幕尺寸 参考地址:http://developer.android.com/training/multiscreen/index.html Android UI设计提供 ...

  9. android 最佳实践,Android开发最佳实践(四)

    大多数时候,侧滑菜单都是从左到右滑出的,但是我们也可以做到从右往左滑出,只需要在DrawerLayout的菜单布局LinearLayout里面修改一下margin的相关属性即可: 9)Tabs and ...

最新文章

  1. 宁波城市职业技术学院Linux,宁波城市职业技术学院拟聘用人员公示
  2. 《现代操作系统》读书笔记之——进程调度(二)
  3. solr5.3.1 mysql_Solr5.3.1 dataimport 导入mysql数据
  4. 细数python标准库中低调的模块
  5. 华为全场景AI计算框架MindSpore正式开源,赋能开发者昇腾万里
  6. 20190901每日一句 那就从现在开始吧,让生命变得更有价值
  7. Creo6.0无人机建模与结构设计视频教程
  8. cass有坐标文件生成里程文件_南方CASS里程文件生成
  9. scrapy1.5文档(第二节 Scrapy Tutorial)
  10. 选择中医 - 虚寒性体质的人吃什么好(萝卜、生姜、地瓜、大蒜)
  11. Android-Bitmap图片优化
  12. PHP 异步并行编程_韩天峰
  13. Excel项目管理工具
  14. 必应拼音输入法与搜狗拼音输入法对比评测报告之功能评价篇
  15. VideoPose3d:环境搭建+制作自己的视频
  16. 相关高斯分布的MIMO信道矩阵的容量统计特征推导
  17. AD 20联合KeyShot实现渲染
  18. 域控管理员账号登录Windows Server 2016服务器,鼠标点击声音、图标等设置报错 rundll32.exe Windows无法访问指定设备、路径或文件。
  19. 计算机真题训练6word上机题,Micrsoft Office Word上机练习题集.docx
  20. 【CEPH-初识篇】ceph详细介绍+“ 一 ” 篇解决ceph集群搭建, “ 三 ” 大(对象、块、文件)存储使用

热门文章

  1. 小米-9-14-笔试
  2. OpenStack Trove1
  3. [转] Phun,让人惊讶的小程序
  4. html发票页面,HTML5 发票模板
  5. 多人扑克游戏:99分游戏规则介绍
  6. 多多参谋参谋|拼多多店群什么产品容易成为爆款呢|魔店分享
  7. IAR Embedded Workbench 将支持 RISC-V 太空级处理器 NOEL-V
  8. 在这个五月《安装Linux》简直易如反掌
  9. mysql 生成id函数_MySQL ID生成策略
  10. 云服务器哪家好?云服务器评测对比