【Android Advanced Training - 05】传输数据时避免电量的浪费[Lesson 1 - 看无线电波如何影响网络操作]

Lecture5量化 在IEEE 754标准中表示32位浮点数方法,分为标准化和非标准化。左边是标准化浮点数,分为符号位,指数位和尾数位,−1sign∗1Fraction∗2Exponent−127这里的1 + Fraction表示还原出实际的尾数值。图中的例子表示一个具体的32位浮点数,符号位0表正数,指部分01111101->二进制转10进制是125,减去偏移量127,得到指数为-2。尾数部分00010000000000000000000,表示0.0625。 阅读详情

分类: Android   981人阅读  评论(2)  收藏  举报

Optimizing Downloads for Efficient Network Access

[用有效的网络访问来最优化下载]

  • 也许使用无线电波(wireless radio)进行传输数据会是我们app最耗电的操作之一。所以为了最小化网络连接的电量消耗,懂得连接模式(connectivity model)会如何影响底层的音频硬件设备是至关重要的。
  • 这节课介绍了无线电波状态机(wireless radio state machine),并解释了app的connectivity model是如何与状态机进行交互的。然后会提出建议的方法来最小化我们的数据连接,使用预取(prefetching)捆绑(bundle)的方式进行数据的传输,这些操作都是为了最小化电量的消耗。

The Radio State Machine[无线电状态机]

  • 一个完全活动的无线电会消耗很大部分的电量,因此需要学习如何在不同状态下进行过渡,这样能够避免电量的浪费。
  • 典型的3G无线电网络有三种能量状态:
    • Full power: 当无线连接被激活的时候,允许设备以最大的传输速率进行操作。
    • Low power: 相对Full power来说,算是一种中间状态,差不多50%的传输速率。
    • Standby: 最低的状态,没有数据连接需要传输。
  • 在最低并且空闲的状态下,电量消耗相对来说是少的。
  • 这里需要介绍一延时(latency)的机制,从low status返回到full status大概需要花费1.5秒,从idle status返回到full status需要花费2秒。
  • 为了最小化延迟,状态机使用了一种后滞过渡到更低能量状态的机制。下图是一个典型的3G无线电波状态机的图示(AT&T电信的一种制式).


  • 在每一台设备上的无线状态机都会根据无线电波的制式(2G,3G,LTE等)而改变,并且由设备本身自己所使用的网络进行定义与配置。
  • 这一课描述了一种典型的3G无线电波状态机,data provided by AT&T(http://www.research.att.com/articles/featured_stories/2011_03/201102_Energy_efficient?fbid=SYuI20FzBum)。这些原理是具有通用性的,在其他的无线电波上同样适用。
  • 这种方法在浏览通常的网页操作上是特别有效的,因为它可以阻止一些不必要的浪费。而且相对较短的后期处理时间也保证了当一个session结束的时候,无线电波可以转移到相对较低的能量状态。
  • 不幸的是,这个方法会导致在现代的智能机系统例如Android上的apps效率低下。因为Android上的apps不仅仅可以在前台运行,也可以在后台运行。[无线电波的状态改变会影响到本来的设计,有些想在前台运行的可能会因为切换到低能量状态而影响程序效率。坊间说手机在电量低的状态下无线电波的强度会增大好几倍来保证信号,可能与这个有关]

How Apps Impact the Radio State Machine[看apps如何影响无线状态机(使用bundle与unbundle传输数据的差异)]

  • 每一次新创建一个网络连接,无线电波就切换到full power状态。在上面典型的3G无线电波状态机情况下,无线电波会在传输数据时保持在full power的状态,结束之后会有一个附加的5秒时间切换到low power,再之后会经过12秒进入到low  energy的状态。因此对于典型的3G设备,每一次数据传输的会话都会引起无线电波都会持续消耗大概20秒的能量。
  • 实际上,这意味着一个app传递1秒钟的unbundled data会使得无线电波持续活动18秒[18=1秒的传输数据+5秒过渡时间回到low power+12秒过渡时间回到standby]。因此每一分钟,它会消耗18秒high power的电量,42秒的low power的电量。
  • 通过比较,如果每分钟app会传输bundle的data持续3秒的话,其中会使得无线电波持续在high power状态仅仅8秒钟,在low power状态仅仅12秒钟。
  • 上面第二种传输bundle data的例子,可以看到减少了大量的电量消耗。图示如下:


Prefetch Data[预取数据]

  • 预取(Prefetching)数据是一种减少独立数据传输会话数量的有效方法。预取技术允许你在单次操作的时候,通过一次连接,在最大能力下,根据给出的时间下载到所有的数据。
  • 通过前面的传输数据的技术,你减少了大量的无线电波激活时间。这样的话,不仅仅是保存了电量,也提高了潜在风险[看下面讲解],降低了带宽,减少了下载时间。
  • 预取技术提供了一种提高用户体验的方法,通过减少可能因为下载时间过长而导致预览后者后续操作等待漫长。
  • 然而,使用预取技术过于频繁,不仅仅会导致电量消耗快速增长,还有可能预取到一些并不需要的数据[比如预取了10秒,用户在第3秒就已经切换掉,这个时候预取过多的就是浪费]。同样,确保app不会因为等待预取全部完成而卡到程序的开始播放也是非常重要的。从实践的角度,那意味着需要逐步处理数据,并且按照有优先级的顺序开始进行数据传递,这样能确保不卡到程序的开始播放的同时数据也能够得到持续的下载。
  • 那么应该如何控制预取的操作呢?这需要根据正在下载的数据大小与可能被用到的数据量来决定。一个基于上面状态机情况的比较大概的建议是:对于数据来说,大概有50%的机会可能用在当前用户的会话中,那么我们可以预取大约6秒(大约1-2Mb),这大概使得潜在可能要用的数据量与可能已经下载好的数据量相一致。
  • 通常来说,预取1-5Mb会比较好,这种情况下,我们仅仅只需要每隔2-5分钟开始另一段下载。[3G网络是这样吗?]根据这个原理,大数据的下载,比如视频文件,应该每隔2-5秒开始另一段下载,这样能有效的预取到下面几分钟内的数据进行预览。
  • 值得注意的是,下载需要是bundled的形式,而且上面那些大概的数据与时间可能会根据网络连接的类型与速度有所变化,这些都将在下面两部分内容讲到。
  • 让我们来看一些例子:
  1. A music player:
    • 你可以选择预取整个专辑,然而这样用户在第一首歌曲之后停止监听,那么就浪费了大量的带宽于电量。
    • 一个比较好的方法是维护一首歌曲的缓冲区。对于流媒体音乐,不应该去维护一段连续的数据流,因为这样会使得无线电波一直保持激活状态,应该考虑把HTTP的数据流集中一次传输到音频流,就像上面描述的预取技术一样(下载好2Mb,然后开始一次取出,再去下载下面的2Mb)。
  2. A news reader:
    • 许多news apps尝试通过只下载新闻标题来减少带宽,完整的文章仅在用户想要读取的时候再去读取,而且文章也会因为太长而刚开始只显示部分信息,等用户下滑时再去读取完整信息。
    • 使用这个方法,无线电波仅仅会在用户点击更多信息的时候才会被激活。但是,在切换文章分类预阅读文章的时候仍然会造成大量潜在的消耗。[因为无线电波有几十秒的过渡期]
    • 一个比较好的方法是在启动的时候预取一个合理数量的数据,比如在启动的时候预取一些文章的标题[免得切换分类时又去获取这个栏目下的头条]与缩略图信息。之后开始获取剩余的标题预缩略信息。
    • 另一个方法是预取所有的标题,缩略信息,文章文字,甚至是所有文章的图片-根据既设的后台程序进行逐一获取。这样做的风险是花费了大量的带宽与电量去下载一些不会阅读到的内容,因此这需要比较小心思考是否合适。其中的一个解决方案是,当在连接至Wi-Fi时有计划的下载所有的内容,并且如果有可能最好是设备正在充电的时候。关于这个的细节的实现,我们将在后面的课程中涉及到。[这让我想起了网易新闻的离线下载,在连接到Wi-Fi的时候,可以选择下载所有的内容到本地,之后直接打开阅读]

Batch Transfers and Connections[批量传输与连接]

  • 使用典型3G无线网络制式的时候,每一次初始化一个连接(与需要传输的数据量无关),你都有可能导致无线电波持续花费大约20秒的电量。
  • 一个app,若是每20秒进行一次ping server的操作,假设这个app是正在运行且对用户可见,那么这会导致无线电波不确定什么时候被开启,最终可能使得电量花费在没有实际传输数据的情况下。
  • 因此,对数据进行bundle操作并且创建一个序列来存放这些bundle好的数据就显的非常重要。操作正确的话,可以使得大量的数据集中进行发送,这样使得无线电波的激活时间尽可能的少,同时减少大部分电量的花费。这样做的潜在好处是尽可能在每次传输数据的会话中尽可能多的传输数据而且减少了会话的次数。
  • 例如:新闻客户端可以分析用户的使用行为习惯,根据这些习惯来做决定如何获取数据,获取多少,什么时候获取等。在这个例子中,所有收集到的用户习惯应该捆绑一起,之后再一起进行发送,而不是每次点击的行为都去发送这个碎片数据。[这让我想到目前做的一个项目里面应该可以考虑使用这种机制的,现在采取的方法太傻大粗了],同时,发送这些数据不应该在下载一个全图或者执行例行更新的时候去操作。

Reduce Connections[减少连接次数]

  • 重用已经存在的网络连接比起重新建立一个新的连接通常来说是更有效率的。重用网络连接同样可以使得在拥挤不堪的网络环境中进行更加智能的互动。当可以捆绑所有请求在一个GET里面的时候不要同时创建多个网络连接或者把多个GET请求进行串联。
  • 例如,可以一起请求所有文章的情况下,不要根据多个栏目进行多次请求。无线电波会在等待接受返回信息或者timeout信息之前保持激活状态,所以如果不需要的连接请立即关闭而不是等待他们timeout。
  • 之前说道,如果关闭一个连接过于及时,会导致后面再次请求时重新建立一个在Server与Client之间的连接,而我们说过要尽量避免建立重复的连接,那么有个有效的折中办法是不要立即关闭,而是在timeout之前关闭(即稍微晚点却又不至于到timeout)。

Use the DDMS Network Traffic Tool to Identify Areas of Concern[使用DDMS网络通信工具来检测关心的区域]

  • The Android DDMS (Dalvik Debug Monitor Server) 包含了一个查看网络使用详情的栏目来允许跟踪app的网络请求。使用这个工具,可以监测app是在何时,如何传输数据的,从而可以进行代码的优化。
  • 下图显示了传输少量的网络模型,可以看到每次差不多相隔15秒,这意味着可以通过预取技术或者批量上传来大幅提高效率。

  • 通过监测数据传输的频率与每次传输的数据量,可以查看出哪些位置应该进行优化,通常的,图中显示的短小的类似钉子形状的位置,可以进行与附近位置的请求进行做merge的动作。
  • 为了更好的检测出问题所在,Traffic Status API允许你使用TrafficStats.setThreadStatsTag()的方法标记数据传输发生在某个Thread里面,然后可以手动的使用tagSocket()进行标记到或者使用untagSocket()来取消标记,例如:
  1. <span style="font-family:'Microsoft YaHei';">TrafficStats.setThreadStatsTag(0xF00D);  
  2. TrafficStats.tagSocket(outputSocket);  
  3. // Transfer data using socket  
  4. TrafficStats.untagSocket(outputSocket);</span>  
  • Apache的HttpClientURLConnection库可以自动tag sockets使用当前getThreadStatusTag()的值。那些库在通过keep-alive pools循环的时候也会tag与untag sockets。
  1. <span style="font-family:'Microsoft YaHei';">TrafficStats.setThreadStatsTag(0xF00D);  
  2. try {  
  3.   // Make network request using HttpClient.execute()  
  4. finally {  
  5.   TrafficStats.clearThreadStatsTag();  
  6. }</span>  
  • Socket tagging 是在Android 4.0上才被支持的, 但是实际情况是仅仅会在运行Android 4.0.3 or higher的设备上才会显示.

后记:哇,这节课太长了,不过很值得我们学习并注意,Radio state machine,Prefetch,Bundle等,在实际项目中,可能很少有人注意到这些,这也是Google开设这一系列课程的价值所在,提高app的质量,用更少的资源做更多的事情。


android流量监控类TrafficStats讲解 最近无聊看了关于android流量监控方面的知识,发觉android在这方面做得很是全面,google已经将对于流量监控类TrafficStats都封装好了,非常容易上手,对于学习android开发的人来说,无疑是极大的利器。 先此声明:以下的例子大部分来自于网络(就是我学流量监控的候,在网上找的例子),但个人觉得,例子本身写得非常棒,所以自己稍作修改拿来摆上架~~~呵呵呵呵呵。 好了,废话 阅读详情

相关推荐

基于 Quest 摄像头数据开发的原理介绍【Unity Meta Quest MR 开发教程】

比如想在识别到的现实物体上叠加虚拟物体,需要知道这个现实物体在 Unity 的世界坐标下的哪个位置,是带有 x,y,z 三个轴的数据的。而 WebCamTexture 捕捉到的图像只是个 2D 的平面,没有三维世界的深度信息,我们通过物体识别算法识别到的物体坐标只是在这个 2D 平面上的一个屏幕坐标,可以理解为 Quest 拍摄了一张照片,我们识别到这张照片上的某个像素点为需要识别的现实物体的中心。是不是看起来比较复杂?Quest 的相机访问功能是在安卓的。

qq_46044366的博客 2075

Android Basic Training - 02】基本网络操作 [ Lesson 1 - 如何连接到网络的经典示例 ]...

Connecting to the Network [连接到网络] 这一课会演示如何实现一个简单的连接到网络的程序。它提供了一些你应该follow的最好示例,用来创建最简单的网络连接程序。 请注意,想要执行网络操作首先需要在程序的manifest文件中添加下面的permissions: &lt;uses-permission android:name="android....

mmdev 158

基于matlab的图像HOG特征提取算法仿真

方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 697

论文 - Learning both Weights and Connections for Efficient Neural Networks

Han Song的Deep Compression是模型压缩方面很重要的论文。在Deep Compression中,作者提出了三个步骤来进行模型压缩:剪枝,量化和霍夫曼编码。其中,剪枝对应的方法就是基于本文要总结的这篇论文:Learning both Weights and Connections for Efficient Neural Networks。在这篇论文中,作者介绍了如何在不...

行云 928

Android NDK开发详解连接性之排查网络问题

原生开发套件 (NDK) 是一套工具,使您能够在 Android 应用中使用 C 和 C++ 代码,并提供众多平台库,您可使用这些平台库管理原生 activity 和访问实体设备组件,例如传感器和触控输入。NDK 可能不适合大多数 Android 编程初学者,这些初学者只需使用 Java 代码和框架 API 开发应用

hnjzfwy的博客 229

Android Advanced Training - 05传输数据避免电量的浪费[Lesson 1 -无线电波如何影响网络操作]...

OptimizingDownloads for Efficient Network Access [用有效的网络访问来最优化下载] 也许使用无线电波(wireless radio)进行传输数据会是我们app最耗电的操作之一。所以为了最小化网络连接的电量消耗,懂得连接模式(connectivity model)会如何影响底层的音频硬件设备是至关重要的。 这节课介绍了无线电波状态机(...

mmdev 225

Android Advanced Training - 05传输数据避免电量的浪费[Lesson 0 - 章节概览]

Transferring Data Without Draining the Battery [传输数据不要浪费电量] Dependencies and prerequisites Android 2.0 (API Level 5) or higher You should also read Optimizing Battery Life ...

mmdev 141

Android Advanced Training - 05传输数据避免电量的浪费[Lesson 4 - 根据网络类型更改下载模式]...

Modifyingyour Download Patterns Based on the Connectivity Type [根据连接的网络类型来更改下载模式] 并不是所有的网络类型(Wi-Fi,3G,2G,etc)对电量的消耗是同等的。不仅仅Wi-Fi电波无线电波消耗的电量要少很多,而且不同的无线电波(3G,2G,LTE……)也存在使用不同电量的区别。 Use W...

mmdev 159

Optimizing Downloads for Efficient Network Access

Using the wireless radio to transfer data is potentially one of your app's most significant sources of battery drain. To minimize the battery drain associated with network activity, it's critical that...

移动开发记录 217

使用java下载东西如何优化下载网速

之前要从腾讯云上下载一批视频,然后老板让优化一下速度,我心里很无语。。。。我说这怎么搞?网速不行,这怪我?服务器次?这怪我?平均下载速度只有10M/S(实际上是自己知识面太浅) 经过一系列的操作后网速达到了40M/S的程度,在这里总结一下分享给大家。 首先优化下载速度要从以下几个个方面考虑。 1.网速是否榨干? 这个怎么测试呢?在服务器上开启一个测速软件,开启了自己的下载程序后,直接从服务器上下载一个大文件,已经下载不动了,或者网速极慢,这个就说明网速已被榨干,这个自然而然已经有瓶颈了,说明你网速太次,这里

水镜先生的博客 4450

性能优化之电量优化1-电量消耗的全过程分析

0 Google官方优化方案Android开发中的电量和内存优化 (Google开发者大会演讲PPT&视频) Android性能优化-电量优化1 概述设备忙着执行各种任务和各种复杂计算,秀自拍上传朋友圈图片、秀直播,设备硬件正在快速消耗电池电量来完成这些任务。很明显,你的任务处理的越复杂,电量就会消耗的越多和越快,一眨眼的功夫电量就消耗完了,用户的手机顿变成个累赘的砖头了,这候用户就会怀疑谁

chenliguan的博客 1973

基于Android手机的声波通信源代码

http://www.oschina.net/code/snippet_730666_25680 https://github.com/JesseGu/SinVoice

Dream It Possible 3766

网络数据下载优化:

网络数据下载优化:    //method1   NSURL      |scheme+host+path+parameters      |http://(1.2章)   NSURLRequest   NSURLRequest *request = [NSURLRequest requestWithURL:url];    NSURLResquest *response = ni

Summer493506332的专栏 506

Android应用后台网络管控机制

应用后台网络管控机制 概述 &amp;nbsp;&amp;nbsp;&amp;nbsp;在维护手管应用,经常遇到应用后台网络控制相关的问题,在解决这些问题的过程中,学习了下应用后台网络控制的流程以及一些日志的分析方法,现在把它总结一下,方便自己以及他人的学习。 网络管控流程 &amp;nbsp;&amp;nbsp;&amp;nbsp;对于后台网络管控主要的参者如下: com.meizu.safe:NetworkMa...

Leslie_Yu的博客 1万+

网络访问优化下载

利用有效网络访问优化下载 使用无线电波(wireless radio)进行数据传输可能是应用最耗电的操作之一。为了降低网络连接的电量消耗,清楚的理解连接模型(connectivity model)如何影响底层的无线通讯硬件设备,显得尤为重要。 这节课介绍了无线电波状态机(wireless radio state machine),并解释了应用的连接模型(connectivity model)是

xiangzhihong8的专栏 1409

Android开发调试必备 - 使用DDMS

原文地址 Android开发平台自带一个调试工具, 叫Dalvik Debug Monitor Server(简称DDMS). 这个工具提供了端口传输服务, 在当前连接的调试设备上截图, 设备的线程和堆(heap)信息, logcat信息, 进程状态信息 和 广播信息, 模拟目标机拨打电话和发送信息, 模拟位置数据等等.这篇文章将会适当的讨论DDMS的特点, 但不会详尽的介绍所有功能

Alex Tam 的专栏 1万+

使用ZEMAX仿真的几何像差

使用ZEMAX仿真的几何像差

上一篇: Android开发中的性能优化
下一篇: 【Android Advanced Training - 05】传输数据时避免电量的浪费[Lesson 2 - 调整定时更新的频率(C2DM与退避算法)]
WingSu
博客等级 码龄23年 1粉丝 17原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值